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) " +
            ............

在我的存储过程中是相同的查询。

提前感谢您

EF SqlQuery总是将带空值的参数传递给具有多个参数需求的存储过程

这里可能有一些逻辑错误。以这一行为例:

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();

非常感谢你看我的问题