C# 使用命令参数的Web API未返回任何数据
用于查询oracle数据库的web API,该数据库接收字符串数组作为输入参数。我试图使用命令参数来避免SqL注入,但下面的代码不会抛出任何错误,但不会给出结果C# 使用命令参数的Web API未返回任何数据,c#,asp.net,asp.net-web-api,commandparameter,C#,Asp.net,Asp.net Web Api,Commandparameter,用于查询oracle数据库的web API,该数据库接收字符串数组作为输入参数。我试图使用命令参数来避免SqL注入,但下面的代码不会抛出任何错误,但不会给出结果 public class PDataController : ApiController { public HttpResponseMessage Getdetails([FromUri] string[] id) { List<OracleParameter> prms = new Lis
public class PDataController : ApiController
{
public HttpResponseMessage Getdetails([FromUri] string[] id)
{
List<OracleParameter> prms = new List<OracleParameter>();
string connStr = ConfigurationManager.ConnectionStrings["PDataConn"].ConnectionString;
using (OracleConnection dbconn = new OracleConnection(connStr))
{
var inconditions = id.Distinct().ToArray();
var srtcon = string.Join(",", inconditions);
DataSet userDataset = new Dataset();
var strQuer = @"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,
STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME
FROM STCD_PRIO_CATEGORY_DESCR
WHERE STCD_PRIO_CATEGORY_DESCR.STD_REF(";
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 = 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;
}
}
}
}
}
因为我现在正在给
strQuery = strQuery+ sb.ToString() + ")";
正在重复选择。但如果我给你
strQuery = sb.ToString() + ")";
而strQuery在调试时
SELECT \r\n STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, \r\n
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, \r\n
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE, \r\n
STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME \r\n
FROM \r\n
STCD_PRIO_CATEGORY_DESCR \r\n
WHERE \r\n
STCD_PRIO_CATEGORY_DESCR.STD_REF IN(:p0)
我得到的回报是
{"data":[]}
我是否应该将p0括在“”中,因为我们接收的输入是字符串数组
但是当我尝试在SQL developer中使用相同的ID时,我得到了记录。非常感谢您的帮助。通过与OP的聊天,OP在数组参数ID周围添加了单引号。从以这种方式格式化的查询字符串中接收到的值
http:// localhost:80/api/PData?id='JW217T_01'
这是一个试图传递字符串作为参数值的尝试
但是,如果使用参数并指定其数据类型(NVarChar2),则数据库引擎对该值了解得足够多,可以自行执行正确的引号,因此参数的值不应在其周围使用单引号
将查询字符串的格式更改为
http:// localhost:80/api/PData?id=JW217T_01
修复了问题您的
id
参数是什么?生成的sql查询在执行之前是什么样子的?ID是调用API时给出的字符串。生成的查询应该类似于Select*from STCD,其中STDREF IN('a001','a002')如果我们将API调用为http://local host:80/API/PData?id='a001'&I'd='a002'@steve No steve,那么我删除了strQuery,因为strQuery保存了整个查询语句,甚至sb也保存了整个查询,所以我删除了它。如果我运行strQuery=strQuery+sb.ToString()+”;它会给我一个错误,比如适配器中缺少paranthesis。填充(selectResults)语句您需要使用调试器,然后查看适配器中提交的查询文本的确切内容。填充并验证参数列表是否与参数占位符匹配。顺便说一句,你提到SQLite是令人困惑的。我们说的是Oracle,对吗?在初始查询文本中缺少IN
http:// localhost:80/api/PData?id=JW217T_01