C# - Dapper/MySql - 如何 运行 带有用户定义变量的查询

C# - Dapper/MySql - How to run a query with user-defined variable

我一直在尝试 运行 此代码:

using System;
using Dapper;
using MySql.Data.MySqlClient;

namespace DapperTests
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MySqlConnection(@"mysql_connstr_here"))
            {
                var sql = @"
                    set @foo := (select count(*) from table1);
                    select table2.*, @foo from table2;";
                var result = db.Query(sql);
            }
            Console.ReadLine();
        }
    }
}

但我得到以下异常:

System.NullReferenceException: 'Object reference not set to an instance of an object.'
This exception was originally thrown at this call stack:
  MySql.Data.MySqlClient.MySqlConnection.Reader.set(MySql.Data.MySqlClient.MySqlDataReader)

我的第一个猜测是该变量被视为 SqlParameter,并且由于我没有向它传递任何参数,所以我的代码失败了。 有没有办法 运行 使用 Dapper 进行这样的查询?

您收到的 NullReferenceException 可能是因为您没有将 foo 定义为参数。

  using (var db = new MySqlConnection(@"mysql_connstr_here"))
  {
    var sql = dbConnection.QueryFirstOrDefault<int>(
      @" 
      select @foo;",
      new
      {
        foo = userAssignedVariable
      });
  }

或者您可以使用有效的 sql 变量声明编写 sql :

var sql = @"declare @foo int = 0; select @foo;";

注意:使用 Sql 服务器测试,而不是 MySql。我没用

我在 the Dapper documentation 中找到了这个:

In order to use Non-parameter SQL variables with MySql Connector, you have to add the following option to your connection string:

Allow User Variables=True

Make sure you don't provide Dapper with a property to map.

所以我需要做的就是 Allow User Variables=True 到连接字符串。成功了。