0

我正在使用 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 的错误”

4

5 回答 5

3

这意味着查询的参数之一是错误的类型。也就是说,varchar当您应该通过smallintshort在 c# 中)时,您正在通过。

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

于 2009-12-10T16:45:01.930 回答
2

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

于 2009-12-10T16:45:30.897 回答
1

如果您使用 DataSet 设计器,它将为您生成所有内容,并且您将收到编译器错误而不是运行时错误。向您的项目添加一个新的数据集,然后向数据集添加一个查询。

你最终会得到这样的结果:

QueriesTableAdapter ta = new QueriesTableAdapter();
ta.Connection = myConnection;
ta.MySeveralParameterStoredProc(x0, x1, ..., xN);
于 2009-12-10T17:27:57.537 回答
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

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

于 2009-12-10T17:55:31.553 回答
0

我终于找到了。

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

换句话说,field~35 不见了(哈哈)

所以问题是:在将命令安装到过程时,请记住始终将字段放在确切的数量和顺序中。=)

感谢你们!

于 2009-12-10T19:33:08.817 回答