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变成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 的类型(即,如果为 nullable int、null string 或 null object)

更新

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