2010-12-10 34 views
1

nous développons un backend de base de données pour une partie multijoueur. Le serveur est écrit en C# et parle à une base de données Postgres via Npgsql.Npgsql: Comment faire des instructions préparées

Maintenant, le manuel montre comment utiliser les commandes préparées:

NpgsqlCommand command = new NpgsqlCommand("select * from tablea where column1 = :column1", conn); 
// Now add the parameter to the parameter collection of the command specifying its type. 
command.Parameters.Add(new NpgsqlParameter("column1", NpgsqlDbType.Integer); 
// Now, prepare the statement. 
command.Prepare(); 
// Now, add a value to it and later execute the command as usual. 
command.Parameters[0].Value = 4; 

Et il déclare que les déclarations préparées sont valables uniquement à l'intérieur d'une session de base de données. J'ai deux questions maintenant:

1.) Le serveur reconnaîtra-t-il que cette commande a été préparée si je crée un nouvel objet NpgsqlCommand avec le même texte de commande et les mêmes types de paramètres ou dois-je conserver l'objet et simplement changer variables avant de l'exécuter à nouveau? Dans l'exemple, l'objet de commande est éliminé après la requête.

2.) Est-ce que les déclarations préparées probablement augmenter la performance même si nous ne disposons que de simples déclarations dans ce style:

SELECT f1,f2 FROM t1 
UPDATE t1 SET f1=1, f2=2 

Il est possible que des centaines de requêtes avec le même style sont exécutées dans une rangée - créant actuellement un nouvel objet NpgsqlCommand (et aussi NpgsqlConnection du pool NpgSql) pour chaque requête.

Merci!

Répondre

2

Je vous conseille de ne pas utiliser les instructions préparées. Npgsql n'a pas encore de très bonnes performances. :(Désolé pour cela.

également, afin d'envoyer un grand nombre de commandes d'insertion, je pense que vous devriez regarder le soutien NpgsqlCopy. Il vous donnera une bien meilleure performance. J'espère que ça aide.

+0

Copier est pour la lecture/écriture de/aux fichiers, n'est-ce pas? Dans ce cas, il est inutile car nous gardons toutes les données en mémoire.Mais merci pour l'indice avec la mauvaise performance des déclarations préparées – Tarnschaf

+0

Yeap.Mais il est également utilisé Pour envoyer une grande quantité de données au serveur, je pensais que ce serait ce que vous vouliez faire.Je désole si j'ai mal lu votre message. :) –

+0

accepté en raison de l'indice que les instructions préparées n'étaient pas encore performantes en Npgsql – Tarnschaf