我们创建了Web API,通过接受查询参数数组并以JSON格式返回结果来查询Oracle DB。
Hello World.
Are we there yet?
Let's go home, now!
因此,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;
}}}}}}
类似,结果为https://localhost:4320/api/TestQuery?id=xxx&id=yyy
我想在API中再添加一个输入参数,它将是select语句中的列名数组,因此API将只返回那些列。 API将{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00"}]}
仅返回列名CATEGORY和SESSION_NUMBER https://localhost:4320/api/PData?id=xxx&id=yyy&col=CATEGORY&col=SESSION_NUMBER
。这可以在这里完成,我不知道我们将如何动态选择列名称,因为我们只是在{"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7}]}
中提供查询。非常感谢任何帮助。
答案 0 :(得分: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和所有内容。希望这就是你要找的原因! : - )