использование winforms для вставки данных в базу данных sql, недостаток частого открытия соединения - PullRequest
0 голосов
/ 31 марта 2011

Я занимаюсь разработкой клиентского приложения.

Это эффективный способ вставки данных несколько раз в таблицу sql с помощью одной кнопки:

private void button1_Click(object sender, EventArgs e)
{
    c.Open();
    string w = "insert into checkmultiuser(username) values (@username)";

    SqlCommand cmd = new SqlCommand(w, c);

    cmd.Parameters.Add("@username", SqlDbType.VarChar);
    cmd.Parameters["@username"].Value = textBox1.Text;
    //cmd.ExecuteNonQuery();
    cmd.ExecuteReader();
    c.Close();    
}

Что такоеего недостатки?Во-первых, при нажатии кнопки снова и снова соединение открывается и закрывается, что сильно влияет на скорость.

Ответы [ 5 ]

2 голосов
/ 31 марта 2011

Возможно, не делайте вставку базы данных для каждой записи, но сохраняйте каждую запись в наборе данных, а затем вставляйте их все сразу, в виде кнопки сохранения.

Для каждой записи сделайте следующее:

String s = textBox1.Text;

If ( *\Enter validation logic*\ )
{
  //Insert data into DataSet
}
else
{
  //Throw error for user.
}

Затем, когда вы будете готовы к фиксации в БД, вставьте каждый элемент из набора данных, аналогично примерам в других ответах здесь.

2 голосов
/ 31 марта 2011

Вы делаете правильный путь: посмотрите этот вопрос: закрыть соединение с базой данных после того, как я использую или нет? тоже.

0 голосов
/ 31 марта 2011

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

Если, однако, вы имеете дело с подпрограммой, которая будет соединяться с вашей базой данных, вы можете передать соединение, включив оператор using в качестве Mr.Килинг уже упоминался, и просто убедитесь, что он готов.

Вот еще один подход, который возвращает DataTable (поскольку ваше исходное сообщение отображало выполнение Data Reader):

public static DataTable UpdateRoutine(SQLConnection c, string value) {
  const string w = "insert into checkmultiuser(username) values (@username)";
  DataTable table = new DataTable();
  using(SQLCommand cmd = new SQLCommand(w, c)) {
    cmd.Parameters.Add("@username", SqlDbType.VarChar);
    cmd.Parameters["@username"].Value = value;
    try {
      if ((cmd.Connection.State & ConnectionState.Open) != ConnectionState.Open) {
        cmd.Connection.Open();
      }
      using (SqlDataReader r = cmd.ExecuteReader()) {
        table.Load(r);
      }
    }
    return table;
  } catch(SqlException err) { // I try to avoid catching a general exception.
    MessageBox.Show(err.Message, "SQL Error");
  }
  return null;
}
0 голосов
/ 31 марта 2011

С точки зрения управления ресурсами было бы лучше, если бы вы могли определить, сколько раз вам нужно вставить данные, а затем выполнить операцию одним нажатием кнопки, возможно, повторяя цикл до нужного количества вставок. Операции были завершены. Это означает, что вы не постоянно открываете и закрываете соединение при каждом нажатии кнопки, а вместо этого открываете его, выполняете запросы вставки и закрываете соединение.

Также я рекомендую вам реализовать свой код с помощью оператора «using», чтобы он автоматически обрабатывал удаление и освобождение ресурсов.

private void button1_Click(object sender, EventArgs e, string[] value)
{
      try
      {
           using(SQLConnection c = new SQLConnection(connectionString))  
           using(SQLCommand cmd = new SQLCommand(c))
           {
               c.Open();

               string w = "insert into checkmultiuser(username) values (@username)";

               cmd.CommandText = w;
               cmd.Parameters.Add("@username", SqlDbType.VarChar);    

               for(int i = 0; i < value.Length; i++)
               {
                   cmd.Parameters["@username"].Value = value[i];    
                   cmd.ExecuteReader();
               }
           }
        }
        catch(Exception e)
        {
             Console.WriteLine(e.Message);
        }
}

Если вы можете создать SQLConnection в методе, то это также позволит вам создать его в операторе using, снова заботясь об управлении и освобождении ресурсов.

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

Ссылка:

try-catch - MSDN

0 голосов
/ 31 марта 2011

Я бы открывал соединение один раз при открытии формы и использовал его повторно, пока форма не будет закрыта.

Что касается вставки записей, то у вас правильный код.

...