2013-08-16 3 views
0

У меня есть этот код для вставки записей в Table Products.Можно ли повторно использовать код для обновления/вставки записей в многострочных таблицах из нескольких WinFoms

int insertRecordIntoProduct() 
{ 
    try 
    { 
     if (con.State == ConnectionState.Closed) 
     { 
      con.Open(); 
     } 
     string insQuery = "insert into product_details (prod_name,prod_desc,prod_status,start_date,end_date,ref_num,ror) "+ 
         "values(@p_name,@p_desc,@status,@sdate,@edate,@filenum,@ror)"; 

    SqlCommand insertCmd = new SqlCommand(insQuery, con); 

    insertCmd.Parameters.Clear(); 
    insertCmd.Parameters.AddWithValue("@p_name", txtProdName.Text); 
    insertCmd.Parameters.AddWithValue("@p_desc", txtProdDesc.Text); 

    insertCmd.Parameters.AddWithValue("@sdate", (StartDatePicker.Value.Date)); 
    insertCmd.Parameters.AddWithValue("@edate", (EndDatePicker.Value.Date)); 
    insertCmd.Parameters.AddWithValue("@filenum", txtBoxFileNum.Text); 

    int r= insertCmd.ExecuteNonQuery(); 
    return r; 
    } 
} 

Этот код работает нормально. Моя проблема в том, что у меня есть 10-12 wiforms, и каждая форма должна вставлять/обновлять запись в разных таблицах в одну базу данных. Теперь я хочу знать, что я могу использовать приведенный выше код каким-либо образом, чтобы вставить/обновить запись из различных форм, у которых нет другого. из TextBoxes (например, у моей формы CustomerDetail есть 15 текстовых полей, брокерская форма имеет 8 TexBoxes и т. д.), или я должен сделать то же самое для каждой формы (что занимает много времени). Также скажите мне, есть ли другая альтернатива, чтобы сделать это наилучшим образом.

+0

У всех есть одинаковые параметры для вставки? – Ehsan

+0

@ EhsanUllah - OP указал в своем вопросе, что формы имеют разные количества текстовых полей (которые, как представляется, используются в качестве параметров), поэтому я подозреваю, что ответ на ваш вопрос - нет. – Tim

+0

yea right Tim .. все имеют разные параметры .... – Vimdav

ответ

1

Один из способов сделать это - создать класс, который используется всеми формами, и в этом классе есть один метод, который вы можете использовать для обновлений/вставок и, возможно, для выбора (поскольку вы будете возвращаться данные).

Например:

public static class SqlHelper 
{ 

    public static int InsertUpdate(string connectionString, string sql, Dictionary<string, object> parameters) 
    { 

     int rows = 0; 

     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 

      sqlCommand cmd = new SqlCommand(sql, con); 
      cmd.CommandType = CommandType.Text; 

      foreach (string key in parameters.Keys) 
      { 
       cmd.Parameters.AddWithValue(key, parameters[key]); 
      } 

      rows = cmd.ExecuteNonQuery(); 
     } 

     return rows; 
    } 
} 

Что этот код делает принимает строковое значение для строки соединения, значение строки для команды SQL, и словарь, который имеет имя (имена) параметра в качестве ключа и соответствующее значение.

Затем он создает SqlConnection, создает команду и выполняет итерацию через словарь параметров и добавляет новый параметр в команду для каждого параметра в словаре.

Наконец, он выполняет запрос и возвращает затронутые строки.

Вы могли бы назвать этот метод следующим образом (на основании вашего кода примера):

int rowsAffected = 0; 

try 
{ 
    Dictionary<string, object>() params = new Dictionary(string, object>(); 
    params.Add("@p_name", txtProdName.Text); 
    params.Add("@p_desc", txtProdDesc.Text); 
    params.Add("@sdate", StartDatePicker.Value.Date); 
    params.Add("@edate", EndDatePicker.Value.Date); 
    params.Add("@filenum", txtBoxFileNum.Text); 

    string sql = "insert into product_details" +  
       "(prod_name,prod_desc,prod_status,"+ 
       "start_date,end_date,ref_num,ror) "+ 
       "values(@p_name,@p_desc,@status,@sdate,@edate,@filenum,@ror)"; 

    rowsAffected = SqlHelper.InsertUpdate(connectionString, sql, params); 
} 
catch (Exception ex) 
{ 
    // Do something with the error; 
} 

Я завернул вызов в попытке поймать блок, чтобы у вас есть способ обработки ошибки в базовом вызове методы , Словарь построен, строка sql построена, а затем rowsAffected присваивается значение, возвращаемое статическим вспомогательным методом (SqlHelper.InsertUpdate).

Если обнаружена ошибка, то ловится, и вы можете сделать что-то с ним (журнал его, окно сообщения, и т.д.)

Этот пример ожидает connectionString строку, которая будет уже заполнены (скорее всего, на уровне класса).

Поскольку словарь используется для передачи параметров, вам просто нужно создать новый словарь для каждого вызова с соответствующим количеством параметров в нем, чтобы он соответствовал команде SQL (обратите внимание, что в вашем примере с вашим кодом вы не У меня ничего нет для @ror, поэтому я не включил его).

Вы также можете добавить второй статический метод к классу SqlHelper для выбора данных - в этом случае вы могли бы возвращать DataTable, DataSet или SqlDataReader, в зависимости от того, что вы предпочли использовать - или даже один метод для каждого.

+0

спасибо @Tim. это то, чего я хочу. еще один думаю мы можем использовать общий список вместо словаря ..? – Vimdav

+0

@Vimdav - вы можете использовать «Список ', но вы потеряете гибкость - вам либо придется иметь два «Список » (один для имени параметра, один для значения параметра), или у вас будет явно использовать либо имя параметра, либо значение параметра, а затем вы потеряете возможность добавлять различное количество параметров (с их значениями) с помощью простого цикла foreach. Словарь намного лучше подходит для ваших нужд. – Tim

+0

ok @ Тогда я пойду с Словарем. – Vimdav

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

  • Нет связанных вопросов^_^