当datagridview中的整数单元格中没有值时,使用vb.net的语法不正确?

时间:2013-12-02 13:03:33

标签: sql vb.net winforms datagridview

我有一个更新查询,它从vb.net中的datagridview获取值并更新数据库中的表。

在执行update语句时,很明显datagridview中的某些字段由于某些条件而不会被填充。当我执行update语句时,它会将错误提供为','附近的错误语法。继续我得到的查询。

updatestring = "update  pos_lti_dtl set item_code='" & X.Cells(4).Value & "',
description='" & X.Cells(5).Value & "',pack_sent=" & X.Cells(0).Value & ",
pack_received=" & X.Cells(2).Value & ",batch='" & X.Cells(6).Value & "',
expiry_date='" & X.Cells(7).Value & "',LOOSE_sent=" & X.Cells(2).Value & ",
LOOSE_received=" & X.Cells(3).Value & " where lti_no='" & transferno & "'"

我做了一些调试,在updatestring中发现了以下内容

update  pos_lti_dtl set item_code='IIII',
description='',pack_sent=12,pack_received=,
batch='KKKKK',expiry_date='1/1/1900',
LOOSE_sent=,LOOSE_received= where lti_no='LTI/11011/2013'

我有一些数字字段,有时可能没有值,而且我已将数字值包含在“”中作为常规,当这些字段没有值时会出现这样的错误,请提供帮助。

2 个答案:

答案 0 :(得分:1)

你必须像这样写

updatestring = "update  pos_lti_dtl set item_code='" & X.Cells(4).Value & "',
description='" & X.Cells(5).Value & "',pack_sent='" & X.Cells(0).Value & "',
pack_received=" & X.Cells(2).Value & ",
batch='" & X.Cells(6).Value & "',
expiry_date='" & X.Cells(7).Value & "',
LOOSE_sent='" & X.Cells(2).Value & "',
LOOSE_received='" & X.Cells(3).Value & "' where lti_no='" & transferno & "'"

因此在执行中它看起来像这样

update  pos_lti_dtl set item_code='IIII',
description='',pack_sent='12',pack_received='',
batch='KKKKK',expiry_date='1/1/1900',
LOOSE_sent='',LOOSE_received='' where lti_no='LTI/11011/2013'

你不能拥有columnname=然后什么都不能,它必须附在'之后。

LOOSE_sent=,失败

LOOSE_sent='',将有效

LOOSE_sent=1,将起作用,但如果没有传递整数值,则会失败。

修改

如果字段LOOSE_sentLOOSE_received为空,则必须将它们从查询中取出,如果它们在数据库中的数据类型为 integer。喜欢这个

updatestring = "update  pos_lti_dtl set item_code='" & X.Cells(4).Value & "',
description='" & X.Cells(5).Value & "',pack_sent='" & X.Cells(0).Value & "',
pack_received=" & X.Cells(2).Value & ",
batch='" & X.Cells(6).Value & "',
expiry_date='" & X.Cells(7).Value & "'
where lti_no='" & transferno & "'"

答案 1 :(得分:1)

仅将其用作字符串会给您带来很多问题。如果您希望获得接近100%的成功率,请使用sql变量。

    Dim ConString As String = "your connection"
    Dim conn As New SqlClient.SqlConnection(ConString)
    Dim cmd As New SqlClient.SqlCommand
    conn.Open()
    cmd.Connection = conn
    cmd.CommandType = CommandType.Text
    Dim sSQL = "UPDATE pos_lti_dtl SET "

    cmd.Parameters.Add("@item_code", SqlDbType.Int).Value = X.Cells(4).Value
    sSQL += "item_code = @item_code, "
    cmd.Parameters.Add("@description", SqlDbType.Int).Value = X.Cells(5).Value
    sSQL += "description=@description,"
    cmd.Parameters.Add("@pack_sent", SqlDbType.Int).Value = x.Cells(0).Value
    sSQL += "pack_sent=@pack_sent, "
    cmd.Parameters.Add("@pack_received", SqlDbType.Int).Value = X.Cells(2).Value
    sSQL += "pack_received=@pack_received, "
    cmd.Parameters.Add("@batch", SqlDbType.Int).Value = X.Cells(6).Value
    sSQL += "batch=@batch, "
    cmd.Parameters.Add("@expiry_date", SqlDbType.Int).Value = X.Cells(7).Value
    sSQL += "expiry_date=@expiry_date, "
    cmd.Parameters.Add("@LOOSE_sent", SqlDbType.Int).Value = X.Cells(2).Value
    sSQL += "LOOSE_sent=LOOSE_sent@, "
    cmd.Parameters.Add("@LOOSE_received", SqlDbType.Int).Value = X.Cells(3).Value
    sSQL += "LOOSE_received=@LOOSE_received "
    cmd.Parameters.Add("@lti_no", SqlDbType.Int).Value = transferno
    sSQL += "WHERE lti_no=@lti_no"

要打破上面的代码,我要做的是初始化我的命令字符串sSQL然后我在其上构建更多,因为我添加了更多的sql变量cmd.Parameters.Add
我先添加item_code作为sql变量添加它。我调用了这个变量@item_code并将其声明为整数'SqlDbType.Int'并赋值为'X.Cells(4).Value'

  

cmd.Parameters.Add(“@ item_code”,SqlDbType.Int).Value = X.Cells(4).Value

接下来我将它添加到sSQL

  

sSQL + =“item_code = @item_code,”

我添加了一些空格,以便更容易地查看字符串,如果有什么事情困扰以便于调试。

这将确保如果值为空,它仍将正确运行。