2014-04-12 62 views
1

我想從數據庫中選擇所有行和列(沒有條件),並將每個元組(例如:表中的索引值[0,0])存儲在一個字符串中陣列..從MySQL到字符串數組中獲取元組值

下面是我使用的代碼:

using (MySql.Data.MySqlClient.MySqlConnection connection = new MySql.Data.MySqlClient.MySqlConnection("S;Port=P;Database=DB;Uid=U;Pwd=P"))      { 
     connection.Open(); 
     MySql.Data.MySqlClient.MySqlCommand cmd=connection.CreateCommand(); 
     cmd.CommandText = "SELECT * FROM table_name"; 
     MySql.Data.MySqlClient.MySqlDataReader datr = cmd.ExecuteReader();    
     coun = Convert.ToInt32(cmd.ExecuteScalar()); 
     while (datr.Read()){ 
      for (int i = 0; i < coun; i++) {       
       First_String[i] = datr[0].ToString(); 
       Second_String[i] = datr[1].ToString(); 
       Third_String[i] = datr[2].ToString(); 
         /* and so on...*/ 
      } 
     } 
} 

我正在一個錯誤,其是:「未設置爲一個對象的實例對象引用」對象不

我在做什麼錯事?

感謝

+0

內環是沒有意義的。您正在重複相同的數據國家時間。 while(data.Read())做你想要做的內部循環。 – user3185569

+0

確保初始化您的第一個,第二個和第三個數組,並檢查您的數據庫是否存在空值 – CuriousPen

+0

哪一行拋出錯誤?因爲並不是所有的代碼都可見。 – user3185569

回答

0

試試這個代碼

using (MySql.Data.MySqlClient.MySqlConnection connection = new MySql.Data.MySqlClient.MySqlConnection("S;Port=P;Database=DB;Uid=U;Pwd=P"))      { 
     connection.Open(); 
     MySql.Data.MySqlClient.MySqlCommand cmd=connection.CreateCommand(); 
     cmd.CommandText = "SELECT * FROM table_name"; 
     MySql.Data.MySqlClient.MySqlDataReader datr = cmd.ExecuteReader();    
     coun = Convert.ToInt32(cmd.ExecuteScalar()); 
     int counter = 0; 
     string[] First_String = new string[datr.FieldCount]; 
     string[] Second_String = new string[datr.FieldCount]; 
     string[] Third_String = new string[datr.FieldCount]; 
     while (datr.Read()){       
       First_String[counter] = datr[0].ToString(); 
       Second_String[counter] = datr[1].ToString(); 
       Third_String[counter] = datr[2].ToString(); 
         /* and so on...*/ 
       counter++; 
     } 
} 
+0

仍然收到相同的錯誤:/ – Izzo32

+0

我想你沒有初始化你的數組:/ –

+0

我編輯了我的帖子。嘗試這個新代碼 –

0

添加

public static class DataReaderExtensions 
{ 

    public static string SafeGetString(this SqlDataReader reader, int colIndex) 
    { 
     if(!reader.IsDBNull(colIndex)) 
      return reader.GetString(colIndex); 
     else 
      return string.Empty; 
    } 
} 

這種方法改變你的代碼,這

for (int i = 0; i < coun; i++) 
{ 
First_String[i] = datr.SafeGetString(0); 
Second_String[i] = datr.SafeGetString(1); 
Third_String[i] = datr.SafeGetString(2); 
} 
+0

我改變了這一點,同樣的錯誤顯示 – Izzo32

+0

你可以設置一個斷點並告訴我哪一行是異常造成的? – RezaRahmati

+0

在代碼的第3行 – Izzo32

0

此外,如果您正在使用DataReader的很多工作你可以用這個他從這個帖子LPER類

SqlDataReader Best way to check for null values -sqlDataReader.IsDBNull vs DBNull.Value

/// <summary> 
/// Helper class for SqlDataReader, which allows for the calling code to retrieve a value in a generic fashion. 
/// </summary> 
public static class SqlReaderHelper 
{ 
    private static bool IsNullableType(Type theValueType) 
    { 
     return (theValueType.IsGenericType && theValueType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))); 
    } 

    /// <summary> 
    /// Returns the value, of type T, from the SqlDataReader, accounting for both generic and non-generic types. 
    /// </summary> 
    /// <typeparam name="T">T, type applied</typeparam> 
    /// <param name="theReader">The SqlDataReader object that queried the database</param> 
    /// <param name="theColumnName">The column of data to retrieve a value from</param> 
    /// <returns>T, type applied; default value of type if database value is null</returns> 
    public static T GetValue<T>(this SqlDataReader theReader, string theColumnName) 
    { 
     // Read the value out of the reader by string (column name); returns object 
     object theValue = theReader[theColumnName]; 

     // Cast to the generic type applied to this method (i.e. int?) 
     Type theValueType = typeof(T); 

     // Check for null value from the database 
     if (DBNull.Value != theValue) 
     { 
      // We have a null, do we have a nullable type for T? 
      if (!IsNullableType(theValueType)) 
      { 
       // No, this is not a nullable type so just change the value's type from object to T 
       return (T)Convert.ChangeType(theValue, theValueType); 
      } 
      else 
      { 
       // Yes, this is a nullable type so change the value's type from object to the underlying type of T 
       NullableConverter theNullableConverter = new NullableConverter(theValueType); 

       return (T)Convert.ChangeType(theValue, theNullableConverter.UnderlyingType); 
      } 
     } 

     // The value was null in the database, so return the default value for T; this will vary based on what T is (i.e. int has a default of 0) 
     return default(T); 
    } 
} 

用法:

yourSqlReaderObject.GetValue<int?>("SOME_ID_COLUMN"); 
yourSqlReaderObject.GetValue<string>("SOME_VALUE_COLUMN");