2016-08-12 49 views
0

我們創建了Web API,它通過接受事件查詢參數數組並返回JSON格式的結果來查詢Oracle數據庫。將多個數組作爲Web API的輸入參數

public class TestQueryController : ApiController 
{ 
    public HttpResponseMessage Getdetails([FromUri] string[] id) 
    { 
    List<OracleParameter> prms = new List<OracleParameter>(); 
    string connStr = ConfigurationManager.ConnectionStrings["PDataConnection"].ConnectionString; 
    using (OracleConnection dbconn = new OracleConnection(connStr)) 
{ 
var inconditions = id.Distinct().ToArray(); 
var srtcon = string.Join(",", inconditions); 
DataSet userDataset = new DataSet(); 
var strQuery = @"SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, 
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, 
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE   
from STCD_PRIO_CATEGORY 
where STCD_PRIO_CATEGORY_DESCR.STD_REF IN("; 
StringBuilder sb = new StringBuilder(strQuery); 
for(int x = 0; x < inconditions.Length; x++) 
{ 
    sb.Append(":p" + x + ","); 
    OracleParameter p = new OracleParameter(":p" + x,OracleDbType.NVarchar2); 
    p.Value = inconditions[x]; 
    prms.Add(p); 
} 
if(sb.Length > 0) sb.Length--; 
strQuery = sb.ToString() + ")"; 
using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
{ 
selectCommand.Parameters.AddRange(prms.ToArray()); 
using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) 
{ 
    DataTable selectResults = new DataTable(); 
    adapter.Fill(selectResults); 
    var returnObject = new { data = selectResults }; 
    var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
    ContentDispositionHeaderValue contentDisposition = null; 
    if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition)) 
    { 
     response.Content.Headers.ContentDisposition = contentDisposition; 
    } 
    return response; 
    }}}}}} 

所以API調用就像https://localhost:4320/api/TestQuery?id=xxx&id=yyy,結果是{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00"}]} 我想補充一個輸入參數,現在到API,這將是列名這是在SELECT語句的陣列,所以API將只返回那些列。該API將爲https://localhost:4320/api/PData?id=xxx&id=yyy&col=CATEGORY&col=SESSION_NUMBER,僅返回列名CATEGORY和SESSION_NUMBER {"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7}]}。這可以在這裏完成,我不知道我們將如何動態選擇列名稱,因爲我們只是在variable中給出查詢。任何幫助是極大的讚賞。

+0

你的問題到底是什麼?如何做控制器操作的參數?如何在SQL代碼中做到這一點?如果它能起作用? –

+0

@FrancisLord如何選擇在Controller中傳遞的列名作爲輸入參數 – trx

+0

在SQL代碼中? –

回答

1

由於您已經指定了要發送到服務器的SQL字符串中的列名稱,因此您可以簡單地在C#代碼中編輯該字符串,方法與將條件添加到where條件類似。它實際上會更容易,因爲您不需要將字段名稱作爲字符串和全部。我在這裏看到的唯一的事情就是您正在使用別名來更改輸出列的名稱。如果這是必要的,我會建議使用字典來存儲(輸出)列名和您需要添加的選擇之間的關係。事情是這樣的:

var colDict = new Dictionnary<string, string>() { 
    {"CATEGORY", "STCD_PRIO_CATEGORY_DESCR.DESCR"}, 
    //... 
    {"SESSION_START_DATE", "Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE)"} 
} 

然後,你可以用它來創建選擇字符串:

//'columns' is the parameter from the query string 

List<string> selectionStrings = new List<string>(); 
foreach (string col in columns) 
{ 
    string selector = colDict[col]; 
    selectionStrings.Add(string.Format("{0} AS {1}", selector, col)); 
} 

string selectString = string.Join(', ', selectionStrings); 

然後,你可以將它放入您的實際的SQL字符串:

var strQuery = string.Format(
    @"SELECT {0}   
    from STCD_PRIO_CATEGORY 
    where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(", 
    selectString); 

然後你可以繼續使用正常的代碼來添加ID和全部。希望這就是你尋找的原因! :-)

+0

謝謝了。我明白,selectString將所有列名聯合在一起。剛剛與strQuery混淆爲'where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(「''將持有ID的whellxcatly,我們將給出selectString – trx

+1

不太確定你的問題是什麼。你有沒有使用'string.Format'?快速解釋:你在字符串中查看'{0}',當你調用'string.Format'時,你通常會把你想要返回的列放在哪裏?它會用你之後給出的參數替換所有的{{}}實例(按順序),在這種情況下,我告訴他用'selectString'的值替換'{0}' –

+0

好吧,我現在得到它了,現在再試一次,再次感謝 – trx

相關問題