2016-10-13 4 views
1

Ich arbeite in C# und MySQl in VS2015 meine Datenbank abzufragen und die Informationen in einer VARCHAR-Typ-Spalte mit dem Titel "Methode" zurückzugeben. Die Abfrage gibt jedoch die Zeichenfolge "method" und nicht die Werte der Methodenspalte zurück.MySQL Query gibt Parameter Spaltenname zurück

Unten ist der Code:

 string queryOne = "SELECT " + "@columnName" + " FROM log.transactions"; 

     MySqlCommand cmdOne = new MySqlCommand(queryOne, connectionString); 

     cmdOne.Parameters.AddWithValue("@columnName", "method"); 

     MySqlDataReader dataReaderOne = cmdOne.ExecuteReader(); 
     while (dataReaderOne.Read()) 
     { 
      Console.WriteLine(dataReaderOne.GetString(0)); 
     } 
     dataReaderOne.Close(); 

Während dies die Ausgabe ist:

 method 
     method 
     method 
      . 
      . 
      . 

.. für die Anzahl der Zeilen in der Spalte Methode. Ist das ein Formatierungsproblem? Ist es möglich, dass die Konfiguration meiner Datenbank verhindert, dass VarChar korrekt zurückkommt? Wenn ich die Abfrage ändere, um eine Spalte vom Typ INT abzufragen, gibt sie die korrekten Werte für eine Spalte vom Typ INT zurück.

Antwort

2

Sie können einen Spaltennamen in einer ausgewählten Anweisung nicht parametrisieren. Was Sie tun, ist genau wie select 'foo' from log.transactions zu sagen. Es wählt die Zeichenfolge 'foo' einmal für jede Zeile aus. Sie kleben nur einen String-Wert drin; Es analysiert den String-Wert nicht als SQL.

Was Sie tun können (wenn Sie es sich leisten können) ist select * from log.transactions, dann kann Ihr C# -Code die Daten in welcher Spalte auch immer der Anrufer hat Ihnen den Namen von. Mit vielen Zeilen könntest du aber viel nutzlosen Müll aus der DB zurückschleppen.

Was Sie im Code mögen Sie zeigen, ist aber gerade dies:

string queryOne = "SELECT method FROM log.transactions"; 

Wenn Sie wirklich „Methode“ wollen parametrieren, dass lückenhaft ist, weil die SQL-Injection-Schwachstellen.

string queryOne = "SELECT " + fieldname + " FROM log.transactions"; 

, das gut aussieht, bis einige Komiker Ihre Anwendung gibt Ihnen einen Wert von "0; drop table log.transactions;--" in der Textbox. Dann hast du Probleme. Wenn Sie jemals eine String-Variable in eine SQL-Zeichenfolge verketten, die Sie ausführen werden, müssen Sie fanatisch sein, sie zu bereinigen, und selbst dann wollen Sie sie auf jede mögliche Weise vermeiden. Es ist russisches Roulette.

+0

Ehrfürchtig, vielen Dank, dass Sie mich wissen lassen! – KM2001

1

Ihre Abfrage-Formation muss so aussehen, als ob Sie Ihre Spalte dynamisch halten wollen. Geben Sie den Spaltennamen entsprechend weiter.

string queryOne = "SELECT " + column_name + " FROM log.transactions"; 

MySqlCommand cmdOne = new MySqlCommand(queryOne, connectionString);   
MySqlDataReader dataReaderOne = cmdOne.ExecuteReader(); 
while (dataReaderOne.Read()) 
    { 
     Console.WriteLine(dataReaderOne[column_name]); 
    } 
dataReaderOne.Close();