OracleCommand.ExecuteNonQuery() 抛出异常
本文关键字:抛出异常 ExecuteNonQuery OracleCommand | 更新日期: 2023-09-27 18:36:52
感谢您抽出宝贵时间查看并帮助我。 我用看似非常简单的插入操作让自己发疯,但我似乎无法通过这部分。 这是我对代码的内容:
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"类型字段请求日期和COMPLETION_DATE之外的所有工作。 我不知道我做错了什么,除了当它到达 ExecuteNonQuery() 调用时它会抛出异常。
如果有人有任何建议,将不胜感激。
我过去遇到过类似的问题。 使用 To_Date 函数将字符串转换为预言机可以识别的日期。
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");
对于您可能想要使用的日期字段OracleType.DateTime
并传递通过解析输入字符串生成的 DateTime 值,例如:
AddWithValue("CompletedBy", OracleType.DateTime).Value =
DateTime.ParseExact(...CompletedByTB.Text...);
除了乔上面所说的之外,我还注意到了几件事:-
a) 您正在打开一笔交易,但在出现任何异常时从不回滚。您可能希望将其与 try catch 语句括起来,并在发生异常时回滚事务,否则提交。
b) 您应该始终在连接对象周围使用 using 块(我刚刚在问题中编辑了您的代码)。这样,您就不必显式关闭和释放连接。这是因为所有连接提供程序类型(包括 OracleConnection)都通过其基类"DbConnection"实现 IDisposable 接口。