2009-02-18 68 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

相关问题