C# 正在尝试创建某种通用的查询方法

C# 正在尝试创建某种通用的查询方法,c#,.net,sql,oracle,parameterized-query,C#,.net,Sql,Oracle,Parameterized Query,我不仅想用参数替换存储在列中的值,还想替换表名、列名等,所以我尝试了以下方法: // 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 =

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

    // 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无效表名”

所以,我试着用C#方式:

…但这也失败了,事实上,
“ORA-00904”WHYAMINOTQUOTINGTHEDOT“.EXE”:无效标识符“

我是不是找错了树,还是只是用错误的方法去剥猫的皮


在过去的
(Delphi)
中,您可以通过将字符串封装在类似
QueryStr()
的东西中,使其安全地传递到DB引擎。对于
C#/Oracle
,是否有类似的帮助函数?

在Oracle中,不能使用参数替换表名和列名。从数据库角度使用参数化查询的一个主要好处是,Oracle可以对查询进行一次解析(生成查询计划等),然后使用不同的参数值执行多次。如果表或列发生更改,则需要对查询进行新的硬解析,这样它就没有资格成为绑定变量


你能再解释一下你要解决的问题吗?您希望编写能够查询任意表的任意列的代码似乎很少见——这通常意味着您有许多不同的表存储相同基本类型的数据,在这种情况下,通过重新访问数据模型的规范化,您通常会得到更好的服务。如果要确定从SQL注入的角度将特定表名或列名传递到数据库是否安全,您可以使用,但此时您可能会得到更好的服务,只需查询指定表名和列名的
所有选项卡列
,查看数据库中
ATable
中是否确实存在列
acolumntore
acolumntquery

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


你能再解释一下你要解决的问题吗?您希望编写能够查询任意表的任意列的代码似乎很少见——这通常意味着您有许多不同的表存储相同基本类型的数据,在这种情况下,通过重新访问数据模型的规范化,您通常会得到更好的服务。如果要确定从SQL注入的角度将特定表名或列名传递到数据库是否安全,您可以使用,但在这一点上,只需查询指定表名和列名的
所有选项卡列
,查看数据库中是否存在
acolumntoreurn
acolumntquery
列。

重新访问数据库结构不是一个选项。在过去,我编写了“通用”查询,在这里我可以传递int并获取字符串,反之亦然;它减少了只需向一群人编写11个和11个查询的工作量。奇怪,是的,但我很满意。重新访问数据库结构不是一个选择。在过去,我编写了“通用”查询,在这里我可以传递int并获取字符串,反之亦然;它减少了只需向一群人编写11个和11个查询的工作量。怪怪的,没错,但我很满意。
    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();
    }