【问题标题】:System.Data.SqlClient.SqlException: 'Must declare the scalar variable "@Referans".'System.Data.SqlClient.SqlException:'必须声明标量变量“@Referans”。'
【发布时间】:2022-01-26 14:40:26
【问题描述】:

我正在尝试使用 Dapper 执行存储过程。我收到一个错误:

System.Data.SqlClient.SqlException: '必须声明标量变量“@Referans”。'

这是我的代码:

var dosyaDetaySql = @"exec TurkmenBeyannameDetaylar @Referans";
var dosyaDetay = conn.Query<TurkmenBeyannemeSabitleriDetay>(dosyaDetaySql, new { dosyaResult.REF }).ToList();

我尝试了 @"exec TurkmenBeyannameDetaylar '@Referans'";,但这也不起作用。如何更改它以使存储过程成功执行?

【问题讨论】:

  • 在您的问题中分享您的存储过程声明会很有帮助。您不必包含实现,但仅包含指定名称和参数的声明会很有用。

标签: c# dapper


【解决方案1】:

您传递的查询语法错误。应该是这样的:

var dosyaDetaySql = "exec TurkmenBeyannameDetaylar @Referans";
var dosyaDetay = conn
     .Query<TurkmenBeyannemeSabitleriDetay>(dosyaDetaySql, new { Referans = dosyaResult.REF})
     .ToList();

顺便说一句,您可能会遇到以这种方式声明的 DynamicParameters 的问题。相反,恕我直言,写成这样更容易:

var parameters = new DynamicParameters();
parameters.Add("@Referans", dosyaResult.REF);

var dosyaDetaySql = @"exec TurkmenBeyannameDetaylar @Referans";
var dosyaDetay = conn
    .Query<TurkmenBeyannemeSabitleriDetay>(dosyaDetaySql, parameters)
    .ToList();

PS:当参数名称错误时,它也会返回该错误。确保 SP 参数名称 (@Referans) 在添加参数的代码中匹配。

编辑:添加下面的示例只是为了解释为什么我添加了 DynamicParameters。您不需要它,但在某些情况下您可能会发现它更容易。自己决定。

void Main()
{
    var query = @"EXEC dbo.CustOrdersDetail @ID";
    var parameters = new {ID=10280};
    var result = GetResults<dynamic>(query, parameters);
    foreach (var order in result)
    {
        Console.WriteLine($"{order.ProductName}, {order.UnitPrice}, {order.Discount}, {order.ExtendedPrice}");
    }

    Console.WriteLine("=====================================");
    var parameters2 = new DynamicParameters();
    //parameters2.AddDynamicParams(new {ID=10280}); // not easy for everyone to write - I don't know why I think that way
    parameters2.Add("@ID", 10280, DbType.Int32);

    var result2 = GetResults_2<dynamic>(query, parameters2);
    foreach (var order in result2)
    {
        Console.WriteLine($"{order.ProductName}, {order.UnitPrice}, {order.Discount}, {order.ExtendedPrice}");
    }
}

private static IEnumerable<T> GetResults<T>(string query, object parameters = null)
{
    using (IDbConnection db = new SqlConnection(@"Server=.\SQLExpress2012;Database=Northwind;Trusted_Connection=true"))
    {
        return db.Query<T>(query, parameters);
    }
}

public static IEnumerable<T> GetResults_2<T>(string query, DynamicParameters parameters=null)
{
    using (IDbConnection db = new SqlConnection(@"Server=.\SQLExpress2012;Database=Northwind;Trusted_Connection=true"))
    {
        return db.Query<T>(query, parameters);
    }
}

两者的结果相同:

Guaraná Fantástica, 3.6000, 0, 43.2000
Pâté chinois, 19.2000, 0, 384.0000
Rhönbräu Klosterbier, 6.2000, 0, 186.0000
=====================================
Guaraná Fantástica, 3.6000, 0, 43.2000
Pâté chinois, 19.2000, 0, 384.0000
Rhönbräu Klosterbier, 6.2000, 0, 186.0000

【讨论】:

  • 我不明白你为什么提倡单独声明 DynamicParameters。这样做有什么好处?
  • 我明白你的意思,方法不能真正以方便的方式接受匿名参数。但是,可以声明一个实际类型,如var parameters = new TurkmenBeyannameDetaylarParameters { Referans = dosyaResult.REF };。抱歉,我无法聊天。公司防火墙阻止了 chat.stackoverflow.com。
  • @mason,我在聊天中写了太多 :) 你没看到。好的,但 DynamicParameters 已经可用,没有 TurkmenBeyannameDetaylarParameters。那个也不是匿名的。这就是我写它的原因。
  • 好吧,够公平的!感谢您的澄清,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
相关资源
最近更新 更多