System.InvalidCastException: 'SqlParameterCollection 只接受非空的 SqlParameter 类型对象,不接受 SqlParameter 对象。

Muh*_*tab 9 c# asp.net sqlclient asp.net-core asp.net-core-3.0

我将我的项目从 ASP.NET Core 2.2 迁移到 ASP.NET Core 3.0。现在我得到了这个例外。在 ASP.NET Core 2.2 中,它使用FromSql(); 现在它正在使用FromSqlRaw(). 我正在使用 Entity Framework Core 调用我的过程。

SqlParameter Username = new SqlParameter
            {
                ParameterName = "USERNAME",
                SqlDbType = SqlDbType.NVarChar,
                Value = user.Username,
                Direction = ParameterDirection.Input,
                Size = 50
            };

SqlParameter Password = new SqlParameter
            {
                ParameterName = "PASSWORD",
                SqlDbType = SqlDbType.NVarChar,
                Value = user.Password,
                Direction = ParameterDirection.Input,
                Size = 50
            };

SqlParameter msgOut = new SqlParameter
            {
                ParameterName = "MSG",
                SqlDbType = SqlDbType.NVarChar,
                Direction = ParameterDirection.Output,
                Size = 1000
            };

SqlParameter statusOut = new SqlParameter
            {
                ParameterName = "STATUS",
                SqlDbType = SqlDbType.Int,
                Direction = ParameterDirection.Output
            };

var sql = @"EXEC PRC_USERS_LOGIN
                        @USERNAME, 
                        @PASSWORD, 
                        @MSG OUT, 
                        @STATUS OUT";

Users resultUser = new Users();
resultUser = ctx.Users.FromSqlRaw(sql, Username, Password, msgOut, statusOut)
                      .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

LRF*_*k01 25

通过将使用 System.Data.SqlClient 更改为使用 Microsoft.Data.SqlClient 来修复

https://github.com/aspnet/EntityFrameworkCore/issues/16812#issuecomment-516013245


Muh*_*tab 24

替换后此代码有效

System.Data.SqlClient.SqlParameter
Run Code Online (Sandbox Code Playgroud)

Microsoft.Data.SqlClient.SqlParameter
Run Code Online (Sandbox Code Playgroud)

FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

ToList();
Run Code Online (Sandbox Code Playgroud)

  • 您在这里回答的第一部分实际上是解决您的问题的内容,而不是“FirstOrDefault();”到“ToList();”。 (2认同)