繁体   English   中英

MySQL SELECT INTO 变量,获取“命令执行期间遇到致命错误”。

[英]MySQL SELECT INTO Variable, Getting 'Fatal Error encountered during command execution.'

我从这里尝试了许多建议的解决方案,但似乎没有解决这个问题。 我只是在遇到“mdr = command.ExecuteReader();”时不断收到此错误消息线。 请问有什么想法吗?

 try
            {
                MySqlConnection connection = new MySqlConnection("SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";");
                MySqlCommand command;
                MySqlDataReader mdr;

                connection.Open();

                string ThePID = tbPID.Text;
                string TheRound = tbRound.Text;
                string CurrentPage = tbCurrentPage.Text;

               // SELECT @myvar:= myvalue

                string query = "SELECT ImageURL, ProofingText " +
                    "INTO @ImageURL, @ProofingText " +
                    "FROM Rounds " +
                    "WHERE ProjectID = " + ThePID + " " +
                    "AND CurrentRound = "  + TheRound + " " +
                    "AND Page = " + CurrentPage + ";";


                command = new MySqlCommand(query, connection);
                mdr = command.ExecuteReader();

                mdr.Read();

                rtProofing.Text = mdr.GetString("@PRoofingText");
                    tbURL.Text = mdr.GetString("@ImageURL");
                    tbImagePage.Text = Path.GetFileName(tbURL.Text);
                    PageBox.Image = Image.FromFile(tbURL.Text);

                    connection.Close();
                    connection.Dispose();
            }


            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }

如果您使用MySqlConnector ,您将收到解释问题的有用异常消息:

必须定义参数“@ImageURL”。 要将其用作变量,请在连接字符串中设置“Allow User Variables=true”。

默认情况下,MySQL 查询(从 .NET 执行)不能使用用户定义的变量。 您可以通过向连接字符串添加Allow User Variables=true来放宽此限制。

但是,这不会解决您的潜在问题,即这不是从 MySQL 中选择数据的正确方法。

首先,您的查询容易受到SQL 注入的影响 您应该将其重写为使用参数,如下所示:

using (var command = connection.CreateCommand())
{
    command.CommandText = @"SELECT ImageURL, ProofingText
        FROM Rounds
        WHERE ProjectID = @ThePID
        AND CurrentRound = @TheRound
        AND Page = @CurrentPage;";
    commands.Parameters.AddWithValue("@ThePID", ThePID);
    commands.Parameters.AddWithValue("@TheRound", TheRound);
    commands.Parameters.AddWithValue("@CurrentPage", CurrentPage);

然后,您可以检索对当前代码稍有变化的值。 您必须按列名检索值,列名没有前导@ 您还应该通过检查Read()的返回值来检查是否检索到了一行:

if (mdr.Read())
{
    rtProofing.Text = mdr.GetString("ProofingText");
    tbURL.Text = mdr.GetString("ImageURL");
}

最后,字符串连接也不是构建连接字符串的正确方法。 MySqlConnectionStringBuilder类就是为此目的而存在的; 用它。

var builder = new MySqlConnectionStringBuilder
{
    Server = server,
    Database = database,
    UserID = uid,
    Password = password,
};
using var connection = new MySqlConnection(csb.ConnectionString);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM