C# .NET Core 3中的ExecuteSqlRaw参数查询

C# .NET Core 3中的ExecuteSqlRaw参数查询,c#,parameters,.net-core-3.0,C#,Parameters,.net Core 3.0,我试图在C#中执行参数查询,代码如下: string sql = @"INSERT INTO [dbo].[ShoppingListShop] " + "([PlaceId], " + "[Name], " + "[Address], " +

我试图在C#中执行参数查询,代码如下:

string sql = @"INSERT INTO [dbo].[ShoppingListShop] " +
                                    "([PlaceId], " +
                                    "[Name], " +
                                    "[Address], " +
                                    "[Location], " +
                                    "[NorthEast], " +
                                    "[SouthWest], " +
                                    "[Date], " +
                                    "[LocationLat], " +
                                    "[LocationLng], " +
                                    "[NorthEastLat], " +
                                    "[NorthEastLng], " +
                                    "[SouthWestLat], " +
                                    "[SouthWestLng])" +
              "VALUES(" +
                                    "@placeId, " +
                                    "@name, " +
                                    "@address, " +
                                    "GEOGRAPHY::Point(@lat, @lng, 4326), " +
                                    "GEOGRAPHY::Point(@nelat, @nelng, 4326), " +
                                    "GEOGRAPHY::Point(@swlat, @swlng, 4326), " +
                                    "SYSDATETIMEOFFSET(), " +
                                    "@lat, " +
                                    "@lng, " +
                                    "@nelat, " +
                                    "@nelng, " +
                                    "@swlat, " +
                                    "@swlng);";

SqlParameter placeIdPrm = new SqlParameter("@placeId", SqlDbType.NVarChar);
SqlParameter namePrm = new SqlParameter("@name", SqlDbType.NVarChar);
SqlParameter addressPrm = new SqlParameter("@address", SqlDbType.NVarChar);
SqlParameter latPrm = new SqlParameter("@lat", SqlDbType.Decimal, 18);
SqlParameter lngPrm = new SqlParameter("@lng", SqlDbType.Decimal, 18);
SqlParameter neLatPrm = new SqlParameter("@nelat", SqlDbType.Decimal, 18);
SqlParameter neLngPrm = new SqlParameter("@nelng", SqlDbType.Decimal, 18);
SqlParameter swLatPrm = new SqlParameter("@swlat", SqlDbType.Decimal, 18);
SqlParameter swLngPrm = new SqlParameter("@swlng", SqlDbType.Decimal, 18);

placeIdPrm.Value = shop.PlaceId;
namePrm.Value = shop.Name;
addressPrm.Value = shop.Address;

latPrm.Value = shop.LocationLat;
lngPrm.Value = shop.LocationLng;

neLatPrm.Value = shop.NorthEastLat;
neLngPrm.Value = shop.NorthEastLng;

swLatPrm.Value = shop.SouthWestLat;
swLngPrm.Value = shop.SouthWestLng;

SqlParameter[] parametri = new SqlParameter[9] { placeIdPrm, namePrm, addressPrm, latPrm, lngPrm, neLatPrm, neLngPrm, swLatPrm, swLngPrm };

sqlServerDbContext.Database.ExecuteSqlRaw(sql, parametri);
出于某种原因,我得到了这个例外

SqlParameterCollection仅接受非空的SqlParameter类型对象,而不接受SqlParameter对象


我做错了什么?

这是一个基于错误消息的猜测,但是:您是否同时使用了
System.Data.SqlClient
Microsoft.Data.SqlClient
?i、 e.
sqlServerDbContext.Database.ExecuteSqlRaw
需要一个
System.Data.SqlClient.SqlParameter[]
(和实例),而您已经给它一个
Microsoft.Data.SqlClient.SqlParameter[]
(和实例)?(反之亦然)-尝试在
SqlParameter
上“转到定义”,看看它是从哪里来的。

提示:对您的SQL使用
@“逐字字符串文本”
——它可以有换行符,而不会导致无法读取不相关的内容,但使用“短小精悍”会更干净、更简单;我有偏见,但是:你可能想检查一下,至少不,我使用的是System.Data.SqlClient;SqlParameter是System.Data.SqlClient,但在ExecuteSqlRaw的“转到定义”中,我跳转到Microsoft。EntityFrameworkCore@FrancescoEntityFrameworkCore是否可能正在使用
Microsoft.Data.SqlClient
?也许是通过连接字符串?请尝试查看
sqlServerDbContext.Database.GetDbConnection().FullName
thaks如果您的建议正确,请让我尝试使用Microsoft.Data.SqlClient而不是System.Data.SqlClient作为SqlParameteryes,它可以工作,正如您之前建议的,我在另一篇文章中看到,实际上,解决方案包括删除对System.Data.SqlClient程序集的引用并替换名称空间。使用System.Data.SqlClient;=>使用Microsoft.Data.SqlClient@弗朗西斯科有时候,你可以在黑暗中射中一只公牛