关于不成功的值转换的ExecuteNonQuery方法中的异常

时间:2009-12-10 16:39:22

标签: c# sql vb.net exception executequery

我正在使用OleDbCommand.ExecuteNonQuery()将数据插入数据库:

ObjCommand = New OleDbCommand
ObjCommand.CommandType = CommandType.StoredProcedure
ObjCommand.CommandText = StrSQL

ObjCommand.Parameters.Add("field1", OleDbType.VarChar).Value = <something1>
ObjCommand.Parameters.Add("field", OleDbType.VarChar).Value = <something2>
(...)
(...)    
ObjCommand.Parameters.Add("field50", OleDbType.VarChar).Value = <something50>

ObjCommand.Connection = GetDBConnection(StrConnectionString)
ObjCommand.Connection.Open()


<some integer> = ObjCommand.ExecuteNonQuery()

并且转换异常仅显示在最后一行:

  

将数据类型varchar转换为smallint

时出错

我想知道这是否是正常行为,我怎么知道转换问题发生在哪里。

更新

ObjCommand.Parameters.Add("@IdMunFatoGerador", OleDbType.VarChar).Value 
                = ObjNFe.idMunFatoGerador

我发现这一行是通过评论每一行并取消注释一些,这个给了我上面说的例外。

ObjNFe.idMunFatoGerador是一个字符串,它给我“错误地将数据类型varchar转换为smallint”

5 个答案:

答案 0 :(得分:3)

这意味着查询的其中一个参数类型错误。也就是说,当您传递varchar时,smallint传递short

如果没有存储过程的定义,我们就无法猜出它是哪一个..

答案 1 :(得分:2)

作为varChar将存储过程作为存储过程的一个参数作为smallint在存储过程中键入。并且,在这种情况下,您传入的值不能由服务器隐式转换为整数值。查看存储过程定义,将lala或lulu键入为smallint。然后看看你发送它的实际值......

答案 2 :(得分:1)

如果您使用DataSet设计器,它将为您生成所有内容,您将收到编译器错误而不是运行时错误。将新DataSet添加到项目中,然后将Query添加到DataSet。

你最终得到这样的东西:

QueriesTableAdapter ta = new QueriesTableAdapter();
ta.Connection = myConnection;
ta.MySeveralParameterStoredProc(x0, x1, ..., xN);

答案 3 :(得分:1)

我猜你可以遍历参数集合并查看该值并查看它是否可以是数字(string.isnumeric)。使用debug.assert输出一个消息,该参数值太大而不能是一个小的int以及参数名。更好的是将参数类型设置为oledbtype.smallint,然后只查看它们。最终,您需要知道您的参数以及它们与底层SQL的对应关系。我只是通过正确键入我的参数来缩小搜索范围,然后确保我从未向命令对象传递任何不起作用的内容。 HTH。 可能的代码:

For each parameter as SqlParameter in mycommandobject.parameters
     if isnumeric(parameter.value) then
          debug.assert(convert.int32(parameter.value) <= 32,767,"This parameter could have an issue - " & parameter.parametername & " value = " & parameter.value) 
     end if

loop

我没有测试过代码,但我相信这会有效。

答案 4 :(得分:0)

我终于找到了它。

值的格式一切正常。 问题是:其中一个参数丢失了。我仍然没有完全理解它,但问题是缺少的参数(smallint)在下面的一个(varchar)中解释,因此我发现的错误是在第二个。

换句话说,字段~35缺失(哈哈)

所以问题是:在向程序安装命令时,请记住始终将字段按照确切的数量和顺序排列。 =)

谢谢你们!