我正在尝试动态更新一组数据库表。我有两个变量;
table_name
& field_name
。它们由foreach
循环填充,循环遍历DataTable
。每次我们点击DataTable
中的新行时,名称都会分别更改。在此循环中,我创建了一个新的Oracle Connection,并尝试使用当前的table_name / field_name编写更新。但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;
答案 0 :(得分:2)
从sql语句的末尾删除分号。更改以下代码
string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where id = ':id' and :field_name is not null;";
到
string UpdateOraSQL = "UPDATE " +table_name+ " set :field_name = :field_name - (:mark_diff_oracle) where id = ':id' and :field_name is not null";
有关详细信息,请参阅以下链接
why the semicolon couldn't place in the CommandText of a OracleCommand when C#
如果问题仍未解决,那么如果您也发布整个异常消息可能会有所帮助。
答案 1 :(得分:2)
AFAIK,您无法使用参数来定义要更新的列。 AFAIK,您只能使用您想要设置的值的参数。
因此,您必须使用字符串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;
当然,你应该确保你添加到字符串的变量不包含任何有害语句。你应该对它们进行健全性检查 也许,您甚至可以验证tableName或已传递的fieldName是否是有效/现有的tableName / columnname。
答案 2 :(得分:1)
在SQL中,没有人说COLUMN <> NULL
。正确的语法是COLUMN IS NOT NULL
。