【问题标题】:array insert in db数组插入数据库
【发布时间】:2010-03-28 19:31:43
【问题描述】:

如何最好地将数组(100 或更多长度)放入数据库(MySQL)中?

我不希望对数据库进行多次访问,因为它已如此加载。

所以我的解决方案如下:

string insert = "INSERT INTO programs (name, id) VALUES ";

        for(int i = 0; i < name.Length; i++)
        {
            if (i != 0)
            {
                insert = insert + ",(";
            }
            else
            {
                insert = insert + "(";
            }

            insert = insert + "'" + name[i] + "','" + id[i] + "'";

            insert = insert + ")";
        }

        //INSERT INTO programs (name, id) VALUES ('Peter','32'),('Rikko','343') ....

但也许是更快的版本?

谢谢

【问题讨论】:

  • 现在不是正式弃用构造 SQL 字符串了吗?

标签: c# sql mysql arrays


【解决方案1】:

如果用户可以更改名称和 ID(可能是 SQL 注入),那么您的解决方案将非常不安全。我建议使用准备好的语句来加快速度。 MySQL documentation中有一个例子

【讨论】:

  • 我尝试了您的示例,但出现错误:cmd.Parameters["@number"].Value = i;然后我输入: cmd.Parameters.Add(new MySqlParameter("?City", MySqlDbType.VarChar, 40)).Value = city;现在显示错误:参数“?City”已被定义。 Ant 只输入一个值。
【解决方案2】:

我以前从未使用过 MySql,也没有编译过它,但这就是我处理它的方式。

我会定义一个参数化的 sql 字符串。然后我会定义我的参数对象,打开连接,然后循环遍历数组,将值分配给参数对象并执行语句。

using(var connection = new MySqlConnection("your connection string"))
{
    using(var command = new MySqlCommand("INSERT INTO programs (name, id) VALUES (?name, ?id)", connection))
    {
        var nameParameter = new MySqlParameter("name");
        var idParameter = new MySqlParameter("id");

        command.Parameters.Add(nameParameter);
        command.Parameters.Add(idParameter);

        connection.Open();

        for(int i = 0; i < name.Length; i++)
        {
             nameParameter.Value = name[i];
             idParameter.Value = id[i];

             command.ExecuteNonQuery();             
        }

        connection.Close(); //Dispose being called by the using should close connection, but it doesn't hurt to close it here/sooner either.         
    }
}

就像我说的,我之前没有使用过 C# 中的 MySql,所以我不知道 MySqlParameter 类是否有一个接受参数名称的构造函数,但你明白了。

【讨论】:

    【解决方案3】:

    我觉得你可以做类似的事情

      INSERT INTO tbl_temp2 (fld_id)
      SELECT tbl_temp1.fld_order_id
      FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
    

    并通过一个查询插入所有内容

    【讨论】:

      【解决方案4】:

      我认为您需要使用绑定变量。 MySQL,就像大多数其他 SQL 数据库一样,确实允许这样做,而且它比一次创建和运行 100 个插入语句要快得多。

      首先prepare 你的SQL 语句,将? 放入绑定变量所在的位置。然后execute 它使用一个包含单个插入的所有值的数组。

      例如,

      $stmt = $db->prepare("insert into table values (?, ?)");
      $array = array(1, 2);
      $result = $db->execute($stmt, $array);
      

      【讨论】:

        猜你喜欢
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多