2012-03-27 61 views
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

不能使用參數替換Oracle中的表名和列名。從數據庫的角度使用參數化查詢的主要好處之一是Oracle可以解析查詢一次(生成查詢計劃等),然後用不同的參數值執行多次。如果表或列發生更改,則需要對查詢進行新的硬解析,以免它成爲綁定變量。

你能解釋一下你想解決的問題嗎?看起來很不尋常的是,你想要編寫能夠查詢任意表的任意列的代碼 - 這通常意味着你有許多不同的表來存儲相同的基本類型的數據,在這種情況下你通常會更好重新審視數據模型的規範化。如果你想確定一個特定的表名或列名是否可以安全地從SQL注入的角度傳遞給數據庫,你可以使用DBMS_ASSERT package,但是在那時你可能會更好地服務於查詢ALL_TAB_COLUMNS指定的表名和列名稱以查看數據庫中是否存在列AColumnToReturnAColumnToQueryATable

+0

重新訪問數據庫結構不是一個選項。在過去,我寫了「通用」查詢,我可以傳遞一個int並獲得一個字符串,反之亦然;它削減了不得不寫十一萬個查詢只有一堆。古怪,認可,但符合我的滿意。 – 2012-03-28 03:53:11

相關問題