вставка массива в дБ - PullRequest
       11

вставка массива в дБ

1 голос
/ 28 марта 2010

Как лучше всего поместить массив (длиной 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') ....

Но, может быть, более быстрая версия?

Спасибо

Ответы [ 4 ]

3 голосов
/ 28 марта 2010

Ваше решение очень небезопасно, если имя и идентификатор могут быть изменены пользователями (возможно внедрение SQL). Я рекомендую использовать подготовленное заявление, чтобы ускорить процесс. В документации MySQL есть пример

1 голос
/ 28 марта 2010

Я никогда не использовал 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.         
    }
}

Как я уже сказал, я раньше не использовал MySql из C #, поэтому я не знаю, есть ли в классе MySqlParameter конструктор, который принимает имя параметра, но вы поняли идею.

0 голосов
/ 29 марта 2010

Я думаю, вам нужно использовать переменные связывания. MySQL, как и большинство других баз данных SQL, позволяет это делать, и это намного быстрее, чем создание и запуск 100 операторов вставки по одному.

Сначала prepare ваш оператор SQL, вставив ?, куда идут переменные связывания. Затем execute он использует массив, который содержит все значения для одной вставки.

Например,

$stmt = $db->prepare("insert into table values (?, ?)");
$array = array(1, 2);
$result = $db->execute($stmt, $array);
0 голосов
/ 29 марта 2010

Я чувствую, что вы можете сделать что-то вроде

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

И вставить все одним запросом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...