似乎没有要什么你的代码错误,除了一定的低效率。也许输入是空的,或者包含连续的分隔符?通过使用String.Split(Char(), StringSplitOptions)和StringSplitOptions.RemoveEmptyEntries
可以避免这种混淆,它将删除空条目。
如果您怀疑这个字符串中可能有多个分隔符,例如空格逗号,则可以在separators
阵列中添加更多分隔符。
正如其他人所评论的,您不应该在每次迭代中重建连接和命令。您的代码应更改为:
Dim separators() As String = {","}
Dim serialnumberlist = txtserial.Text.Split(separators,StringSplitOptions.RemoveEmptyEntries)
'update their branches
Dim constr As String = ConfigurationManager.ConnectionStrings("connectionstring").ConnectionString
Using con As New SqlConnection(constr)
Using cmd As New SqlCommand()
cmd.Connection = con
cmd.CommandText = "Update scratchcards set [email protected] where [email protected]"
cmd.Parameters.Add("@branches", SqlDbType.Int)
cmd.Parameters.Add("@serial", SqlDbType.NVarChar,30)
'At the moment of execution
cmd.Parameters("@branches").Value=ddlbranches.SelectedValue
con.Open()
For Each serial As String In serialnumberlist
cmd.Parameters("@serial").Value=serial
cmd.ExecuteNonQuery()
Next
End Using
End Using
Response.Write("<script>alert('Branches allocated successfully!');</script>")
只有参数值需要为每次迭代更改。 你不需要拆分为For Each
作品后打电话到.ToList()
任何的IEnumerable
您可以事先创建命令,甚至将其存储在现场进行再利用。每次执行只需要设置一个新的Connection
即可。
UPDATE
从评论,似乎对输入数据同时包含一个逗号和的空间,即PA/3/0000001740, PA/1/0000004583, PA/4/0000000095
。拆分此,隔板串,
应当使用,即:
Dim separators() As String = {", "}
如果有任何机会,一个柱可以开始withouth的空间中,separators
数组应该包含两个字符,即:
Dim separators() As String = {",", " "}
或
Dim separators() As String = {", ",","}
性能
最后,如果只执行一个查询,则可以实现此更新的最佳性能,即UPDATE ... WHERE Pin_Serial in (....)
。尽管这是有风险的,因为IN
表达式不能接受参数。如果序列号是数字,则可以验证输入并只加入密钥。尽管使用文本,但意想不到的值可能会产生问题。
在这种情况下,查询可以修改为使用table-valued parameter。这是多一点参与,虽然,需要在数据库中创建一个表类型:
CREATE TYPE dbo.PinTableType AS TABLE (Pin_Serial nvarchar(50))
一旦这样做虽然,循环可以成为一个单一的查询:
UPDATE scratchcards
set [email protected]
from scratchcards inner join @serialsTable on myTable.Pin_Serial=scratchcards.Pin_Serial
的@serialsTable
参数将有为DataTable
。我欺骗了一下,使用MoreLinq和ToDataTable():
cmd.CommandText = "UPDATE scratchcards
set [email protected]
from scratchcards inner join @serialsTable on myTable.Pin_Serial=scratchcards.Pin_Serial"
cmd.Parameters.Add("@branches", SqlDbType.Int)
cmd.Parameters.Add("@serialsTable",SqlDbType.Structured)
'At the moment of execution
cmd.Parameters("@branches").Value =ddlbranches.SelectedValue
Dim table as DataTable = serialnumberlist.ToDataTable()
cmd.Parameters("@serialsTable").Value=table
cmd.ExecuteNonQuery
什么当你调试它,即通过代码并观察变量? –
txtserial.Text看起来像什么..显示一个例子,它是真正的逗号分隔还是逗号空格。 –
而你真的不想在每个循环中保持打开和关闭状态...... –