C# MYSQL AES_DECRYPT函数与heidiSQL一起工作,但是当我在我的C程序中运行相同的查询时,总是返回DBNULL

C# MYSQL AES_DECRYPT函数与heidiSQL一起工作,但是当我在我的C程序中运行相同的查询时,总是返回DBNULL,c#,mysql,C#,Mysql,我正在为我的数据库使用MariaDB,我有一个带有ID、User和Pass列的users表。pass列是AES_加密的,我可以通过在heidiSQL中执行以下查询来读取所有字段: SELECT ID, User, AES_DECRYPT(Pass, 'mykey') AS Pass FROM DeviceUser WHERE ID = 1 客户机用C编码: string query = "SELECT ID, User, AES_DECRYPT(Pass, '@key') AS Pass FR

我正在为我的数据库使用MariaDB,我有一个带有ID、User和Pass列的users表。pass列是AES_加密的,我可以通过在heidiSQL中执行以下查询来读取所有字段:

SELECT ID, User, AES_DECRYPT(Pass, 'mykey') AS Pass FROM DeviceUser WHERE ID = 1
客户机用C编码:

string query = "SELECT ID, User, AES_DECRYPT(Pass, '@key') AS Pass FROM DeviceUser WHERE ID = @id";

var cmd = new MySqlCommand(query, DB.Conexion);
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@key", MariaDB.DBEncrypkey);
cmd.Prepare();

MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
    DeviceUser user = new SqlDataReaderMapper<DeviceUser>(rdr).Build(); //i can not get the pass in this line
    users.Add((user));
}
rdr.Close();
它抛出SqlNullValueException,问题应该在AES_DECRYPT函数中,因为如果我将查询更改为:

string query = "SELECT ID, User, Pass FROM DeviceUser WHERE ID = @id";
我可以读取明显加密的C程序中的值,但由于原始查询在heidySQL中运行良好,我无法找到为什么在C中返回DBNull。

string query=SELECT ID,User,AES_DECRYPTPass,@key as Pass FROM DeviceUser,其中ID=@ID;
您希望使用参数@key的值,而不是文字“@key”。

临时启用常规日志并查看发送到MySQL的实际查询代码。您是对的,我最初就是这样做的,但是当我按照您所说的那样做时,SqlDataReaderMapper会抛出一个转换示例,我认为exepcion是由错误的讲座引起的,因为它是一个字符串,但我只是验证了问题在于SqlDataReaderMapper,因为如果我在没有映射器的情况下得到字符串,它就可以工作。感谢you@Freespirit我不知道SqlDataReaderMapper是什么,但是:你试过Dapper吗?这可能很适合这里:var users=DB.Conexion.Queryselect…,new{id,key=MariaDB.DBEncrypkey}.AsList;我从nuget packt管理器下载了映射器,但我再次意识到错误非常简单,映射器没有问题,即使我将pass column保存为varchar或blob,AES_DECRYPT的结果始终返回字节数组,因此映射器不能将其转换为字符串并引发异常。但我会读到关于衣冠楚楚的书谢谢。
string query = "SELECT ID, User, Pass FROM DeviceUser WHERE ID = @id";