首页 > 解决方案 > 将 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 传递还是格式问题?

标签: c#stored-proceduresentity-framework-core

解决方案


我认为您需要以下之一:

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

推荐阅读