2016-05-24 7 views
1

Gibt es eine ordnungsgemäße Möglichkeit, eine gültige MySQL-Zeichenfolge zu generieren und Werte über einen MySqlCommand zu übergeben?Generieren von MySQLCommand-Strings

Ich verwende derzeit eine Methode wie diese, und stapeln mehr und mehr Bedingungen auf, wenn ich mehr Spalten suchen muss. Es sieht so eklig aus, dass ich davon ausgehe, dass es einen besseren Weg gibt, dasselbe zu erreichen.

private static string SelectUser(User u) 
{ 
    bool and = false; 
    string cmd = "SELECT * FROM `database`.`users` WHERE "; 

    if (u.ID != null) 
    { 
     cmd += "`UserID` LIKE @0"; 
     and = true; 
    } 
    if (u.Username != null) 
    { 
     if (and) { cmd += " AND "; } 
     cmd += "`Username` LIKE @1"; 
     and = true; 
    } 
    if (u.Role != null) 
    { 
     if (and) { cmd += " AND "; } 
     cmd += "`Role` LIKE @1"; 
     and = true; 
    } 
    if (u.Department != null) 
    { 
     if (and) { cmd += " AND "; } 
     cmd += "`Departments` LIKE @1"; 
     and = true; 
    } 
    if (u.Template != null) 
    { 
     if (and) { cmd += " AND "; } 
     cmd += "`Template` LIKE @1"; 
     and = true; 
    } 

    return cmd; 
} 

Ich habe ein paar Methoden gefunden, die fast arbeiten, wie this answer, aber keiner von ihnen erlauben Sie mir, die Werte durch MySqlCommand.Parameters modular zu übergeben.

Antwort

0

Ein paar Dinge zu versuchen.

Zuerst dies tun:

const string baseQuery = "SELECT * from database WHERE 1=1 AND "; 

Dann tun

var andClauses = new List<string>(); 
    if (U.id != null) andClauses.Add("UserID = @0"); 
    if (U.username != null) andClauses.Add("Username = @1"); 
    /* more like this */ 
    var query = baseQuery + string.Join (" AND ", andClauses); 

, dass Sie einen verketteten Satz von ANDs in Ihrer Anfrage erhalten. Es ist ein bisschen sauberer als das, was Sie in Ihrer Frage haben.

Ein weiterer Trick zu beachten: Schreiben Sie eine Abfrage wie folgt

const string baseQuery = @" 
    SELECT whatever 
     FROM mytable 
     WHERE (userid = @0 OR @0 <= 0) 
     AND (username = @1 OR LENGTH(@1) <= 0) 
     AND (department = @2 OR LENGTH(@department) <= 0) "; 

Diese (column = @val OR @val <= 0) WHERE-Klauseln können Sie in einem leeren String oder eine Null integer setzen effektiv die Klausel zu überspringen.

Mit dem Konstrukt string = @"value"; können Sie einen mehrzeiligen String in C# schreiben - unglaublich praktisch, um Ihre Abfragen so zu formatieren, dass Sie sie lesen können.