1

我有这个 SQL Server (Express) 表:

在此处输入图像描述

...具有 TinyInt 的 GenreId(最多只有几十个不同的流派)。

此 C# 代码失败,显示“指定的强制转换无效”。

int genreId = 0;
. . .
genreId = GetGenreIdForGenre(_genre);

失败时“_genre”的值是“Adventure”。对 GetGenreIdForGenre() 的调用应返回“1”:

在此处输入图像描述

这是 GetGenreIdForGenre() 中失败的行:

return (int)command.ExecuteScalar();

在上下文中,GetGenreIdForGenre() 方法是:

private int GetGenreIdForGenre(string genre)
{
    try
    {
        string qry = "SELECT GenreId FROM dbo.GENRES WHERE Genre = @genre";
        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            using (SqlCommand command = new SqlCommand(qry, connection))
            {
                command.Parameters.AddWithValue("@genre", genre);
                connection.Open();
                return (int)command.ExecuteScalar();
            }
        }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
         return 0;
     }
 }

没有可用的 (TinyInt) 转换。Int32 也失败了。我需要做什么来检索 TinyInt 值?

4

2 回答 2

2

command.ExecuteScalar的返回类型是object它返回 boxed 的值byte。在您可以将其转换为 之前int,您必须取消装箱byte

return (byte)reader.ExecuteScalar();

在拆箱强制转换为 之后byte,它将使用可用的隐式转换为int(以匹配方法的返回类型),因此您不需要再次强制转换。

于 2020-09-22T17:25:06.497 回答
1

将其应用于查询:

string qry = "SELECT CAST(GenreId as int) FROM dbo.GENRES WHERE Genre = @genre";

这样您就无需担心客户端转换。

于 2020-09-22T17:30:39.400 回答