【问题标题】:Can you use MySQL @ session variables in the C# connector?可以在 C# 连接器中使用 MySQL @ session 变量吗?
【发布时间】:2013-04-27 05:09:11
【问题描述】:

我有一个使用 MySQL 会话变量的查询(注意 @rank 变量)

SELECT Rank, UserId, CurrentVDOT
FROM
    (
        SELECT @rank := @rank + 1 AS Rank, UserId, MaxVDOT AS CurrentVDOT
        FROM
            (
                SELECT UserId, MAX(VDOT) AS MaxVDOT
                FROM
                    (
                        SELECT U.UserId, U.VDOT
                        FROM
                            (
                                SELECT UserId, MAX(Created) AS Created
                                FROM UserVDOT
                                GROUP BY UserId
                            ) G
                        INNER JOIN UserVDOT U
                        ON U.UserId = G.UserId
                            AND U.Created = G.Created
                    ) M
                GROUP BY UserId
                ORDER BY MaxVDOT DESC
            ) R, (SELECT @rank := 0) foo
    ) F
WHERE F.UserId = @UserId;

如果我尝试对 C# MySQL 连接器执行此操作,它会尝试告诉我需要将 @rank 声明为输入参数变量。

有没有办法解决这个问题?

谢谢。

【问题讨论】:

  • 通常,当使用“@something”时,C# 会认为您正在尝试创建 SqlParameter。还有另一种方法可以在 MySQL 中声明会话变量吗?更多信息here

标签: c# asp.net mysql mysql-connector


【解决方案1】:

你好艾莉森!

我最近遇到了同样的问题,但我发现默认情况下, SQL 连接禁止在查询中使用变量。解决 这个问题可以按如下方式启用连接字符串:

连接字符串:

server=192.168.0.0;password=root;User Id=root;Persist Security Info=True;database=my_db;Allow User Variables=True

您必须输入连接参数Allow User Variables=True才能使其工作。

希望我能帮上忙。

Hiago Takaki

【讨论】:

  • 太棒了!谢谢!
【解决方案2】:

如果您不想通过设置连接字符串来进行全局更改,还有另一种方法。

这可以通过用单引号 ' 将名称括起来来完成,如下所示。

SELECT Rank, UserId, CurrentVDOT
FROM
    (
        SELECT @'rank' := @'rank' + 1 AS Rank, UserId, MaxVDOT AS CurrentVDOT
        FROM
            (
                SELECT UserId, MAX(VDOT) AS MaxVDOT
                FROM
                    (
                        SELECT U.UserId, U.VDOT
                        FROM
                            (
                                SELECT UserId, MAX(Created) AS Created
                                FROM UserVDOT
                                GROUP BY UserId
                            ) G
                        INNER JOIN UserVDOT U
                        ON U.UserId = G.UserId
                            AND U.Created = G.Created
                    ) M
                GROUP BY UserId
                ORDER BY MaxVDOT DESC
            ) R, (SELECT @'rank' := 0) foo
    ) F
WHERE F.UserId = @UserId;

它现在将被视为会话变量。

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多