我使用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

我终于找到它。

这是一切确定与所述值的格式。 问题是:该参数之一不见了。我还是没有完全理解,但问题是,缺少的参数(SMALLINT)下面的一个(VARCHAR)的解释,所以我发现错误是第二个。

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

所以,事情是:安装命令的程序时,记得要始终把场的确切数量和顺序。 =)

感谢你们!

其他提示

这意味着,所述查询的所述参数中的一个是错误的类型。即要传递varchar当你应该传递smallintshort在c#)。

如果没有存储过程的定义没有办法我们可以推测它是哪一个..

一您考取存储过程为VARCHAR在存储过程中作为SMALLINT输入的参数。而且,在这种情况下你传递的价值不能隐服务器为整数值转换。看看存储过程的定义,无论是拉拉,或露露的类型为SMALLINT。然后看你发送它...实际值

如果您使用DataSet设计器,它会产生对你的一切,你会得到一个编译错误,而不是运行时错误。添加一个新的DataSet到您的项目然后添加一个查询到DataSet。

您最终的东西是这样的:

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

我想你可以遍历参数采集,并期待在价值,看它是否能够数字小(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

我还没有测试的代码,但相信这将正常工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top