2012-11-09 54 views
2

我有兩個列的表 - [security_role_name]和security_role_cd。 security_role_cd的數據類型在Security_Role表中是smallint。數據類型而變化基於數據在表

我有以下數據的選擇邏輯。返回的數據類型變化的基礎數據的場景: -

  1. 表無數據
  2. 一個記錄出現在表

問題

  1. 爲什麼數據類型不同在這些情況下
  2. 如何糾正

注意:目前我使用try..catch滿足這種情況下

CODE

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. How do I get the SqlDbType of a column in a table using ADO.NET?

回答

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)); 
+0

感謝。以下也值得使用? SqlDbType type =(SqlDbType)(int)reader.GetSchemaTable()。Rows [0] [「ProviderType」]; – Lijo

+1

@Lijo增加了很多開銷......讀者已經知道這些類型......只是詢問讀者類型是什麼,IMO。 –

+0

能否請您詳細說明這個問題的原因(問題的第一部分)?這將有助於使這個答案更有用。 – Lijo