Сбой параметризованного обновления Oracle C# при ExecuteNonQuery

Я пытаюсь динамически обновлять набор таблиц базы данных. У меня есть две переменные; table_name и field_name. Они заполняются циклом foreach, который проходит через цикл DataTable. Каждый раз, когда мы попадаем в новую строку в DataTable, имена меняются соответственно. В этом цикле я создаю новое соединение с Oracle и пытаюсь записать обновление с текущим именем_таблицы/имя_поля. Но Oracle продолжает выдавать мне ошибку в моей команде ExcecuteNonQuery. Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: я переформатировал, чтобы включить параметры, все еще не работает. У кого-нибудь есть идеи о том, что я делаю неправильно?

foreach (DataRow fieldtable in setofTables.Tables[0].Rows)
{

    //do work                   
    table_name = fieldtable["table_name"].ToString().Trim();
    field_name = fieldtable["field_name"].ToString().Trim();

    MessageBox.Show(table_name + field_name);

    //create parameters

    OracleParameter fieldParamater = new OracleParameter("field_name", OracleDbType.Varchar2);
    OracleParameter diffParameter = new OracleParameter("mark_diff_oracle", OracleDbType.BinaryFloat);
    OracleParameter wellIdParameter = new OracleParameter("id", OracleDbType.Char);
    //wellIdParameter.Size = 10;

    //create oracle connection and open 
    OracleConnection OrclCon2 = new OracleConnection("Data Source=" + dbname + "; User Id=" + userid + ";Password=" + password1 + ";");
    OrclCon2.Open();

    //prepare sql to be passed to oracle 
    string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where  id = ':id' and :field_name is not null;";
    MessageBox.Show(UpdateOraSQL);   



    //create dommand
    OracleCommand UpdateDB = new OracleCommand(UpdateOraSQL, OrclCon2);
    UpdateDB.CommandType = CommandType.Text;
    //add parameters
    UpdateDB.Parameters.Clear();
    UpdateDB.Prepare();
    UpdateDB.Parameters.Add(fieldParamater).Value = field_name;
    UpdateDB.Parameters.Add(diffParameter).Value = mark_diff_oracle;
    UpdateDB.Parameters.Add(wellIdParameter).Value = id;

person user2004796    schedule 23.01.2013    source источник
comment
Ваш SQL не параметризован — вы пытаетесь внедрить значения непосредственно в SQL. Не делайте этого. Вместо этого используйте параметры.   -  person Jon Skeet    schedule 24.01.2013
comment
Какую ошибку вы получаете?   -  person Matt    schedule 24.01.2013
comment
... вместо этого используйте параметры - пример: msdn.microsoft.com/de-de /библиотека/4915w86f.aspx   -  person MUG4N    schedule 24.01.2013
comment
Большое спасибо, проблема, с которой я столкнулся с параметрами, заключается в включении моей переменной, содержащей имя таблицы. В строке параметра sql я могу вырваться из нее и добавить + table_name +? Я читал, что имя таблицы нельзя добавить в список параметров. Спасибо.   -  person user2004796    schedule 24.01.2013
comment
Можете ли вы действительно использовать параметры для столбцов names, а не для столбцов values?   -  person Andrew Morton    schedule 24.01.2013


Ответы (3)


Удалите точку с запятой в конце инструкции sql. Измените следующий код

string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where  id = ':id' and :field_name is not null;";

to

string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where  id = ':id' and :field_name is not null";

См. следующую ссылку для получения дополнительной информации

почему точка с запятой не может не размещать в CommandText OracleCommand, когда C#

Если проблема все еще не решена, может быть полезно опубликовать также все сообщение об исключении.

person Max    schedule 23.01.2013
comment
Это сработало! Мне удалось запустить исходный код, который представлял собой конкатенацию переменных и sql. Большое спасибо вам за вашу помощь и всем, кто внес свой вклад, я у вас в долгу! - person user2004796; 24.01.2013
comment
Этот метод имеет проблему внедрения SQL. - person Akira Chen; 31.07.2020

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

Итак, вам нужно будет создать запрос, используя строку concat:

string sql = "UPDATE " + tableName + " SET " + fieldName + " = :p_Value  WHERE id = :p_Id";

OracleCommand UpdateDB = new OracleCommand(sql, OrclCon2);

UpdateDB.Parameters.Add ("p_Value", ... ).Value = "foo";
UpdateDB.Parameters.Add ("p_Id", ...).Value = 4;

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

person Frederik Gheysels    schedule 23.01.2013
comment
Кроме того, следует проверить, соответствует ли имя столбца тому, что делается, если оно получено из пользовательского ввода. - person Andrew Morton; 24.01.2013

В SQL не говорят COLUMN <> NULL. Правильный синтаксис - COLUMN IS NOT NULL.

person James Curran    schedule 23.01.2013