EF SqlQuery总是将带空值的参数传递给具有多个参数需求的存储过程
本文关键字:存储过程 需求 参数 参数传递 SqlQuery 空值 EF | 更新日期: 2023-09-27 18:05:17
我在使用具有存储过程及其多个所需参数的EF SqlQuery
时遇到问题。我到处看,我有写代码,因为如果我使用内联查询。它的工作原理。
下面是代码
string callSP = "ListDirectoryMember @Country,@Lastname,@State,@Phonecd,@City,@Spec,@Zip,@Language";
var Member = await _db.Database.SqlQuery<MemberInfo>(callSP,
//new object[]
//{
new SqlParameter("Lastname", string.IsNullOrEmpty(lname) ? (object)DBNull.Value : lname + "%"),
new SqlParameter("Phonecd",string.IsNullOrEmpty(areacode) ? (object)DBNull.Value : "(" + areacode + ")%"),
new SqlParameter("State", string.IsNullOrEmpty(statecd) ? (object)DBNull.Value : statecd ),
new SqlParameter("City",string.IsNullOrEmpty(city) ? (object)DBNull.Value : city),
new SqlParameter("Zip",string.IsNullOrEmpty(zip) ? (object)DBNull.Value : zip),
new SqlParameter("country",string.IsNullOrEmpty(country) ? (object)DBNull.Value : country),
new SqlParameter("Language",string.IsNullOrEmpty(language) ? (object)DBNull.Value : language),
new SqlParameter("Spec",string.IsNullOrEmpty(spec) ? (object)DBNull.Value : spec)
//}
).ToListAsync();
如果我使用内联查询,它可以工作,但是对于存储过程,结果就像我向所有参数传递空值一样,即使它有值。
我错过了什么?原因是我们的主数据库属于我们的供应商,所有对他们Oracle数据库的读写访问都是通过存储过程进行的。
我也使用了具有exec
关键字的存储过程-结果相同。没有过滤
string query = "Select col1,col2 from sometable where " +
"(mem.POSTAL_CD LIKE @zip or @zip is null) " +
"AND " +
"(mem.LAST_NM LIKE @LastName or @LastName is null) " +
"AND " +
"(mem.PHONENUM LIKE @PhoneCd or @PhoneCd is null) " +
............
在我的存储过程中是相同的查询。
提前感谢您
这里可能有一些逻辑错误。以这一行为例:
new SqlParameter("@Phonecd",string.IsNullOrEmpty(areacode) ? (object)DBNull.Value : statecd),
您正在检查areacode
是否有值,如果有,则将参数设置为statecd
,这似乎不正确。或者这个:
new SqlParameter("@State", string.IsNullOrEmpty(statecd) ? (object)DBNull.Value : "(" + areacode + ")%"),
检查statecd
是否有值,但随后将参数设置为使用areacode
组成的字符串。这是可能的,你只是得到空值,你不希望他们是,因为你在错误的地方测试错误的东西。
在用不同的语法测试之后,我能够使它工作。不过看起来不太好。sql注入可能在这里吗?
string callSP = "ListDirectoryMember @Country = {0},@Lastname = {1},@State = {2},@Phonecd = {3},@City = {4},@Spec = {5},@Zip = {6},@Language = {7}";
var Member = await _db.Database.SqlQuery<MemberInfo>(callSP,
string.IsNullOrEmpty(country) ? (object)DBNull.Value : country,
string.IsNullOrEmpty(lname) ? (object)DBNull.Value : lname + "%",
string.IsNullOrEmpty(statecd) ? (object)DBNull.Value : statecd,
string.IsNullOrEmpty(areacode) ? (object)DBNull.Value : "(" + areacode + ")%",
string.IsNullOrEmpty(city) ? (object)DBNull.Value : city,
string.IsNullOrEmpty(spec) ? (object)DBNull.Value : spec,
string.IsNullOrEmpty(zip) ? (object)DBNull.Value : zip,
string.IsNullOrEmpty(language) ? (object)DBNull.Value : language
).ToListAsync();
非常感谢你看我的问题