как запустить пакетные запросы в sql ce? - PullRequest
0 голосов
/ 09 декабря 2011

например:

  StringBuilder query = new StringBuilder();

                    foreach (KeyValuePair<string, string> key in list)
                    {
                        string name = key.Key;
                        string emails = key.Value;
                        query.AppendFormat("insert into contacts(name, emails) values('{0}', '{1}');", name, emails);
                    }

   string queries = query.ToString(); //how to run it?

это возможно?

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Это не поддерживаемая функция в V3.5 компактной версии. Не уверен, изменился ли он в V4.

Открытие соединения / транзакции и зацикливание - ваш единственный выбор.

Извините, это плохие новости!

1 голос
/ 09 декабря 2011

Лучший вариант - начать транзакцию перед циклом, выполнить каждый оператор, а не добавлять его в stringbuilder, и фиксировать после цикла (или каждого n числа записей).

Кроме того, вы должны использовать параметризованную команду, что-то вроде:

SqlCeCommand oCommand = conn.CreateCommand();
oCommand.CommandText = "insert into contacts(name, emails) values(?, ?)";
// I can't remember if the param names need @ or not
oCommand.Parameters.Add("@name", SqlDbType.VarChar);
oCommand.Parameters.Add("@email", SqlDbType.VarChar);

SqlCeTransaction oTrans = conn.BeginTransaction();
try {
  foreach (KeyValuePair<string, string> key in list) {
     oCommand.Parameters[0].Value = key.Key;
     oCommand.Parameters[1].Value = key.Value;
     oCommand.ExecuteNonQuery();
  }
  oTrans.Commit();
} catch (Exception ex) {
  oTrans.Rollback();
}

В качестве альтернативы, вы можете использовать SQL Compact Bulk Insert Library из codeplex. Я полагаю, что для этого используется TableDirect SqlCeCommand поверх SqlCeResultSet, который должен обходить процессор запросов и работать с максимальной скоростью.

...