代码之家  ›  专栏  ›  技术社区  ›  OmniOwl

一个Select语句返回uint,而另一个返回同一列上的Int64?

  •  1
  • OmniOwl  · 技术社区  · 6 年前

    我正在使用一个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。

    这里可能出了什么问题?我正在查询完全相同的表,只是将它限制为一列,而不是所有数据,因为我对所有数据都不感兴趣。

    3 回复  |  直到 6 年前
        1
  •  1
  •   user6842156user6842156    6 年前

    问题出在Select语句中。

    你的意思可能是:

    SELECT TOP 1 ID FROM USERS WHERE ID = @id
    

    您错过了关键字“TOP”,因此将获得以下输出,返回时为Int64。

    enter image description here

    如果有帮助的话,告诉我。

        2
  •  0
  •   OmniOwl    6 年前

    结果是我用错了MySql语法。而不是写作

    SELECT 1...
    

    正确的语法是:

    SELECT params FROM table WHERE conditions LIMIT number
    

    所以在这种情况下,最后会是:

    LIMIT 1
    
        3
  •  0
  •   Eldlabs    6 年前

    我只是想问你,你确定你的sql语句是正确的吗?选择1…,你想达到什么目的。。。?

    还有一件事,我建议在使用select查询时不要使用*。使用某些查询所需的显式列。