2013-07-25 6 views
1

Мне нужно несколько советов о том, как это сделать лучше, я вставляю несколько запросов с использованием одного соединения.Несколько операторов вставки в одном соединении

Я понимаю, что это Неплохое программирование, особенно с учетом того, что он очень подвержен внедрению sql, я также хотел упомянуть, что он не будет доступен в Интернете, просто запускаться локально.

Это то, что я до сих пор ..

public partial class Modify : System.Web.UI.Page 
{ 
    OleDbConnection connection; 
    OleDbCommand command; 

    public void OpenConnection2() 
    { 
     connection = new OleDbConnection(""); 
     command = new OleDbCommand(); 
     connection.Open(); 
    } 

    protected void btnSave_Click1(object sender, EventArgs e) 
    { 
     if (AcctNumList.SelectedValue == "3") 
     { 
      string query2 = String.Format(@"INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}')", 
                  id, newguid, Name1TxtBox.Text.Replace("'", "''"), Amt1TxtBox.Text.Replace("'", "''"), 3, DateTime.Now.ToString()); 
      string query3 = String.Format(@"INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}')", 
                  id, newguid, Name2TxtBox.Text.Replace("'", "''"), Amt2TxtBox.Text.Replace("'", "''"), 3, DateTime.Now.ToString()); 
      string query4 = String.Format(@"INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}')", 
                  id, newguid, Name3TxtBox.Text.Replace("'", "''"), Amt3TxtBox.Text.Replace("'", "''"), 3, DateTime.Now.ToString()); 
      OpenConnection2(); 
      command.Connection = connection; 
      command.CommandText = query2; 
      int c = command.ExecuteNonQuery(); 
      connection.Close(); 
     } 
    if (AcctNumList.SelectedValue == "4") 
     { 
      string query2 = String.Format(@"INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}')", 
                  id, newguid, Name1TxtBox.Text.Replace("'", "''"), Amt1TxtBox.Text.Replace("'", "''"), 3, DateTime.Now.ToString()); 
      string query3 = String.Format(@"INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}')", 
                  id, newguid, Name2TxtBox.Text.Replace("'", "''"), Amt2TxtBox.Text.Replace("'", "''"), 3, DateTime.Now.ToString()); 
      string query4 = String.Format(@"INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}')", 
                  id, newguid, Name3TxtBox.Text.Replace("'", "''"), Amt3TxtBox.Text.Replace("'", "''"), 3, DateTime.Now.ToString()); 
      string query5 = String.Format(@"INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}')", 
                  id, newguid, Name4TxtBox.Text.Replace("'", "''"), Amt4TxtBox.Text.Replace("'", "''"), 3, DateTime.Now.ToString()); 
      OpenConnection2(); 
      command.Connection = connection; 
      command.CommandText = query2; 
      int c = command.ExecuteNonQuery(); 
      connection.Close(); 
     } 
+0

Другая часть, которая ** не хорошо **: 'DbConnections' и' DbCommands' должны быть созданы _and_ как можно скорее (внутри 'using (...)') - метод OpenConnection2 не должен существовать. –

+0

Выполняете ли вы эти запросы в базе данных MS Access? – Steve

+0

@kcray вместо отправки нескольких вызовов вы можете комбинировать свою вставку. см. мой ответ ниже – Ehsan

ответ

3

Вы должны параметрироваться запрос - ВСЕГДА, но теперь вы можете объединить эти запросы с ;, а затем выполнять их сразу, как:

string allQueries = string.join(';', query2, query3, query4, query5); 
command.CommandText = allQueries; 
int c = command.ExecuteNonQuery(); 

В настоящее время вы только выполнение одного запроса. Semicolon ; отмечает конец инструкции в SQL, поэтому объединение этих операторов с ; сделает их отдельными операторами, но они будут выполнены под одним выполнением.

kcray - Это то, что сработало для меня.

string[] arr = { query2, query3 }; 
string allQueries = string.Join(";", arr); 
command.CommandText = allQueries; 
int c = command.ExecuteNonQuery(); 
+0

У меня есть сильное чувство, что это против MS Access База данных. Нет множественной команды, если true – Steve

+0

@Habib Это Oledb не sql. Не будет работать в Оледбе. – Ehsan

+0

@ EhsanUllah и Стив, я не уверен в этом, я дам ему шанс и посмотрю, что произойдет. – Habib

2

Вы выполняете только Query2 не query3 и команда query4 текст

OpenConnection2(); 
command.Connection = connection; 

command.CommandText = query2; 
int c = command.ExecuteNonQuery(); 

command.CommandText = query3; 
c = command.ExecuteNonQuery(); 

command.CommandText = query4; 
c = command.ExecuteNonQuery(); 
connection.Close(); 

сказал это, на самом деле вы должны использовать параметры также, если у вас нет проблем с Sql Injection, потому что ваш код будет более понятным, и вам не нужно беспокоиться о синтаксическом анализе строк, чтобы заменить кавычки, подготовить правильную строку для поля datetime и использовать правильный символ десятичной точки для значений с плавающей запятой

Другая оптимизация - через using statement.
В этом случае ваш OpenConnection2 должен вернуть OleDbConnection создан и открыт, и нет необходимости использовать глобальный объект подключения (всегда плохая практика также с базами данных на основе файлов)

public OleDbConnection OpenConnection2() 
{ 
    OleDbConnection connection = new OleDbConnection(""); 
    connection.Open(); 
    return connection; 
} 

, а затем в своем коде вы сможете использовать используя заявление, которое обеспечит правильные и близко не отчуждать соединения, когда больше не нужно

using(OleDbConnection cn = OpenConnection2()) 
using(OleDbCommand command = new OleDbCommand()) 
{ 
    command.Connection = connection; 
    command.CommandText = query2; 
    int c = command.ExecuteNonQuery(); 

    command.CommandText = query3; 
    c = command.ExecuteNonQuery(); 

    command.CommandText = query4; 
    c = command.ExecuteNonQuery(); 
} // here the connection will be closed and disposed 

в последнюю ноте, если вы работаете эти запросы к базе данных MS Access, то вам необходимо выполнить их один за другим, потому что нет поддержки мультистатистическим т

0

СОЕДИНЯЙТЕ ваши инструкции SELECT, чтобы вставить несколько строк в одну и ту же таблицу.

INSERT INTO dbo.Products (ID, [Name]) 
SELECT 1, 'Car' 
UNION ALL 
SELECT 2, 'Boat' 
UNION ALL 
SELECT 3, 'Bike' 
0

Невозможно выполнить несколько запросов в OledbCommand. У вас есть 2 варианта здесь

  1. сделать хранимую процедуру
  2. называть их один за другим.

ИЛИ Как вы вставляете только один стол, чтобы в вашем случае если вы можете создать свой запрос, как это (просто пример)

INSERT INTO ACH (rptid, tableid, name, amount, stat, create_date) 
SELECT 1,1, 'Value3',2,2,DateTime.Now.ToString() 
UNION 
SELECT 1,1, 'Value3',2,2,DateTime.Now.ToString() 
UNION 
SELECT 1,1, 'Value3',2,2,DateTime.Now.ToString() 
UNION 
SELECT 1,1, 'Value3',2,2,DateTime.Now.ToString() 
+0

Я пробовал это, но когда я ввел идентификатор SELECT, newguid, Name1TxtBox.Text.Replace ("'" , "''"), Amt1TxtBox.Text, 3, DateTime.Now.ToString(); Я получаю всевозможные ошибки. Ему не нравятся эти ценности. – techora

Смежные вопросы