2009-02-18 35 views
0

我有以下vb.net代碼從網頁上的文本框中取出數值(實際上是空格分隔的標籤),並用空格分隔符將它們分成數組。這工作正是我想要的。如何獲取每個數組項並插入到SQL數據庫中?

mySample.Tags = tagsTextBox.Text 
Dim tags As String = mySample.Tags 
Dim tagarray() As String 
Dim count As Integer 
tagarray = tags.Split(" ") 
For count = 0 To tagarray.Length - 1 
Next 

我的問題是,我不知道如何把每個值的數組,這個代碼運行後,將它們插入作爲表單獨的記錄。我也不知道該數組中有多少物品。

回答

1

正如伊恩所說,這對於Sql注射來說可能是可行的。至少你應該爲你想要插入的每個標籤做一個Server.HtmlEncode()。

要插入你的數據,你可以做到以下幾點:

using (SqlConncetion conn = new SqlConnection(connstring)) 
using (SqlCommand cmd = conn.CreateCommand()) 
{ 

    cmd.CommandText = "INSERT INTO table(tag) values (@tag)"; 
    cmd.Parameters.Add("@tag", SqlDbType.VarChar); 

    conn.Open(); 

    foreach(string tag in tags) 
    { 
    cmd.Parameters["@tag"].Value = Server.HtmlEncode(tag); 
    cmd.ExecuteNonQuery(); 
    } 
} 

這應能正常工作,但在存儲過程中做因爲你使用的參數,你應該對SQL注入安全。

另外,您應該參閱here以瞭解有關使用參數的討論。

+0

這種方法的問題在於其往返中心,並且經常需要臨時表。它可能非常脆弱。一旦你將這個因素考慮在內,通常將一個列表傳遞給更好的選項。 – 2009-02-18 10:12:38

0

這一切都取決於性能要求和您使用的一般做法。符文的答案可以很好。如果插入100,000行,請查看批量插入器。

如果你是用來編寫存儲的特效,你幸運地在運行SQL 2008,你可以使用table valued params

這允許你做這樣的東西:

SqlCommand cmd = new SqlCommand("usp_ins_Portfolio", conn); 
cmd.CommandType = CommandType.StoredProcedure; 
//add the ds here as a tvp 
SqlParameter sp = cmd.Parameters.AddWithValue("@Portfolio", ds.Tables[0]); 
//notice structured 
sp.SqlDbType = SqlDbType.Structured; 
cmd.ExecuteNonQuery(); 

然後,對存儲過程的單個調用可以將所有需要的行插入標籤表中。

對於SQL 2005及以下版本,我通常會對所有值使用單個逗號分隔參數,並將其分割到存儲過程中的TSQL中。這往往表現相當好,並避免與臨時表混在一起。它也是安全的,但你必須確保你使用proc的文本輸入參數,或者在代碼中使用某種限制或批處理機制(所以你不會截斷長列表)。

有關如何在TSQL中拆分列表的想法,請參閱Erland的excellent article

Sql 2000版的article is here

相關問題