【问题标题】:How can I take each array item and insert in a SQL database?如何获取每个数组项并插入 SQL 数据库?
【发布时间】:2009-02-18 09:47:38
【问题描述】:

我有以下 vb.net 代码从网页上的文本框中取出值(实际上是空格分隔的标签),并用空格分隔符将它们拆分成一个数组。这正是我想要的。

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

我的问题是我不知道如何获取数组中的每个值,在此代码运行后,将它们作为单独的记录插入到表中。

我也不知道数组中有多少项。

【问题讨论】:

    标签: sql vb.net arrays


    【解决方案1】:

    正如 Ian 所说,这可能对 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 讨论有关参数使用的讨论。

    【讨论】:

    • 这种方法的问题是它的往返中心经常需要一个临时表。它可能非常脆弱。一旦你考虑到这一点,通常传递一个列表是一个更好的选择。
    • 视情况而定可能完全没问题
    • @ck 它只是设置了一个 prams 值来处理注入的东西,这里真的不需要 htmlencode
    • HtmlEncode 不会阻止 sql 注入,但它会阻止许多其他攻击,例如跨站点脚本攻击。使用参数将停止任何 sql 注入。
    • 但我同意 sambo99 在数据库中这样做是最好的选择
    【解决方案2】:

    这完全取决于性能要求和您使用的一般做法。 Rune 的回答可以很好。如果您要插入 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();
    

    然后对存储过程的一次调用可以将所有需要的行插入到 Tag 表中。

    对于 SQL 2005 及以下版本,我通常会为所有值使用单个逗号分隔的参数,并将其拆分到存储过程中的 TSQL 中。这往往表现得非常好,并避免与临时表混在一起。它也是安全的,但是您必须确保为 proc 使用文本输入参数,或者在代码中具有某种限制或批处理机制(因此您不会截断长列表)。

    有关如何在 TSQL 中拆分列表的想法,请查看 Erland 的 excellent article

    Sql 2000 版本的article is here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多