2010-06-18 8 views
0

Je voudrais construire dynamiquement la clase d'une instruction sql à partir de hashtable en C#.Comment créer une clause where dans SQL Server?

La clé de la table hash_table sera le nom de la colonne à insérer et la valeur de hash_table sera la valeur.

string sql_1="SELECT COL_1,COL_2 FROM MY_TABLE"; 
string sql_2="SELECT * FROM MY_TABLE WHERE COL_3='ABC'"; //note: some statment have where clause while some do NOT have. 

string sql= ToSql(sql_1,myHashTable); // the actual sql statment will be returned from ToSql 
//execute sql 
sql= ToSql(sql_2,myHashTable); // 
//execute sql 

Ma question est, comment puis-je créer la fonction fonction ToSql() dans LINQ?

REMARQUE: Le type de données de la valeur de hashtable sera pris en compte.

Merci d'avance.

Répondre

3
var q = String.Join(" AND ", myHashTable.Select(x => x.Key.ToString() + " = " + 
    (x.Value is string ? "'" : "") + x.Value.ToString() + 
    (x.Value is string ? "'" : ""))) 

Bien sûr, vous allez devoir décider d'ajouter un « OU », « ET », doivent dépouiller un peu « GROUP BY » clause avant d'ajouter « WHERE », et faire face à échapper , mais je crois que vous pouvez gérer cela.

Cependant, je voudrais fortement suggérer à la place d'utiliser des requêtes paramétrées, et ajouter les paramètres au SqlCommand. Quelque chose comme:

var q = String.Join(" AND ", myHashTable.Select(x => x.Key.ToString() + " = @" + 
    x.Key.ToString())); 

var parameters = myHashTable.Select(x => new SqlParameter("@" + x.Key.ToString(), 
    x.Value)); 
+0

Merci pour la suggestion. Mais, je pense, en utilisant des requêtes paramétrées n'est pas possible pour moi parce que, le nombre de paramètres sera passé ne peut être connu qu'à l'exécution, ce qui nécessitera des codes supplémentaires.Par ailleurs, est-il possible d'accéder à Hashtable dans LINQ? – Kai

+1

@Kai, la requête paramétrée est toujours une requête personnalisée à l'exécution; cela vous évite simplement d'essayer d'échapper correctement aux paramètres, ce qui est une technique de sécurité très utile. –

+0

@ Trader W.Craig, Merci de me corriger.Mais, j'ai déjà eu la fonction qui peut gérer cela, et je dois passer juste la déclaration SQL à cela. – Kai