2009-11-16 4 views
0

salut en cours d'exécution lot am insérer avec subsonique 3.0.0.3 et MVC et j'ai écrit l'exemple suivant:conseils sur Subsonic lot Insérer une requête

var myquery1 = new Insert(provider).Into<orderitem>("orderitem_orderid", "orderitem_productid", "orderitem_qty", "orderitem_total", 
        "orderitem_sessionid", "orderitem_internal", "orderitem_measurement").Values("1", "1", "1", "0.00", "12345", "0", "1x1"); 
     batch.QueueForTransaction(myquery1); 

     var myquery2 = new Insert(provider).Into<orderitem>("orderitem_orderid", "orderitem_productid", "orderitem_qty", "orderitem_total", 
        "orderitem_sessionid", "orderitem_internal", "orderitem_measurement").Values("2", "1", "1", "0.00", "12345", "0", "1x1"); 
     batch.QueueForTransaction(myquery2); 

     batch.ExecuteTransaction(); 

cela fonctionne et tout ira bien, ne cependant que quelqu'un sait comment Je peux m'en sortir en ne listant pas tous les noms de colonnes, mais en faisant référence à la classe subsonique pour la table ???? et puis simplement avoir mes valeurs dans le bon ordre.

ce qui précède fonctionne mais semble un peu désordonné, et j'ai beaucoup plus de tables que cela aussi.

merci beaucoup

Répondre

1

On dirait que vous voulez être en mesure de faire quelque chose comme:

var myquery1 = new Insert(provider).Into<orderitem>().Values("1", "1", "1", "0.00", "12345", "0", "1x1"); 

batch.QueueForTransaction(myquery1); 

Cependant, cela ne fonctionnera pas et pour être honnête, ce n'est pas soit vraiment souhaitable. La raison pour laquelle cela ne fonctionne pas est que SubSonic ne saura pas quelles valeurs associer à quelles colonnes de votre table. La raison pour laquelle je ne crois pas que ce soit souhaitable est que toute modification des tables sous-jacentes pourrait facilement entraîner l'insertion des valeurs dans des colonnes inattendues et que le code réel soit très opaque. C'est très bien pour quelqu'un qui a une connaissance intime de la base de données, mais si vous regardez ce code du point de vue de la maintenance, il est impossible de dire facilement ce qui se passe réellement.

EDIT: Si vous voulez IntelliSense pour vos noms de colonnes, vous pouvez effectuer les opérations suivantes (vérifier Structs.cs pour voir ce qui sera généré automatiquement pour vos noms de table/colonne):

var myquery1 = new Insert(provider).Into<orderitem>(OrderItemTable.ProductIdColumn).Values("1"); 

batch.QueueForTransaction(myquery1); 
+0

vrai point gentil j'ai trouvé un moyen plus long de le faire lol avec orderitemTable.columnname tout bon point mais je pensais plus sur les lignes de la nouvelle insertion (fournisseur) .Into (orderitem.columns.all) .Values ​​("1 "," 1 "," 1 "," 0.00 "," 12345 "," 0 "," 1x1 "); ou simel intelisense dit params expression > [] les accessoires: insérer ???? – davethecoder

-1

subsonique utilise le modèle IActiveRecord donc si vous avez utilisé les modèles T4 aux objets gen pour vous, alors vous devriez avoir des classes pour les enregistrements de vos tables. Sur les classes d'enregistrement actives, il est simple de créer une nouvelle classe, de définir certaines propriétés et d'appeler la méthode Add() pour faire ce que vous faites de manière beaucoup plus concise. Assurez-vous que vous avez une clé primaire sur votre table, que vos colonnes sont nommées correctement et les choses just "just work" for you.

Quelque chose comme;

OrderItem item = new OrderItem(); 
item.Total = 24.32; 
item.Qty = 3; 
item.ItemID = 23; 
item.CreatedBy = 'bjones'; 
item.Add(); 
+0

je sais comment ajouter un disque, et je sais aussi comment fonctionne subsonic et ce qu'il crée, merci pour l'information mais il n'a vraiment rien à voir avec mon Querry que je fais une insertion de lots de nombreux enregistrements en une seule fois, la méthode ci-dessus n'est pas vraiment recommandé pour les insertions par lots c'est pourquoi Rob a créé le processus par lots !!! – davethecoder

1

Peut-être que vous pourriez au moins "cache" les colonnes que vous voulez insérer? J'oublie si params string[] vous permettra de le faire ou non.

string[] columnlist = new string[] {"orderitem_orderid", "orderitem_productid", "orderitem_qty", "orderitem_total", "orderitem_sessionid", "orderitem_internal", "orderitem_measurement"}; 
var myquery1 = new Insert(provider).Into<orderitem>(columnList).Values("1", "1", "1", "0.00", "12345", "0", "1x1"); 
     batch.QueueForTransaction(myquery1); 

     var myquery2 = new Insert(provider).Into<orderitem>(columnList).Values("2", "1", "1", "0.00", "12345", "0", "1x1"); 
     batch.QueueForTransaction(myquery2); 

     batch.ExecuteTransaction(); 

Si oui, vous pouvez également essayer la conversion de la struct Colonnes de la table à un tableau de chaînes, mais je ne sais pas quels modèles 3.0 généreraient que le cas échéant. (Toujours aimer 2.2 et pas prêt à recommencer avec 3.0)

+0

3.0.0.3 est génial, mais pas beaucoup de documentation, donc vous devez tout faire vous-même :-) d'une certaine manière, je l'apprécie de cette façon que vous apprendrez à mieux l'utiliser !!! ci-dessus ouais c'est possible, je pensais que peut-être dans les classes générées je pourrais mettre un tableau de colonnes et être capable d'appeler ça n'importe où ... en théorie les fichiers TT pourraient être modifiés pour générer cette liste !!!!! penser à merveille si c'est possible de toute façon :-) customersTable.Columns.ToArray lol – davethecoder

Questions connexes