【问题标题】:Exception on ExecuteNonQuery method about unsuccessful value convertionExecuteNonQuery 方法关于值转换不成功的异常
【发布时间】:2010-12-25 08:01:12
【问题描述】:

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

【问题讨论】:

  • Obs:不止两个参数,也有50多个。这是对我的代码的总结。
  • 50 个参数对于存储过程来说似乎是一个非常多的参数。这与答案无关,只是另一个问题。
  • 为什么我被否决了?这个问题已经解决了!
  • 我没有给你投反对票(虽然我觉得有必要),但我猜你投反对票的原因是因为这个问题没有明确表述,并且误导了那些花时间试图帮助你的人
  • @Marcelo,不要把它当成个人。没有人反对你,或者你是 SO 或编程的新手。只是问题通常会根据它们对其他人的帮助程度而被投票赞成/反对——仅此而已。当然,这里的一些人比其他人更快地使用反对票来表达他们的意见,但最终正面投票比负面投票更重要,即使是排名最高的成员也有他们的反对票。

标签: c# sql vb.net exception executequery


【解决方案1】:

这意味着查询的参数之一是错误的类型。也就是说,当您应该传递 smallint(c# 中的 short)时,您传递的是 varchar

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

【讨论】:

  • 这是一个例子..我没有只有两个,否则我不介意问一个方法来找到它在哪里。
【解决方案2】:

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

【讨论】:

  • 它不止两个..我只想知道哪个被错误传递而不必看到每个。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    我猜你可以遍历参数集合并查看值,看看它是否可以是数字(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
    

    我还没有测试过代码,但我相信这会起作用。

    【讨论】:

      【解决方案5】:

      我终于找到了。

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

      也就是说,field~35 不见了(哈哈)

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

      谢谢你们!

      【讨论】:

      • 可能是因为有人认为您可以计算 SQL 和 VB 代码中的参数,而不是创建问题。不,我没有投票给你,但我相信这就是原因。
      猜你喜欢
      • 2017-06-16
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      相关资源
      最近更新 更多