【问题标题】:Multiple Arrays as input parameters to the Web API多个数组作为 Web API 的输入参数
【发布时间】:2016-08-12 12:42:16
【问题描述】:

我们创建了通过接受查询参数数组并以 JSON 格式返回结果来查询 Oracle DB 的 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&amp;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&amp;id=yyy&amp;col=CATEGORY&amp;col=SESSION_NUMBER,仅返回列名 CATEGORY 和 SESSION_NUMBER {"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7}]}。这可以在这里完成吗,我不确定我们将如何动态选择列名,因为我们只是在variable 中提供查询。非常感谢任何帮助。

【问题讨论】:

  • 您的问题到底是什么?控制器动作上的参数怎么做?如何在 SQL 代码中做到这一点?如果它会工作?
  • @FrancisLord 如何选择作为输入参数传入Controller的列名
  • 是的。我了解我将如何将它们作为 OracleParameters 传递

标签: c# sql asp.net-mvc oracle asp.net-web-api


【解决方案1】:

由于您已经在发送到服务器的 SQL 字符串中指定了列名,因此您可以简单地在 C# 代码中编辑该字符串,就像将 id 添加到 where 条件一样。这实际上会更容易,因为您不需要将列名作为字符串包含在内。我在这里看到的唯一一件事是您正在使用别名来更改输出列的名称。如果有必要,我建议使用字典来存储(输出)列名与您需要添加的选择之间的关系。像这样的东西:

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

然后您可以使用它来创建 Select 字符串:

//'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 和所有内容。希望这就是你要找的原因! :-)

【讨论】:

  • 非常感谢。我知道 selectString 将所有列名连接在一起。只是与 strQuery 混淆,因为 where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(" 将持有 ID,我们将提供 selectString
  • 不太清楚你的问题是什么。你用过string.Format吗?快速解释:您在字符串中看到{0},您通常将要返回的列放在哪里?当您调用string.Format 时,它将用您之后提供的参数(按顺序)替换所有{#} 实例。在这种情况下,我告诉他用 selectString 的值替换 {0}
  • 好的,我现在知道了。我现在就试试。再次感谢
  • 效果很好。再次感谢。我只是在编辑一些东西。
  • 太棒了!感谢您的更正。我太习惯了 VS 自动完成 :)
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2017-11-06
  • 2020-10-29
相关资源
最近更新 更多