2010-04-20 3 views
2

У меня есть таблица, которая имеет три поля, а именно LM_code, M_Name, Desc. LC_code - это автогенерированная строка Id, сохраняющая это обновление M_Name и Desc. Я использовал обычную команду обновления, значение передается во время выполнения, но поля не обновляются. Я надеюсь, что используя параметры oledb, поля могут быть обновлены.Как обновить таблицу с помощью параметров oledb?

Вот мой код.

public void Modify() 
{ 
    String query = "Update Master_Accounts set (M_Name='" + M_Name + "',Desc='" + Desc + "') where LM_code='" + LM_code + "'"; 
    DataManager.RunExecuteNonQuery(ConnectionString.Constr, query); 
} 

В классе DataManager выполняется строка запроса.

public static void RunExecuteNonQuery(string Constr, string query) 
{ 

    OleDbConnection myConnection = new OleDbConnection(Constr); 
    try 
    { 
     myConnection.Open(); 
     OleDbCommand myCommand = new OleDbCommand(query, myConnection); 
     myCommand.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     string Message = ex.Message; 
     throw ex; 
    } 

    finally 
    { 
     if (myConnection.State == ConnectionState.Open) 
      myConnection.Close(); 
    } 

} 

private void toolstModify_Click_1(object sender, EventArgs e) 
{ 
    txtamcode.Enabled = true; 
    jewellery.LM_code = txtamcode.Text; 
    jewellery.M_Name = txtaccname.Text; 
    jewellery.Desc = txtdesc.Text; 
    jewellery.Modify(); 
    MessageBox.Show("Data Updated Succesfully"); 

} 

ответ

5

Вы близки с остальной частью вашего соединения и такого, но, как вы обратите внимание, делая это с параметризованными запросами безопаснее от SQL-инъекций ...

// Some engines used named parameters, others may not... The "?" 
    // are "place-holders" for the ordinal position of parameters being added... 
    String MyQuery = "Update MyTable set SomeField = ?, AnotherField = ? " 
     + " where YourKeyField = ?"; 

    OleDbCommand MyUpdate = new OleDbCommand(MyQuery, YourConnection); 

    // Now, add the parameters in the same order as the "place-holders" are in above command 
    OleDbParameter NewParm = new OleDbParameter("ParmForSomeField", NewValueForSomeField); 
    NewParm.DbType = DbType.Int32; 
    // (or other data type, such as DbType.String, DbType.DateTime, etc) 
    MyUpdate.Parameters.Add(NewParm); 

    // Now, on to the next set of parameters... 
    NewParm = new OleDbParameter("ParmForAnotherField", NewValueForAnotherField); 
    NewParm.DbType = DbType.String; 
    MyUpdate.Parameters.Add(NewParm); 

    // finally the last one... 
    NewParm = new OleDbParameter("ParmForYourKeyField", CurrentKeyValue); 
    NewParm.DbType = DbType.Int32; 
    MyUpdate.Parameters.Add(NewParm); 



    // Now, you can do you 
    MyUpdate.ExecuteNonQuery(); 
+0

Спасибо, что это сработает. – sameer

16

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

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

Я использовал это, чтобы обновить простую базу данных Access в сетевой папке.

using (OleDbConnection conn = new OleDbConnection(connString)) 
{ 
     conn.Open(); 
     OleDbCommand cmd = conn.CreateCommand(); 

     for (int i = 0; i < Customers.Count; i++) 
     { 
      cmd.Parameters.Add(new OleDbParameter("@var1", Customer[i].Name)) 
      cmd.Parameters.Add(new OleDbParameter("@var2", Customer[i].PhoneNum)) 
      cmd.Parameters.Add(new OleDbParameter("@var3", Customer[i].ID)) 
      cmd.Parameters.Add(new OleDbParameter("@var4", Customer[i].Name)) 
      cmd.Parameters.Add(new OleDbParameter("@var5", Customer[i].PhoneNum)) 

      cmd.CommandText = "UPDATE Customers SET [email protected], [email protected]" + 
           "WHERE [email protected] AND (Name<>@var4 OR Phone<>@var5)"; 
      cmd.ExecuteNonQuery(); 
      cmd.Parameters.Clear(); 
     } 
} 

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

+2

Довольно уверен, что вы только что спасли меня еще час ... пытаясь понять, почему мое заявление о обновлении не работает ... – agrath

0

Просто, чтобы добавить к ответу RJB, малоизвестный факт, что OleDb фактически принимает именованные параметры. Вы просто должны объявить параметры в SQL.

См: low-bandwidth.blogspot.com.au/2013/12/positional-msaccess-oledb-parameters.html

Если вы не объявлять параметры в SQL, OLEDB использует чисто позиционную вставку параметров, и это не имеет значения, если имена параметров соответствуют SQL, или если используются параметры дважды в SQL - он просто пройдет и слепо заменит любые найденные параметры в SQL в порядке от начала до конца с переданными.

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

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