背景:我正在重写我的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从查询中加载值?
答案 0 :(得分:0)
您应该能够像这样读取输出值
aSqlCommand.Parameters["@username"].Value
答案 1 :(得分:0)
这显然是MySql .Net连接器中的一个错误,请参阅#75267。使用连接器v6.9.7和MySql服务器5.5.45对其进行了测试。它仍然被打破,2014年12月的错误报告仍然是开放的。输出参数适用于存储过程,命令类型为StoredProcedure,不适用于将输出参数指定为select的一部分的SELECT语句;命令类型文本。