2016-03-25 6 views
-1

Ich habe eine Verbindung zu meiner MySQL-Datenbank hergestellt und eine Ausgabe erhalten, indem ich direkt einen Befehl in meinen Code eingegeben habe. Ich möchte jedoch eine Funktion hinzufügen, in der gefragt wird, welchen Befehl Sie während der Laufzeit speziell abfragen möchten. Dann möchte ich, dass es für jeden eine Durchforstung durchführt und alle Daten aufruft, auf die in der Laufzeitabfrage Bezug genommen wird. Das ist mein Code ATM und ich bekomme Fehler.Foreach MySql Tabelle

try 
     { 
      con.Open(); 
      Console.WriteLine("Connection Open!"); 

      Console.WriteLine("Enter Query:"); 
      comString = Console.ReadLine(); 

      try 
      { 
       MySqlDataReader myReader = null; 
       MySqlCommand myCommand = new MySqlCommand(comString, con); 
       myReader = myCommand.ExecuteReader(); 
       while (myReader.Read()) 
       { 
        //Console.WriteLine(myReader["ID"].ToString() + " | " + myReader["NAME"].ToString() + " | " + myReader["PERMISSIONS"].ToString()); 
        foreach (string i in myReader) 
        { 
         Console.WriteLine(myReader["i"].ToString()); 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

EDIT

Dies ist der Fehler i unter

System.InvalidCastException: Unable to cast object of type 'System.Data.Common.DataRecordInternal' to type 'System.String'. 

bei sqlConnection.Program.Main (String [] args) in C erhalten: \ Pathssss \ sqlConnection \ sqlConnection \ Programme. cs: line 50

+0

Bitte, diese Fehler teilen. – Christoph

Antwort

1

Das ist, weil Sie in foreach Anweisung versuchen, object zu string zu übertragen. Verwenden Sie diesen Code, um Ihren while Block zu ersetzen.

int count = myReader.FieldCount; 
while(myReader .Read()) 
{ 
    for(int i = 0 ; i < count ; i++) 
    { 
     Console.WriteLine(myReader.GetValue(i)); 
    } 
} 
+0

du mein Freund bist ein reines Genie! –

0

Wenn Sie die Möglichkeit haben, Bibliotheken zu verwenden, würde ich vorschlagen, Dapper verwenden, wird Ihr Leben viel einfacher machen.

mit adrett alles, was Sie zu tun haben würde, ist dies:

bool firstRun = true; 
foreach(var result in con.Query(comString)) 
{ 
    var rDictionary = (IDictionary<string,object>)result; 

    //assuming this is what you want based off of your commented out code 
    if(firstRun){ 
     firstRun = false; 
     Console.Write(string.Join("|",rDictionary.Keys)); 
    } 

    Console.WriteLine( 
      string.Join("|", rDictionary.Select(a=>a.Value ?? (object)"NULL").ToArray()) 
    ); 
} 
0

Ich möchte Sie schlagen einen anderen (ich glaube, besser) Weg, dies zu tun:

try 
    { 
     con.Open(); 
     Console.WriteLine("Connection Open!"); 

     Console.WriteLine("Enter Query:"); 
     comString = Console.ReadLine(); 
     MySqlCommand myCommand = new MySqlCommand(comString, con); 
     MySqlDataAdapter msda = new MySqlDataAdapter(myCommand); 
     DataSet ds = new DataSet(); 
     msda.Fill(ds); 
     foreach (DataRow dr in ds.Tables[0].Rows) 
      Console.WriteLine(dr["column"].ToString()); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    finally 
    { 
     con.Close(); 
    }