MySqlCommand.ExecuteNonQuery()未填充MySqlParameter(s)

时间:2013-04-17 11:49:55

标签: c# mysql

背景:我正在重写我的ASP.NET应用程序 - 目前它使用的是MS SQL数据库,但我还需要支持MySQL(两者同时进行!)。

大部分工作已经完成 - 我使用 MySQL Connector / Net 来处理来自C#(Visual Studio 2010)的MySQL数据库 - 但我遇到了某些SQL查询的麻烦。这是我需要执行的SQL查询:

"SELECT @username=username FROM t_Users WHERE id=@id"

这是我的代码:

public static int ExecuteSqlNonQuery(string i_szQuery)
{
    bool bConnectionWasOpen = false;
    AbstractConnection dbConnection = CMSSQLInstanceCreator.CreateConnection();            

    if(dbConnection.IsMySQL())
    {
        MySqlConnection aSqlConnection = dbConnection.GetMysConnection();
        try
        {
            if (aSqlConnection.State == System.Data.ConnectionState.Closed)
                aSqlConnection.Open();
            else
                if (aSqlConnection.State == System.Data.ConnectionState.Open)
                    bConnectionWasOpen = true;
                else
                    throw new ApplicationException("Connection not available!");

            List<MySqlParameter> aParameters1 = new List<MySqlParameter>();
            aParameters1.Add(new MySqlParameter("@username", MySqlDbType.VarString, 128));
            aParameters1.Add(new MySqlParameter("@id", MySqlDbType.Int32));
            aParameters1[0].Direction = System.Data.ParameterDirection.Output;                
            aParameters1[1].Direction = System.Data.ParameterDirection.Input;
            aParameters1[1].Value = (int)1;

            MySqlCommand aSqlCommand = new MySqlCommand(i_szQuery, aSqlConnection);
            aSqlCommand.CommandType = System.Data.CommandType.Text;
            aSqlCommand.CommandTimeout = 0;
            aSqlCommand.Parameters.Clear();
            aSqlCommand.Parameters.AddRange(aParameters1.ToArray());

            int iResult = aSqlCommand.ExecuteNonQuery();
            if(iResult <= 0)
                Debug.WriteLine("aResult <= 0: " + i_szQuery);
            return iResult;
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Cannot execute query!\nReason: '" + ex.Message + "'", ex);
        }
        finally
        {
            if (!bConnectionWasOpen && aSqlConnection.State == System.Data.ConnectionState.Open)
                aSqlConnection.Close();
        }
    }
    else
    {
      //... almost the same for MS SQL
    }
}

问题是输出参数 @username (System.Data.ParameterDirection.Output;)没有填充查询中的值。

如果我使用其他查询 - 例如

UPDATE t_Users SET password=@new_password WHERE (password=@old_password AND id=@user)

一切都很好。

我无法返回标量,因为还有许多其他查询,例如

SELECT @username=username, @is_blocked=is_blocked, @full_name=full_name, @must_change_pwd=must_change_pwd ...

返回许多值,我不想重写大部分代码。

看起来只有MySQL存在问题,因为相同的代码适用于MS SQL。

我应该使用什么来强制MySqlParameter从查询中加载值?

2 个答案:

答案 0 :(得分:0)

您应该能够像这样读取输出值

aSqlCommand.Parameters["@username"].Value

答案 1 :(得分:0)

这显然是MySql .Net连接器中的一个错误,请参阅#75267。使用连接器v6.9.7和MySql服务器5.5.45对其进行了测试。它仍然被打破,2014年12月的错误报告仍然是开放的。输出参数适用于存储过程,命令类型为StoredProcedure,不适用于将输出参数指定为select的一部分的SELECT语句;命令类型文本。