【问题标题】:Error converting data type varchar to numeric vb.net将数据类型 varchar 转换为数字 vb.net 时出错
【发布时间】:2014-06-09 18:22:11
【问题描述】:

当我尝试将数据插入数据库时​​,出现错误,称为“将数据类型 varchar 转换为数字时出错”

这是我的代码

objcon.DoExecute("INSERT INTO OrderItemF 
                  VALUES('" & dgOrder.Item("Item No", i).Value & "'
                         ,'"& dgOrder.Item("Item Type", i).Value & "'
                         ,'" & txtOdrNo.Text & "'
                         ,'" & dgOrder.Item("Unit Price", i).Value & "'
                         ,'" & dgOrder.Item("Quantity", i).Value & "'
                         ,'" & dgOrder.Item("Discount", i).Value & "'
                         ,'" & dgOrder.Item("Total Value", i).Value & 
                        "')"
                       )

我正在从名为 dgorder 的数据网格查看器中插入数据

【问题讨论】:

  • 这意味着某些列需要一个数字并且您正在传递文本 - txtOdrNo.Text 看起来可能是一个数字,使用 Convert.ToInteger 或 Integer.TryParse 转换它,具体取决于它是什么以及在哪里它来自。其他看起来像值,但您正在使用刻度将它们转换为字符串
  • 您最好放弃objcon.DoExecute 方法并使用SQL 参数通过SQL 查询传递值。
  • ...我怀疑您打开连接一次并保持打开状态。这不是推荐的方式;相反,打开连接,执行查询,关闭连接。
  • 我尝试将字符串转换为整数,但我仍然收到一条错误消息,提示“值不能为空。参数名称:字符串”这是我的覆盖 ('" & System.Int32.Parse(dgOrder .Item("总价值", i).Value) & "')

标签: sql vb.net winforms


【解决方案1】:

你的问题是当你这样做时

"'" & dgOrder.Item("Unit Price", i).Value & "'"

对于数字,您的查询将类似于 'value'。但是对于数字,您不需要单引号。所以你需要做的是删除你有数值的单引号。

这是你的数据库在抱怨 - “我期望整数,而你给了我一个字符串”

编辑

我的原始答案解决了您的插入问题。现在,您需要对null 值、数据中可能的单引号以及将文本转换为null 做更多的工作

dim itemNum as string = dgOrder.Item("Item No", i).Value ' assume it is string
itemNum  = If(string.IsNullOrEmpty(itemNum), "NULL", "'" & itemNum.Replace("'", "''") & "'") 

dim itemType as string = dgOrder.Item("Item Type", i).Value ' assume it is string
itemType = If(string.IsNullOrEmpty(itemType), "NULL", "'" & itemType.Replace("'", "''") & "'") 

dim orderNum as string = If(string.IsNullOrEmpty(txtOrdNo.Text), "NULL", "'" & itemType.Replace("'", "''") & "'") 

dim decVal as Decimal
dim intVal as Decimal
dim unitPrice as string = If(dgOrder.Item("Unit Price", i).Value, "") ' assume it is decimal
if Decimal.TryParse(unitPrice, decVal) Then
    Throw New Exception("Invalid Unit Price")
Else
   unitPrice = decVal.ToString()
End If                 

dim quantity as string = If(dgOrder.Item("Quantity", i).Value, "") ' assume it is integer
if Integer.TryParse(unitPrice, intcVal) Then
    Throw New Exception("Invalid Quantity")
Else
    quantity = intVal.ToString()
End If          

dim discount as string = If(dgOrder.Item("Discount", i).Value, "0") ' assume it is decimal
if Decimal.TryParse(discount, decVal) Then
    Throw New Exception("Invalid Discount")
Else
   discount = decVal.ToString()
   ' may need: discount = If(decVal = 0, "NULL", decVal.ToString())
End If 

dim total as string = If(dgOrder.Item("Total Value", i).Value, "") ' assume it is decimal
if Decimal.TryParse(total, decVal) Then
    Throw New Exception("Invalid Total Value")
Else
   total = decVal.ToString()
End If                          

dim sql as String = String.Format("INSERT INTO OrderItemF VALUES({0},{1},{2},{3},{4},{5},{6})",
    itemNum, itemType, orderNum, unitPrice, quantity, discount, total)

objcon.DoExecute(sql)

这更像是编程

【讨论】:

  • 我尝试删除单引号。它对我有用。但现在我收到另一条错误消息,提示“,”附近的语法无效
  • @Randz90 在objcon.DoExecute 上放置断点。一旦中断,请将您的声明 "INSERT INTO OrderItemF...." 复制到中间窗口 [当然,在前面使用 ?]。按回车。看看输出是什么。我怀疑您的专栏之一返回nothing。所以你需要使用if(<val>, <val if nothing>)。 <val if nothing> 应该是 "NULL"。但是,如果您的字段是字符串,则需要在 If() 中添加单引号。但首先让我们测试您的语句并发布它的输出。
  • @Randz90 我在你的插入上做了替换,我得到了这个:INSERT INTO OrderItemF VALUES('x','x','x','x','x','x','x')。这是一个有效的声明。因此,您可能没有正确删除引号,您的网格中有奇怪的价值。或者这不是由这种说法引起的?你需要先按照我在上一条评论中所说的去做。您现在得到的错误是关于格式错误的 sql 语句。所以,在修改之前你的陈述是好的,但 DB 抱怨了。现在你的说法很糟糕。
  • @Randz90 另一件事是网格中的字符串数据可能包含单引号'。那么这将导致此错误。你需要做val.Replace("'", "''") - 用2个单引号替换所有单引号。这就是为什么使用参数化查询是个好主意 - 您不必处理这些事情并在 DB 上获得更好的性能。
  • @T.S.我试图通过放置一个断点来运行查询。就像你在从数据网格传递的所有值都是字符串之前所说的那样。我如何将此字符串值转换为十进制。 '" & Decimal.parse(dgOrder.Item("Total Value", i).Value) & "' 这对我不起作用。你能帮我解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2014-10-08
相关资源
最近更新 更多