以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  关于参数化SQLCommand的一个问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=124305)

--  作者:czy66ds
--  发布时间:2018/9/4 10:25:00
--  关于参数化SQLCommand的一个问题

下面代码是对表T1循环,生成入库记录,运行正确:

For Each r In T1.Rows
    \'+++++++如果当前行条码已轮询过,则越过++++++++++
    If tms.Contains(r("条码"))= False Then
        tms.Add(r("条码"))
        \'+++++++添加入库记录+++++++++++++++++++++
        m = T1.Compute("sum(数量)","条码 = \'" & r("条码") & "\'") \'按条码汇总数量
        cmd.CommandText = " INSERT INTO  入库记录表 (条码,类型,来源,日期,店铺,编码,数量,备注)  " & _
        "VALUES(\'" & r("条码") & "\',\'" & TB1.VALUE & "\',\'" & ZY.value & "\',\'" & DTP.Value & "\',\'" & user.name & "\',\'" & bm & "\'," & m & ",\'" & TB2.VALUE & "\')"
        cmd.ExecuteNonQuery
    End If
Next

 

但是参数化SQLCommand后却只能保存一条入库记录,并报错“已添加了具有相同键项”,不知何故:

For Each r In T1.Rows
    \'+++++++如果当前行条码已轮询过,则越过++++++++++
    If tms.Contains(r("条码"))= False Then
        tms.Add(r("条码"))
        \'+++++++添加入库记录+++++++++++++++++++++
         cmd.CommandText = " INSERT INTO  入库记录表 (条码,类型,来源,日期,店铺,编码,数量,备注) VALUES(?,?,?,?,?,?,?,?,?)"
        cmd.Parameters.Add("@条码",r("条码"))
        cmd.Parameters.Add("@类型",TB1.VALUE)
        cmd.Parameters.Add("@来源",ZY.value)
        cmd.Parameters.Add("@日期",DTP.Value)
        cmd.Parameters.Add("@店铺",user.name)
        cmd.Parameters.Add("@编码",bm)
       cmd.Parameters.Add("@数量",m)
        cmd.Parameters.Add("@备注",TB2.VALUE)
        cmd.ExecuteNonQuery
    End If
Next

 


--  作者:有点甜
--  发布时间:2018/9/4 10:40:00
--  

循环里面,每次都要new一个sqlcommand才行的。

 

 


--  作者:有点蓝
--  发布时间:2018/9/4 11:37:00
--  
加一个cmd.Parameters.Clear

cmd.CommandText = " INSERT INTO  入库记录表 (条码,类型,来源,日期,店铺,编码,数量,备注) VALUES(?,?,?,?,?,?,?,?,?)"
For Each r In T1.Rows
    \'+++++++如果当前行条码已轮询过,则越过++++++++++
    If tms.Contains(r("条码"))= False Then
        tms.Add(r("条码"))
        \'+++++++添加入库记录+++++++++++++++++++++
        cmd.Parameters.Clear
        cmd.Parameters.Add("@条码",r("条码"))
        cmd.Parameters.Add("@类型",TB1.VALUE)
        cmd.Parameters.Add("@来源",ZY.value)
        cmd.Parameters.Add("@日期",DTP.Value)
        cmd.Parameters.Add("@店铺",user.name)
        cmd.Parameters.Add("@编码",bm)
        cmd.Parameters.Add("@数量",m)
        cmd.Parameters.Add("@备注",TB2.VALUE)
        cmd.ExecuteNonQuery
    End If
Next

--  作者:czy66ds
--  发布时间:2018/9/4 12:34:00
--  

谢谢

测试结果:

按3楼测试,还是只生成一条记录

按2楼测试,产生了足够的记录,但是最后报一条错误“索引超出了数组界限”,同时感到不方便:如果循环外还需要NEWcommand,需要另外定义。

总之,感到这个参数化command还不完善。


--  作者:有点甜
--  发布时间:2018/9/4 12:37:00
--  
回复4楼,2楼的方法,不可能有错。请认真测试。
--  作者:有点蓝
--  发布时间:2018/9/4 12:38:00
--  
3楼我测试没有问题。请上传实例说明
--  作者:czy66ds
--  发布时间:2018/9/5 11:08:00
--  

再次感谢2、3楼。测试通过。

之前按三楼的办法之所以只生成一条记录,原因在于

语句cmd.CommandText = " INSERT INTO  入库记录表 (条码,类型,来源,日期,店铺,编码,数量,备注) VALUES.....

写到循环体外,而循环体内还有其他cmd.CommandText语句。

将语句cmd.CommandText = " INSERT INTO  入库记录表 (条码,类型,来源,日期,店铺,编码,数量,备注)VALUES.....

写到循环体内就好了。