首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OracleCommand.ExecuteNonQuery()抛出异常

OracleCommand.ExecuteNonQuery()抛出异常
EN

Stack Overflow用户
提问于 2012-06-13 01:07:03
回答 3查看 4.4K关注 0票数 1

感谢您抽出时间来查看并帮助我。看起来很简单的插入操作让我自己发疯,但我似乎不能通过这一部分。下面是我的代码:

代码语言:javascript
复制
 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()调用时抛出了一个异常。

如果有人有任何建议,我们将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-13 03:52:55

我以前也遇到过类似的问题。使用To_Date函数将字符串转换为oracle可以识别的日期。

代码语言:javascript
复制
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)";

然后在参数中将该值设置为字符串。

代码语言:javascript
复制
cmd.Parameters.AddWithValue("RequestDate", OracleType.VarChar).Value = rDate.ToString("yyyy-MM-dd-hh:mm:ss");
票数 2
EN

Stack Overflow用户

发布于 2012-06-13 01:21:26

对于日期字段,您可能希望使用OracleType.DateTime并传递通过解析输入字符串生成的DateTime值,例如:

代码语言:javascript
复制
AddWithValue("CompletedBy", OracleType.DateTime).Value = 
              DateTime.ParseExact(...CompletedByTB.Text...); 
票数 1
EN

Stack Overflow用户

发布于 2012-06-13 01:28:49

除了乔上面说的,我注意到了几件事:

a)您正在打开一个事务,但在任何异常的情况下都不会回滚它。您可能希望使用try catch语句来包含此语句,并在出现异常时回滚事务,否则使用commit。

b)您应该始终在connection对象周围使用using块(我刚刚编辑了问题中的代码)。这样,您就不必显式地关闭和处置连接。这是因为所有连接提供程序类型(包括OracleConnection)都通过它们的基类"DbConnection“实现IDisposable接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11001416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档