2017-01-06 1 views
2

Ich kann nicht diese Funktion zu erhalten scheinen:SQL-Abfrage Rückgabeliste

Meine Tabelle Spaltenüberschriften sind ‚Genre‘ ‚Künstler‘ ‚Album‘ und die params, in dem ich vorbei sind (Typ, Filter, Wert) ("Künstler", "Genre", "Rock"), wo es zwei Reihen in der db mit "Rock" für das Genre gibt.

Wenn ich dem Debugger folge, muss 'while (reader.Read())' false zurückgeben, weil die Schleife nie eingegeben und somit nichts in die Liste geschrieben wird.

+0

zuzuordnen. Ihre Abfrage ist ein wenig durcheinander - Sie können Parameter nicht so verwenden, wie Sie sie verwenden. Können Sie erklären, wonach Sie suchen? Bitte zeigen Sie auch Ihre Tabellenstruktur, die Parameter, die Sie übergeben, und die gewünschte Ausgabe an. – Siyual

+1

Sie können keine Parameter für die Namen von Spalten verwenden, und bei der Verwendung von Anführungszeichen werden keine Anführungszeichen verwendet. Sie müssen die Abfrage tatsächlich erstellen wie 'SELECT" + type + "FROM ... WHERE" + filter + "= @value"; ' – juharr

+1

Es ist gut, dass Sie SQL-Parameter verwenden, aber' type' und 'filter 'können keine Parameter sein, da sie Spaltennamen darstellen, wie ich es verstehe. –

Antwort

1

Sie können keine Parameter für die Namen von Spalten verwenden, und Sie verwenden keine Anführungszeichen, wenn Sie sie verwenden. Ihre Anfrage ist gleichbedeutend mit

SELECT 'artist' FROM Music WHERE 'genre' = '@value' 

Sie können stattdessen Folgendes tun.

string query = "SELECT " + type + " FROM Music WHERE " + filter + " = @value"; 

Und entfernen Sie die Zeilen, die die @type und @fitler Parameter erstellen.

+0

Perfekt, danke –

+0

Wäre dies nicht anfällig für einen SQL-Injection-Angriff? – maccettura

+0

@maccettura Nur wenn "type" und/oder "filter" Benutzereingaben sind. Wenn sie das sind, sollte das OP sie zuerst mit einer Liste gültiger Spaltennamen vergleichen. – juharr

0

Sie suchen entweder für Formatierung oder String Interpolation (erfordert C# 6.0):

string query = 
    [email protected]"SELECT {type} 
     FROM Music 
     WHERE {filter} = @value"; 

... 

getData.Parameters.AddWithValue("@value", value); 

Formatierung ist ein bisschen mehr wortreich:

string query = String.Format(
    @"SELECT {0} 
     FROM Music 
     WHERE {1} = @value", type, filter); 
0

ich, dass Sie unter der Annahme‘ wieder mit .net 2

DateTime current = DateTime.Now; 
     Console.WriteLine(current); 
     SqlConnection conn = new SqlConnection(); 
     string q = "SELECT @field FROM student"; 
     SqlDataAdapter da = new SqlDataAdapter(q, conn); 
     da.SelectCommand.Parameters.AddWithValue("@field", "snName"); 
     DataTable dt = new System.Data.DataTable(); 
     conn.Open(); 
     da.Fill(dt); 
     conn.Close(); 
     List<string> names = new List<string>(); 
     foreach (DataRow dr in dt.Rows) 
     { 
      names.Add(dr[0].ToString()); 
     } 
     Console.WriteLine("Fetching {0} data for {1}", names.Count, DateTime.Now - current); 
     Console.ReadKey(); 

Sie können Lambda-Ausdruck verwenden, um die Datentabelle in .net> 4

Verwandte Themen