2

データ型のデータベースに security_role_cd 列がありますsmallint。次のコードをnullable int変数に使用して、この列を選択しています。

次のエラーが表示されます:

エラー 3 'null' と 'short' の間に暗黙的な変換がないため、条件式の型を特定できません

このエラーを克服するための正しいコードは何ですか?

SELECT R.security_role_cd  FROM Security_Role R WHERE security_role_name = 'Admin'

C#

        int? roleID = null;
        string commandText = "SELECT R.security_role_cd  FROM Security_Role R WHERE security_role_name = @roleName";
        SqlCommand command = new SqlCommand(commandText, connection);
        command.CommandType = System.Data.CommandType.Text;
        command.Parameters.AddWithValue("@roleName",roleName);
        SqlDataReader readerRole = command.ExecuteReader();
        if (readerRole.HasRows)
        {
            while (readerRole.Read())
            {
                roleID = readerRole.GetInt16(0) == 0 ? null : readerRole.GetInt16(0) ;

            }
        }
        readerRole.Close();
4

2 に答える 2

6

次のように入力する方法を知っている必要がありnullます。

roleID = readerRole.GetInt16(0) == 0 ? (int?)null : (int)readerRole.GetInt16(0);

個人的には値をキャッシュします:

int tmp = readerRole.GetInt16(0); // implicit widening to int here
roleID = tmp == 0 ? (int?)null : tmp;

私はまた、 a0を aに変えることの知恵に疑問を投げかけますがnull- より使いやすいIsDBNull- 次のようなもの:

if(reader.IsDBNull(0)) {
    roleID = null;
} else {
    roleID = (int)readerRole.GetInt16(0);
}
于 2012-11-07T08:26:02.990 に答える
1

これを試して

roleID = readerRole.GetInt16(0) == 0 ? (int?) null : readerRole.GetInt16(0) ;

三項演算子のドキュメントによると、コロン (:) の両側のデータ型は同じでなければなりません。キャストせずに持っていたので、null の型を判別できませんでした (つまり、null 可能な int、または null 文字列、または null オブジェクトかどうか)。

アップデート

roleID = readerRole.GetInt16(0) == 0 ? (int?) null : readerRole.GetInt32(0) ;
于 2012-11-07T08:26:36.187 に答える