2010-12-07 9 views
0

J'ai une SqlConnection avec une requête sqlquery qui ne donne aucun résultat. Dans les rares cas où cela se produit, j'ai une autre sqlquery et une autre connexion à la base de données. Il doit y avoir une meilleure façon de faire ça, non? Sur une note de côté, est-il préférable de fermer la connexion après .Fill? Je suppose que oui, mais je ne l'ai pas vu utilisé nulle part.comment remplir deux fois correctement DataSet (après un jeu vide)

Je commence toujours en C# /. Net - Merci!

SqlConnection dbSqlConnection = new SqlConnection(--); 
SqlDataAdapter dbSqlDataAdapter = new SqlDataAdapter(sqlquery, dbSqlConnection); 
DataSet dbDataSet = new DataSet(); 
dbSqlDataAdapter.Fill(dbDataSet, "popGrid"); 
dbSqlConnection.Close(); 

if (dbDataSet.Tables["popGrid"].Rows.Count == 0) 
{ 
    SqlDataAdapter newSqlDataAdapter = new SqlDataAdapter(sqlquery2, dbSqlConnection); 
    newSqlDataAdapter.Fill(dbDataSet, "popGrid"); 
    dbSqlConnection.Close(); 
+0

Quelles sont les instructions Sql? –

+0

Et oui, fermez toujours vos connexions db - la base de données elle-même a un nombre limité de connexions, donc si trop de connexions restent ouvertes, les nouvelles connexions échoueront. –

+0

Vous devez avoir dbSqlConnection.Close après l'instruction if. Vous ouvrez uniquement le SqlConnection une fois, donc il devrait être fermé une fois. Et si vous y accédez après la fermeture, une exception sera levée. – TamusJRoyce

Répondre

2

Pour la première question, je pense que c'est aussi bien si vous vous connectez au DB deux fois après avoir vérifié que le premier résultat est vide. Vous n'avez pas à faire les deux en une seule requête, sauf si cette action (récupérer deux fois les données) est très fréquente, ou si vous vous connectez à la base de données coûte beaucoup de temps (par exemple, vous êtes aux États-Unis et la DB est au Royaume-Uni ?) Et pour la deuxième question:

using (SqlConnection dbSqlConnection = new SqlConnection(connStr)) 
{ 
    //do things 
}//the connection will be disposed automatically here 
+0

Excellent point. Cela appelle automatiquement .Dispose, ce qui équivaut à appeler manuellement .Close (mais mieux car il fermera la connexion, même si une exception est levée). – TamusJRoyce

+0

Ah, c'est génial - je me souviens d'avoir lu à ce sujet mais je n'ai jamais enquêté. Merci pour l'aide. –

+0

Je voterais ça, mais j'ai besoin d'un meilleur représentant. –

0

Vous pouvez faire une seule requête qui ne:

Select * From SqlQuery1 Into TempTable1; 

IF (SELECT Count(*) From TempTable1) = 0 BEGIN 
    Select * From SqlQuery2; 
ELSE 
    Select * From TempTable1; 
END 

C'est pseudo-code, comme je l'ai pas testé et il est un peu sur un coup de tête. Été un moment depuis que j'ai écrit des requêtes. Pour les devoirs, recherchez comment utiliser une instruction if pour tester la façon de déterminer si une table temporaire n'a pas de ligne, puis renvoyez une requête différente si c'est le cas.

Edit:

Mettre les deux requêtes en une seule requête est mieux que d'appeler négligemment deux requêtes. Donc, il ne vaut probablement pas la peine de le faire, sauf si vous avez une très bonne raison de le faire.

+0

Eh bien, si vous ne savez pas si cela va fonctionner, peut-être que vous ne devriez pas le poster comme une réponse? PS ça ne marchera pas. –

+0

Pseudo-code ne fonctionne pas? pseudo-code donne un sens mais n'est pas conçu pour fonctionner. Et c'est seulement ici jusqu'à ce que vous le publiez comme non-pseudo-code de toute façon. – TamusJRoyce

+0

Mais il ne peut pas être implémenté d'une manière qui satisfait les exigences OP. Les requêtes SQL ne peuvent pas contenir de conditions (les procs peuvent être stockés, mais c'est une question différente). –