2010-07-28 30 views
0

J'insère un formulaire Web dans la base de données et j'utilise donc des requêtes paramétrées. J'ai une CheckBoxList. Comment puis-je itérer sur CheckBoxList, créer une instruction d'insertion pour chaque chose vérifiée (many-to-many), et garder ceci paramétré et exécuté d'un seul coup?Requêtes paramétrées sur l'itération

Je possède ce moment:

string query = "INSERT INTO resources (url, submitted_by, author_name) VALUES (@url, @submitted_by, @author_name);"; 
foreach (ListItem li in CheckBoxList1.Items) 
    { 
     if (li.Selected = true) 
     { 
      query += "; INSERT INTO "; 
     } 
    } 
    SqlCommand cmd = new SqlCommand(query, conn); 
    cmd.Parameters.AddWithValue("@url", TextBox1.Text); 
    cmd.Parameters.AddWithValue("@submitted_by", TextBox2.Text); 
    cmd.Parameters.AddWithValue("@author_name", TextBox3.Text); 

    try 
    { 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     Label1.Text = "Added to database."; 
    } 

Comme vous pouvez le voir est inachevé. Aucune suggestion?

+0

Chaque article coché doit générer un insert pour un ensemble de 'url, submitted, author'? – tzaman

+0

@tzaman: Non, chaque item coché aurait besoin de créer une instruction INSERT comme ceci: 'INSERT INTO phones_resources (phone_id, resource_id) VALUES (@ phone_id, @resource_id);'. – jeffcook2150

+0

Ok. Donc, étant donné un 'ListItem', obtenez-vous le' phone_id, resource_id' associé? – tzaman

Répondre

1

Vous pouvez utiliser LINQ pour générer des paramètres nommés uniques pour chaque élément de votre collection, puis ajoutez les valeurs associées au plus tard:

var builder = new StringBuilder(); 
var listParams = CheckBoxList1.Items 
        .Where(li => li.Selected) 
        .Select(li, idx => new 
        { 
         PhoneString = String.Format("@phone_id{0}", idx), 
         PhoneValue = GetPhoneId(li), 
         ResourceString = String.Format("@resource_id{0}", idx), 
         ResourceValue = GetResourceId(li) 
        }; 
foreach (var param in listParams) 
{ 
    builder.AppendFormat("INSERT INTO phones_resources (phone_id, resource_id) 
          VALUES ({0}, {1});", 
          param.PhoneString, param.ResourceString); 
} 
SqlCommand cmd = new SqlCommand(builder.ToString(), conn); 
foreach (var param in listParams) 
{ 
    cmd.Parameters.AddWithValue(param.PhoneString, param.PhoneValue); 
    cmd.Parameters.AddWithValue(param.ResourceString, param.ResourceValue); 
} 

Je suppose que vous avez une certaine façon de se phone_id, resource_id associés de toute donnée ListItem - vous pouvez simplement brancher cela dans lequel j'ai mis l'espace réservé Get___ fonctions.

Note: Commuté à StringBuilder - c'est beaucoup mieux que de constituer une chaîne avec += répétées.

+0

Merci. J'utilise .NET 2.0 mais je l'ai adapté pour s'adapter. J'avais espéré que je n'aurais pas eu à faire les choses de cette façon, mais ça s'est bien passé et ce n'était pas si mal après vos encouragements. L'instruction LINQ est une bonne référence et je vais essayer de m'en souvenir quand j'aurai l'occasion de jouer avec les frameworks .NET les plus récents (probablement en fait Mono). – jeffcook2150

+0

@cookiecaper - de rien! Je faisais face à une situation similaire récemment; J'ai fini par généraliser cette approche en ajoutant une méthode d'extension sur 'SqlParameterCollection' appelée' AddFromDict' qui prenait un 'Dictionary ' du nom/des valeurs du paramètre et les ajoutait tous. Alors maintenant, je viens de remplir un 'paramètres' dict et ensuite appeler' cmd.Parameters.AddFromDict (paramètres); ':) – tzaman