Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C参数化Oracle更新在ExecuteOnQuery上失败_C#_Oracle_Odp.net - Fatal编程技术网

C# C参数化Oracle更新在ExecuteOnQuery上失败

C# C参数化Oracle更新在ExecuteOnQuery上失败,c#,oracle,odp.net,C#,Oracle,Odp.net,我正在尝试动态更新一组数据库表。我有两个变量; 表名称和字段名称。它们由foreach循环填充,foreach循环通过数据表。每次我们在DataTable中找到新行时,名称都会分别更改。在这个循环中,我创建了一个新的Oracle连接,并尝试用当前的表名/字段名编写更新。但是甲骨文一直在我的EXECUTENONQUERY命令上给我一个错误。 非常感谢您的帮助 编辑:我已经重新格式化以包含参数,仍然不起作用。有人知道我做错了什么吗 foreach (DataRow fieldtable in set

我正在尝试动态更新一组数据库表。我有两个变量; 表名称和字段名称。它们由foreach循环填充,foreach循环通过数据表。每次我们在DataTable中找到新行时,名称都会分别更改。在这个循环中,我创建了一个新的Oracle连接,并尝试用当前的表名/字段名编写更新。但是甲骨文一直在我的EXECUTENONQUERY命令上给我一个错误。 非常感谢您的帮助

编辑:我已经重新格式化以包含参数,仍然不起作用。有人知道我做错了什么吗

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;

在SQL中,不能说列为NULL。正确的语法是COLUMN不为NULL。

在SQL中,不能说COLUMN为NULL。正确的语法是COLUMN NOT NULL。

从sql语句末尾删除分号。更改以下代码

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

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


如果问题仍然没有得到解决,那么也发布整个异常消息可能会有所帮助。

删除sql语句末尾的分号。更改以下代码

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

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


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

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;
当然,您应该确保添加到字符串中的变量不包含任何harmfull语句。你应该对他们进行精神检查。
也许,您甚至可以验证已传递的tableName或fieldName是否为有效/现有tableName/columnname。

好的,您不能使用参数定义要更新的列。 好的,您只能对要设置的值使用参数

因此,您必须使用字符串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;
当然,您应该确保添加到字符串中的变量不包含任何harmfull语句。你应该对他们进行精神检查。
也许,您甚至可以验证已传递的tableName或fieldName是否是有效的/现有的tableName/columnname。

您的SQL没有参数化-您正在尝试将值直接嵌入SQL中。不要那样做。改为使用参数。您得到了什么错误?。。。改为使用参数-示例:非常感谢,我在使用参数时遇到的问题是合并包含表名的变量。在参数sql字符串中,我可以将其拆分并添加+table_name+?我已经了解到无法将表名添加到参数列表中。谢谢。你真的能用参数来表示列名而不是列值吗?你的SQL不是参数化的-你是在试图将值直接嵌入SQL中。不要那样做。改为使用参数。您得到了什么错误?。。。改为使用参数-示例:非常感谢,我在使用参数时遇到的问题是合并包含表名的变量。在参数sql字符串中,我可以将其拆分并添加+table_name+?我已经了解到无法将表名添加到参数列表中。谢谢。你真的可以使用列名参数而不是列值吗?而且,如果列名来自用户输入,你应该检查列名对于正在执行的操作是否有效。如果列名来自用户输入,你还应该检查列名对于正在执行的操作是否有效。这很有效!我能够运行原始代码,它是变量和sql的串联。非常感谢你的帮助,感谢每一个为我做出贡献的人,我欠你的债!此方法存在SQL注入问题。此方法有效!我能够运行原始代码,它是变量和sql的串联。非常感谢你的帮助,感谢每一个为我做出贡献的人,我欠你的债!此方法存在SQL注入问题。