3

[security_role_name]とsecurity_role_cdの2つの列を持つテーブルがあります。security_role_cdのデータ型は、Security_Roleテーブルのsmallintです。

次のデータ選択ロジックがあります。返されるデータ型は、データのシナリオによって異なります。-

  1. テーブルにデータがありません
  2. テーブルに1つのレコードが存在します

質問

  1. これらのシナリオでデータ型が異なるのはなぜですか
  2. それを修正する方法

:現在、私はtry..catchこのシナリオを満たすために使用しています

コード

    private int GetNextRoleID(SqlConnection connection)
    {
        int? newRoleID = null;
        //string commandText = "SELECT  (MAX(security_role_cd)) AS [NewRoleID] FROM Security_Role ";
        string commandText = "SELECT  TOP 1 security_role_cd AS [NewRoleID] FROM Security_Role ORDER BY security_role_cd DESC";
        SqlCommand command = new SqlCommand(commandText, connection);
        command.CommandType = System.Data.CommandType.Text;
        SqlDataReader reader = command.ExecuteReader();
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                if (!reader.IsDBNull(0))
                {
                    //newRoleID = Convert.ToInt32((reader.GetInt16(0)) + 1);

                    try
                    {
                        newRoleID = Convert.ToInt32(reader.GetInt16(0)) + 1;
                    }
                    catch
                    {
                        int result = (reader.GetInt32(0));
                        newRoleID = result + 1;
                    }
                }
            }
        }
        reader.Close();

        if (newRoleID == null)
        {
            newRoleID = 1;
        }

        return (Convert.ToInt32(newRoleID));

    }

参照:

  1. ADO.NETを使用してテーブルの列のSqlDbTypeを取得するにはどうすればよいですか?
4

1 に答える 1

2

あなたは見ることができますreader.GetFieldType(0)。例えば:

    int i;
    switch (Type.GetTypeCode(reader.GetFieldType(0)))
    {
        case TypeCode.Int16: i = reader.GetInt16(0); break;
        case TypeCode.Int32: i = reader.GetInt32(0); break;
        // TODO: any other cases you need to handle
        default: throw new NotSupportedException();
    }

またはおそらくもっと簡単です:

    int i = Convert.ToInt32(reader.GetValue(0));
于 2012-11-09T11:34:04.607 に答える