c# - 将 Guid 传递给存储过程会引发 Microsoft.Data.SqlClient.SqlException:“'@Id' 附近的语法不正确。”
问题描述
我有一个这样的存储过程:
CREATE PROCEDURE [Owner].GetById
@LanguageCode CHAR(5) = 'en-us',
@Id UNIQUEIDENTIFIER
AS
BEGIN
SELECT ...
WHERE LanguageCode = @LanguageCode
AND Id = @Id;
END
我正在尝试这样的事情来使用 Entity Framework Core 调用存储过程:
var param1 = new SqlParameter ("@LangaugeCode", "en-us");
var param2 = new SqlParameter ("@Id", System.Data.SqlDbType.UniqueIdentifier);
param2.Value = Guid.Parse("0ec0d169-0a4f-4458-a48b-729e1bb0fea9");
var context = new localContext(); // Auto-generated class for DB first approach
var manufacturers= context.Owner.FromSqlRaw($"EXEC Owner.GetById
@LanguageCode, @Id", param1, param2).ToList();
它抛出一个错误:
Microsoft.Data.SqlClient.SqlException:“'@Id' 附近的语法不正确。”
是因为 Guid 不能作为 UNIQUEIDENTIFIER 传递还是格式问题?
解决方案
我认为您需要以下之一:
var p1 = "en-us";
var p2 = Guid.Parse("0ec0d169-0a4f-4458-a48b-729e1bb0fea9");
var owners= context.Owner.FromSqlRaw(
"Owner.GetById {0}, {1}",
p1,
p2
}.ToList();
var owners= context.Owner.FromSqlInterpolated(
$"Owner.GetById {p1}, {p2}").ToList();