1

我正在尝试动态更新一组数据库表。我有两个变量; table_name& field_name. 这些由foreach循环填充,循环通过DataTable. DataTable每次我们在名称中分别更改新行时。在这个循环中,我创建了一个新的 Oracle 连接并尝试使用当前的 table_name/field_name 编写更新。但是甲骨文一直给我一个错误的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;
4

3 回答 3

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";

有关更多信息,请参阅以下链接

为什么在 C# 时分号不能放在 OracleCommand 的 CommandText 中

如果问题仍未解决,那么您也可以发布整个异常消息,这可能会有所帮助。

于 2013-01-23T21:19:10.610 回答
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。

于 2013-01-23T21:23:38.293 回答
1

在 SQL 中,没有说COLUMN <> NULL. 正确的语法是COLUMN IS NOT NULL.

于 2013-01-23T20:29:59.167 回答