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の戻り値の型はobjectboxed を返す値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 に答える