似乎沒有要什麼你的代碼錯誤,除了一定的低效率。也許輸入是空的,或者包含連續的分隔符?通過使用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看起來像什麼..顯示一個例子,它是真正的逗號分隔還是逗號空格。 –
而你真的不想在每個循環中保持打開和關閉狀態...... –