我在使用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) " +
............
这与我的存储过程中的查询相同。
非常感谢你提前
答案 0 :(得分:1)
这里可能只有一些逻辑错误。以这一行为例:
new SqlParameter("@Phonecd",string.IsNullOrEmpty(areacode) ? (object)DBNull.Value : statecd),
您正在检查areacode
是否有值,如果有,您将该参数设置为statecd
,这似乎不正确。或者这个:
new SqlParameter("@State", string.IsNullOrEmpty(statecd) ? (object)DBNull.Value : "(" + areacode + ")%"),
您正在检查statecd
是否有值,然后将参数设置为使用areacode
组成的字符串。你可能只是因为你在错误的地方测试错误的东西而得到了你想不到的空值。
答案 1 :(得分:0)
使用不同的语法测试后,我能够使它工作。虽然看起来不太好看。 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();
非常感谢你看我的问题。