我正在使用MySql数据库,在我的代码中的某处,我做了如下选择:
using (MySqlTransaction transaction = conn.BeginTransaction())
{
using (MySqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM USERS WHERE ID = @id";
cmd.Transaction = transaction;
cmd.Parameters.AddWithValue("@id", id);
cmd.Prepare();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
reader.Read();
result = new User()
{
Id = reader.GetFieldValue<uint>(0),
NameFirst = reader.GetFieldValue<string>(1),
NameLast = reader.GetFieldValue<string>(2),
DateOfBirth = reader.GetFieldValue<DateTime>(3)
};
}
else
{
result.NameFirst = ErrorCodeUtility.GetEnumName(ErrorCodes.SQL_INVALID_ID);
}
}
}
}
现在Id = reader.GetFieldValue<uint>(0)
行很有趣,因为它可以工作。该类型是无符号整数,因此是正确的。但是我在代码的其他地方做了下面的事情:
using (MySqlTransaction transaction = conn.BeginTransaction())
{
using (MySqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT 1 ID FROM USERS WHERE ID = @id";
cmd.Transaction = transaction;
cmd.Parameters.AddWithValue("@id", id);
cmd.Prepare();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
reader.Read();
uint receivedId = reader.GetFieldValue<uint>(0);
if (receivedId == id)
{
result = true;
}
}
}
}
}
第uint receivedId = reader.GetFieldValue<uint>(0);
行失败。它告诉我类型是Int64而不是预期的uint。
这里可能出了什么问题?我正在查询完全相同的表,只是将其限制为一列而不是所有数据,因为我对所有表都不感兴趣。
答案 0 :(得分:1)
问题出在您的Select语句中。
您的意思可能是:
SELECT TOP 1 ID FROM USERS WHERE ID = @id
您错过了关键字“ TOP”,因此,您得到以下输出,返回时为Int64。
如果有帮助,请告诉我。
答案 1 :(得分:0)
答案是我使用的MySql语法错误。不用写
SELECT 1...
正确的语法是:
SELECT params FROM table WHERE conditions LIMIT number
所以在这种情况下,最终是:
LIMIT 1
答案 2 :(得分:0)
我想问您什么,您确定您的sql语句正确吗?您要选择1 ...要实现什么?
还有一件事情,我建议在使用选择查询时不要使用*。使用某些查询所需的显式列。