![](/img/trans.png)
[英]OracleCommand.Executenonquery throws 'System.InvalidOperationException'
[英]OracleCommand.ExecuteNonQuery() throwing exception
感謝您花時間尋找並幫助我。 我正在用一個看起來非常簡單的插入操作來驅動自己,但我似乎無法通過這一部分。 這是我的代碼:
protected void InsertIntoMaterialDB()
{
ToroGeneral toro = new ToroGeneral();
// Grab connection string.
string conString = toro.GetOracle1ConnectionString();
string insertQuery = "INSERT INTO MATERIALMOVEREQUEST (ORIGINATOR, REQUESTDATE, PARTNUMBER, REQUESTQTY, MOVEFROM, MOVETO, COMPLETEDBY, COMPLETION_DATE, COMMENTS, RESPONSETIME) "
+ "values (:Originator, :RequestDate, :PartNumber, :RequestQty, :MoveFrom, :MoveTo, :CompletedBy, :CompletionDate, :ResponseTime, :Comments)";
using(OracleConnection conn1 = new OracleConnection(conString))
{
conn1.Open();
OracleCommand cmd = conn1.CreateCommand();
OracleTransaction myTrans;
cmd.CommandText = insertQuery;
myTrans = conn1.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = myTrans;
if (cmd.Connection.State == ConnectionState.Closed)
{
cmd.Connection.Open();
}
DateTime rDate = DateTime.Parse(RequestDateTB.Text);
DateTime cDate = DateTime.Parse(CompDateTB.Text);
cmd.Parameters.AddWithValue("Originator", OracleType.VarChar).Value = OriginatorTB.Text;
cmd.Parameters.AddWithValue("RequestDate", OracleType.DateTime).Value = rDate;
cmd.Parameters.AddWithValue("PartNumber", OracleType.VarChar).Value = PartNumber.Text;
cmd.Parameters.AddWithValue("RequestQty", OracleType.Number).Value = Convert.ToInt32(RequestQuantity.Text);
cmd.Parameters.AddWithValue("MoveFrom", OracleType.VarChar).Value = MoveFromTB.Text;
cmd.Parameters.AddWithValue("MoveTo", OracleType.VarChar).Value = MoveToTB.Text;
cmd.Parameters.AddWithValue("CompletedBy", OracleType.VarChar).Value = CompletedByTB.Text;
cmd.Parameters.AddWithValue("CompletionDate", OracleType.DateTime).Value = cDate;
cmd.Parameters.AddWithValue("ResponseTime", OracleType.Number).Value = Convert.ToInt32(RespTimeTB.Text);
cmd.Parameters.AddWithValue("Comments", OracleType.VarChar).Value = CommentsTB.Text;
cmd.ExecuteNonQuery(); // THIS THROWS AN EXCEPTION.
cmd.Transaction.Commit();
}
}
除了兩個'DATE'類型字段REQUESTDATE和COMPLETION_DATE之外,我能夠完成所有工作。 我不知道我做錯了什么,除了當它到達ExecuteNonQuery()調用它會拋出異常。
如果有人有任何建議,將非常感激。
我過去遇到過類似的問題。 使用To_Date函數將字符串轉換為oracle將識別的日期。
INSERT INTO MATERIALMOVEREQUEST (ORIGINATOR, REQUESTDATE, PARTNUMBER, REQUESTQTY, MOVEFROM, MOVETO, COMPLETEDBY, COMPLETION_DATE, COMMENTS, RESPONSETIME) "
+ "values (:Originator, To_Date(:RequestDate, 'YYYY-MM-DD-HH24:MI:SS'), :PartNumber, :RequestQty, :MoveFrom, :MoveTo, :CompletedBy, To_Date(:CompletionDate, 'YYYY-MM-DD-HH24:MI:SS'), :ResponseTime, :Comments)";
然后在您的參數中將值設置為字符串。
cmd.Parameters.AddWithValue("RequestDate", OracleType.VarChar).Value = rDate.ToString("yyyy-MM-dd-hh:mm:ss");
對於Date字段,您可能希望使用OracleType.DateTime
並傳遞通過解析輸入字符串生成的DateTime值,例如:
AddWithValue("CompletedBy", OracleType.DateTime).Value =
DateTime.ParseExact(...CompletedByTB.Text...);
除了Joe上面所說的,我還注意到了幾件事:
a)您正在打開一個事務,但在發生任何異常時永遠不會回滾它。 您可能希望使用try catch語句將其括起來,並在異常情況下回滾事務,否則提交。
b)你應該總是在連接對象周圍使用using塊(我剛剛在問題中編輯了你的代碼)。 這樣您就不必顯式關閉和處理連接。 這是因為所有連接提供程序類型(包括OracleConnection)都通過其基類“DbConnection”實現IDisposable接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.