2017-02-10 31 views
0

我在我的文本框中有一组字符串,每个字符都用逗号分隔。我想拆分它们并更新分区中每个字符串的记录。在运行我的代码之后,它只更新第一个字符串,并保留其余部分。这是我的代码。拆分并更新数据库中的字符串

Dim serialnumberlist = Split(txtserial.Text, ",").ToList 
For Each serial As String In serialnumberlist 
    'update their branches 
    Dim constr As String = ConfigurationManager.ConnectionStrings("connectionstring").ConnectionString 

    Using con As New SqlConnection(constr) 
     con.Open() 
     Using cmd As New SqlCommand() 
      cmd.CommandText = "Update scratchcards set [email protected] where [email protected]" 
      cmd.Parameters.AddWithValue("@branches", ddlbranches.SelectedValue) 
      cmd.Parameters.AddWithValue("@serial", serial) 
      cmd.Connection = con 
      cmd.ExecuteNonQuery() 
     End Using 
    End Using 
Next 
Response.Write("<script>alert('Branches allocated successfully!');</script>") 
+3

什么当你调试它,即通过代码并观察变量? –

+0

txtserial.Text看起来像什么..显示一个例子,它是真正的逗号分隔还是逗号空格。 –

+0

而你真的不想在每个循环中保持打开和关闭状态...... –

回答

-1

请试试这个方法:

Dim serialnumberlist As String() = txtserial.Text.Split(","C) 
For Each item As String In serialnumberlist 
    Using con As New SqlConnection("") 
     Using cmd As New SqlCommand("Update scratchcards set [email protected] where [email protected]", con) 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.Parameters.AddWithValue("@branches", ddlbranches.SelectedValue) 
      cmd.Parameters.AddWithValue("@serial", item) 


      cmd.ExecuteNonQuery() 
     End Using 
    End Using 
Next 
+1

你改变了什么?这是如何回答这个问题的?仅有代码的答案对任何人都没有帮助。 –

3

似乎没有要什么你的代码错误,除了一定的低效率。也许输入是空的,或者包含连续的分隔符?通过使用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。我欺骗了一下,使用MoreLinqToDataTable()

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 
+0

对不起,你错过了信息..点击你自己的链接。 –

+0

@Trevor oops,你是对的。我**从来没有**使用拆分功能,因为我离开VB6在2003年。但是,我怀疑,禁止无效输入,清理后的代码将执行更好 –

+0

是的,原来是非常低效。我仍然怀疑它的逗号空格分隔文本,尽管...典型的错误。 –

0

正当我以为,这是逗号分隔的......无论是在分裂“”或更好,使用裁剪功能

Dim serialnumberlist = Split(txtserial.Text, ",").ToList 
For Each serial As String In serialnumberlist 
'update their branches 
Dim constr As String = ConfigurationManager.ConnectionStrings("connectionstring").ConnectionString 

Using con As New SqlConnection(constr) 
    con.Open() 
    Using cmd As New SqlCommand() 
     cmd.Connection = con 
     cmd.CommandText = "Update scratchcards set [email protected] where [email protected]" 
     cmd.Parameters.AddWithValue("@branches", ddlbranches.SelectedValue) 
     cmd.Paramaters.Add("@Serial", SqlDbType.Text) 
     For Each serial As String In serialnumberlist 
      cmd.Parameters("@Serial").Value = Trim(serial) '<--------HERE 
      cmd.ExecuteNonQuery() 
     Next  
    End Using 
End Using 

Response.Write("<script>alert('Branches allocated successfully!');</script>") 
+2

考虑使用'Add'而不是'AddWithValue'。 'AddWithValue'已折旧。 – Bugs

+1

@Bugs [AddWithValue](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v = vs.110).aspx)has * not * was deprecated,but 'Add(string,dbType)'更好。 – Plutonix

+0

@Plutonix是MySQL吗? – Bugs