我正在使用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”
答案 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缺失(哈哈)
所以问题是:在向程序安装命令时,请记住始终将字段按照确切的数量和顺序排列。 =)
谢谢你们!