Как обновить таблицу, используя параметры oledb? - PullRequest
2 голосов
/ 20 апреля 2010

У меня есть таблица с тремя полями, а именно: LM_code, M_Name, Desc. LC_code - это автоматически сгенерированный идентификатор строки, сохраняя его, я обновляю M_Name и Desc. Я использовал обычную команду обновления, значение передается во время выполнения, но поля не обновляются. Я надеюсь, что с помощью параметров 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");

}

Ответы [ 3 ]

17 голосов
/ 11 августа 2012

Это раздражало меня, маленький чокнутый 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 Name=@var1, Phone=@var2" + 
                              "WHERE ID=@var3 AND (Name<>@var4 OR Phone<>@var5)";
            cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
       }
 }

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

5 голосов
/ 20 апреля 2010

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

    // 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 голосов
/ 28 декабря 2013

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

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

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

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

...