正在尝试创建一个有点通用的查询方法
本文关键字:方法 查询 一个 创建 | 更新日期: 2023-09-27 18:29:23
我不仅想用参数替换存储在列中的值,还想用表名、列名等来替换,所以我尝试了这个:
// 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()
的东西中,使其可以安全地传递给DB引擎。C#/Oracle
是否有类似的辅助函数?
在Oracle中不能使用参数来替换表名和列名。从数据库角度使用参数化查询的主要好处之一是,Oracle可以解析查询一次(生成查询计划等),然后使用不同的参数值执行多次。如果表或列发生更改,则需要对查询进行新的硬解析,因此它将不符合绑定变量的条件。
你能再解释一下你想解决的问题吗?您想要编写可以查询任意表的任意列的代码,这似乎是不寻常的——这通常意味着您有许多不同的表存储相同的基本数据类型,在这种情况下,重新访问数据模型的规范化通常会更好地为您服务。如果您想从SQL注入的角度确定特定的表名或列名是否可以安全地传递到数据库,您可以使用DBMS_ASSERT
包,但此时您最好只查询ALL_TAB_COLUMNS
中指定的表名和列名,以查看数据库中ATable
中是否真的有列AColumnToReturn
和AColumnToQuery
。