2017-02-10 29 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