2010-06-02 4 views
1

cela peut sembler une évidence, mais j'espère qu'après avoir expliqué mon problème, vous pourriez comprendre pourquoi je demande cela.est-il possible d'écrire une méthode qui crée une méthode?

est-il possible d'avoir une méthode qui crée une méthode et ses arguments?

le problème:

dans mon projet actuel, je dois appeler plusieurs fois différentes instructions SQL qui ne coûtent pas si différents. Par exemple, j'en ai un où j'insère de nouvelles lignes mais qui n'a que 2 colonnes et une autre qui insère également de nouvelles lignes mais a 12 colonnes.

j'ai créé une classe appelée utils.cs et j'ai trié là de nombreuses méthodes « pratiques », telles que les méthodes de validation qui vérifient pour la saisie numérique aux zones de texte, etc.

donc je pensais bien au lieu d'avoir méthodes d'écriture sql partout mal faire un là-bas et l'appeler quand je dois donc j'ai, mais il semble actuellement comme ceci:

public static string getInsertSQL(string tablename, string colOne, string colTwo, string colThree, string colFour, string colFive, string colSix, string colSeven, string colEight, string colNine, string colTen, string colEleven, string colTwelve,bool active, string valueOne, string valueTwo, string valueThree, string valueFour, string valueFive, string valueSix, string valueSeven, string valueEight, string valueNine, string valueTen, string valueEleven) 
    { 
     string strSQL = ""; 
     strSQL += "INSERT INTO " + tablename; 
     strSQL += "(" + colOne + " " + colTwo + " " + colThree + " " + colFour + " " + colFive + " " + colSix + " " + colSeven + " " + colEight + " " + colNine + " " + colTen + " " + colEleven + " " + colTwelve + ")"; 
     strSQL += " values ("+active+", " + valueOne + " " + valueTwo + " " + valueThree + " " + valueFour + " " + valueFive + " " + valueSix + " " + valueSeven + " " + valueEight + " " + valueNine + " " + valueTen + " " + valueEleven + ")"; 

     return strSQL; 
    } 

que vous pouvez voir des thats tout un gâchis

donc je me suis demandé si elle était tout possible d'écrire une méthode qui serait discutez du nombre de colonnes à insérer et créez une méthode avec autant d'arguments.

J'espère que vous pouvez voir ce que je reçois et ne sonnent pas comme un plep!

merci à l'avance

+1

Pourquoi ne pas avoir une seule méthode et passer dans un dictionnaire de paires ? – adrianbanks

+0

bonne question, mais je n'ai pas la moindre idée sur le dictionnaire etc, seulement un étudiant de première année ^^ –

Répondre

3

Tout d'abord, construire jamais une chaîne SQL par concaténer ensemble comme dans votre exemple. Vous vous êtes ouvert à SQL injection attacks.

Au lieu de cela, créez parameterized queries.

Vous pouvez en fait générer des méthodes au moment de l'exécution ou générer des méthodes basées sur certaines méta-informations. Cependant, vous pourriez vouloir voir si vous pouvez construire votre requête SQL en analysant les arguments d'une seule méthode, par exemple. passer dans un dictionnaire des valeurs de noms de colonnes.

est ici pseudo-code qui décrit le processus

public void DoQuery(string table, Dictionary<string, object> columns) 
{ 
    StringBuilder query = new StringBuilder(); 
    query.Append("SELECT "); 
    foreach (KeyValuePair<string, object> kvp in columns) 
    { 
     query.Append(kvp.Key).Append(","); // You need extra logic to not append a trailing comma. Exercise to reader ;-) 
    } 

    // Etc. Look at how to add parameters to your where clause using provided link 

} 
0

Suite à @adrianbanks, vous pouvez utiliser c l 'var de # pour passer un nombre variable d'arguments à votre méthode et itterate à travers la collection

0

Si vous voulez vraiment le faire, puis passez simplement un params KeyValuePair<string,string>[] columns, cela vous permettra de passer autant de paires (Nom/Valeur) que vous le souhaitez et dans la fonction, vous pouvez y accéder dans un tableau.

Cela dit, je recommande sérieusement de ne pas construire votre SQL de cette manière. Il est ouvert à l'exploitation et il existe de nombreux frameworks parfaitement adaptés (Linq, NHibernate, EntityFramework, etc.), ou même si vous ne voulez pas aller aussi loin, utilisez au moins des requêtes paramétrées. Editer: Puisque vous avez dit que vous n'êtes pas sûr de ce qu'est un dictionnaire je me suis dit que vous pourriez avoir besoin de plus de détails.Voici un exemple étant donné que la question est toujours valable même si ce n'est pas souhaitable pour SQL:

public static string getInsertSQL(string tablename, params KeyValuePair<string, string>[] columns) 
{ 
    string strSQL = "INSERT INTO {0} ({1}) VALUES ({2})"; 
    string fields = String.Empty; 
    string values = String.Empty; 
    foreach (KeyValuePair<string, string> column in columns) 
    { 
    if (!String.IsNullOrEmpty(fields)) fields += ", "; 
    if (!String.IsNullOrEmpty(values)) values += ", "; 
    fields += column.Key; 
    values += "\"" + column.Value + "\""; //Highly recommend replacing with parameters, or at least SQL escaping 
    } 
    return String.Format(strSQL, tablename, fields, values); 
} 
+0

Sauf en tant qu'étudiant universitaire, ils peuvent être limités à l'aide de certaines technologies ... apprendre les fondements avant d'apprendre des approches plus abstraites. Pas certain. Mais sinon, d'accord 100%. –

+0

Certes, je n'avais pas encore lu le commentaire sur un étudiant uni. Pourtant, un jour, il ne sera plus affecté à l'université et devrait au moins savoir qu'il y a une «meilleure façon» plutôt que de reporter ces restrictions à un travail ultérieur. – fyjham

+0

Vraiment apprécier ce merci. mais juste une petite question, comment puis-je appeler cette fonction quelle est la syntaxe pour cela? getInsertSQL (nom de table, désolé de demander d'essayer de le résoudre depuis que vous l'avez modifié la réponse :) –

Questions connexes