0

我不仅想用参数替换存储在列中的值,还想用表名、列名等替换,所以我尝试了这个:

    // Can get any string value based on any string key with this function
    public string GetValForKeyVal(string ATable, string AKeyVal, string AColumnToQuery, string AColumnToReturn) {
        String qry = "SELECT :ColOfInterest FROM :TableToQuery WHERE :KeyValColumn = :KeyVal";
        OracleCommand cmd = new OracleCommand(qry, con);
        cmd.CommandType = CommandType.Text;
        OracleParameter opColOfInterest = cmd.Parameters.Add("ColOfInterest", OracleDbType.Varchar2,
          AColumnToReturn, ParameterDirection.Input);
        OracleParameter opTableToQuery = cmd.Parameters.Add("TableToQuery", OracleDbType.Varchar2,
          ATable, ParameterDirection.Input);
        OracleParameter opKeyValColumn = cmd.Parameters.Add("KeyValColumn", OracleDbType.Varchar2,
          AColumnToQuery, ParameterDirection.Input);
        OracleParameter opKeyVal = cmd.Parameters.Add("KeyVal", OracleDbType.Varchar2,
          AKeyVal, ParameterDirection.Input);
        return cmd.ExecuteScalar().ToString();
    }

...但是得到,"ORA-00903 invalid table name"

因此,我尝试以 C# 方式进行操作:

    public string GetValForKeyVal(string ATable, string AKeyVal, string AColumnToQuery, string AColumnToReturn) {
        String qry = String.Format("SELECT {0} FROM {1} WHERE {2} = {3}", AColumnToReturn, ATable, AColumnToQuery, AKeyVal);
        OracleCommand cmd = new OracleCommand(qry, con);
        cmd.CommandType = CommandType.Text;
        return cmd.ExecuteScalar().ToString();
    }

...但那也失败了,事实上,"ORA-00904 "WHYAMINOTQUOTINGTHEDOT"."EXE": invalid identifier"

我是在吠叫错误的树,还是只是用错误的方法给猫切片?

在过去(Delphi),您可以通过将字符串封装在类似QueryStr(). 是否有类似的辅助功能C#/Oracle

4

1 回答 1

4

您不能使用参数来替换 Oracle 中的表名和列名。从数据库的角度来看,使用参数化查询的主要好处之一是 Oracle 可以解析一次查询(生成查询计划等),然后使用不同的参数值多次执行它。如果表或列发生更改,则需要对查询进行新的硬解析,因此它不符合成为绑定变量的条件。

你能解释一下你试图解决的问题吗?您想要编写可以查询任意表的任意列的代码似乎很不寻常——这通常意味着您有许多不同的表来存储相同的基本类型的数据,在这种情况下您通常会更好通过重新访问数据模型的规范化来提供服务。如果您想从 SQL 注入的角度确定特定的表名或列名是否可以安全地传递给数据库,您可以使用该DBMS_ASSERT,但此时您最好只查询ALL_TAB_COLUMNS指定的表名和列名查看数据库中是否实际存在列AColumnToReturnAColumnToQueryin ATable

于 2012-03-27T22:24:41.077 回答