Sql 将数据类型varchar转换为数值vb.net时出错

Sql 将数据类型varchar转换为数值vb.net时出错,sql,vb.net,winforms,Sql,Vb.net,Winforms,当我试图将数据插入数据库时,会出现一个名为“将数据类型varchar转换为数字时出错”的错误 这是我的密码 objcon.DoExecute("INSERT INTO OrderItemF VALUES('" & dgOrder.Item("Item No", i).Value & "' ,'"& dgOrder.Item("Item Type", i).Value & "'

当我试图将数据插入数据库时,会出现一个名为“将数据类型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的数据网格查看器插入数据,您的问题在于何时插入

"'" & dgOrder.Item("Unit Price", i).Value & "'"
对于数字,您的查询将类似于
'value'
。但对于数字,你不需要单引号。所以,您需要做的是删除具有数值的单引号

这是你的数据库——“我期望整数,你给我一个字符串”

编辑

我最初的回答解决了你的插入问题。现在,您需要对
null
值、数据中可能的单引号以及文本到
null

dim itemNum as string=dgOrder.Item(“Item No”,i).Value”假设为字符串
itemNum=If(string.IsNullOrEmpty(itemNum),“NULL”,“itemNum.Replace”(“,”)&“”)
dim itemType as string=dgOrder.Item(“项目类型”,i).Value'假定为字符串
itemType=If(string.IsNullOrEmpty(itemType)、“NULL”、“itemType.Replace”(“NULL”、“itemType”)&“NULL”)
dim orderNum as string=If(string.IsNullOrEmpty(txtOrdNo.Text)、“NULL”、“itemType.Replace”(“、”)&“替换”)
作为十进制的dim decVal
作为十进制的dim intVal
dim unitPrice as string=If(dgOrder.Item(“单价”,i).Value“”)假定为十进制
如果是Decimal.TryParse(单价,decVal),则
抛出新异常(“无效单价”)
其他的
单价=decVal.ToString()
如果结束
dim quantity as string=If(dgOrder.Item(“数量”,i).Value“”)假定为整数
如果是Integer.TryParse(单价,intcVal),那么
抛出新异常(“无效数量”)
其他的
数量=intVal.ToString()
如果结束
字符串形式的折扣=If(dgOrder.Item(“折扣”,i).Value,“0”)假定为十进制
如果是十进制.TryParse(折扣,decVal),则
抛出新异常(“无效折扣”)
其他的
折扣=decVal.ToString()
'可能需要:折扣=If(decVal=0,“NULL”,decVal.ToString())
如果结束
dim total as string=If(dgOrder.Item(“总值”,i).Value“”)假定为十进制
如果是Decimal.TryParse(total,decVal),则
抛出新异常(“无效的总值”)
其他的
总计=decVal.ToString()
如果结束
dim sql as String=String.Format(“插入OrderItemF值({0}、{1}、{2}、{3}、{4}、{5}、{6})”,
itemNum、itemType、orderNum、单价、数量、折扣、总计)
objcon.DoExecute(sql)

这更像是编程

它意味着某些列需要一个数字,而您正在传递文本-
txtOdrNo。文本
看起来可能是一个数字,请使用
convert.ToInteger
Integer.TryParse将其转换,具体取决于它是什么以及它来自何处。其他的看起来像值,但您正在使用ticksy将它们转换为字符串您最好放弃
objcon.DoExecute
方法,使用SQL参数在SQL查询中传递值……我怀疑您正在打开一次连接并保持其打开状态。这不是推荐的方法;相反,打开连接,执行查询,关闭连接。我尝试将字符串转换为整数,但仍然收到一个错误,提示“值不能为null。参数名称:字符串”这是我的转换(''”&System.Int32.Parse(dgOrder.Item(“总值”,I).value)&')我尝试删除单引号。这对我很有效。但现在我收到另一条错误消息,说“,”附近的语法无效,@Randz90在您的
objcon.DoExecute
上放置断点。一旦中断,将您的语句
“INSERT INTO OrderItemF…”
复制到中间窗口[当然,使用前面的
]。按回车键。看看输出是什么。我怀疑您的一列返回了
nothing
。因此,您需要使用
if(,)
<代码>
应为
“NULL”
。但是,如果字段是字符串,则需要在
if()
中添加单引号。但是让我们先测试一下您的语句并发布它的输出。@Randz90我对您的insert做了替换,得到了:
insert-INTO-OrderItemF值('x'、'x'、'x'、'x'、'x')
。这是一个有效的声明。所以,你,可能是没有正确删除引号,你有奇怪的价值走出你的网格。或者这不是由这句话引起的?你需要先按照我在前面的评论中说的做。您现在遇到的错误是关于格式错误的sql语句。所以,在修改之前,您的声明是可以的,但DB抱怨。现在您的语句是错误的。@Randz90另一件事是网格中的字符串数据可能有一个引号。那么这将导致此错误。您需要执行
val.Replace(“”,“”)
-将所有单引号替换为2个单引号。这就是为什么使用参数化查询是一个好主意-您不必处理这些问题,也不必在DB上获得更好的性能。@t.S.我试图通过设置断点来运行查询。正如您之前所说,从数据网格传递的所有值都是字符串。我如何将这些字符串值转换为十进制值。”“&Decimal.parse(dgOrder.Item(“总值”,i).Value)”和“&Decimal.parse”这对我不起作用。你能帮我查询一下吗?