2010-09-09 8 views
1

Je veux remplir un gridview avec des données de table à partir de SQL. J'ai essayé juste de renvoyer mon objet SqlDataReader et de l'utiliser comme source de données, mais j'obtiens des erreurs que le lecteur a été fermé. Je voulais convertir cela en un DataSet et renvoyer juste un ensemble de données, mais je ne pouvais pas trouver un moyen facile de convertir les données de ligne en un ensemble de données. J'ai également lu que DataSets sont morts dans .NET 3.5/4.0, est-ce vrai?Comment remplir un gridview avec des données de table à partir de sql

Voici ma méthode Data Layer. Ce serait génial si je pouvais retourner quelque chose utilisable comme source de données:

public SqlDataReader GetSites() 
{ 
    SqlConnection sqlCon = null; 
    SqlDataReader rdr = null; 
    try 
    { 
     sqlCon = new SqlConnection(StoredProcedures.conString); 
     sqlCon.Open(); 
     SqlCommand cmd = new SqlCommand("GetSites", sqlCon); 
     cmd.CommandType = CommandType.StoredProcedure; 
     rdr = cmd.ExecuteReader(); 
     return rdr; 
    } 
    finally 
    { 
     if (sqlCon != null) 
     { 
      sqlCon.Close(); 
     } 
     //if (rdr != null) 
     //{ 
     // rdr.Close(); 
     //} 
    } 
} 
+0

Oui, vous fermez le lecteur de données dans l'instruction finally. –

Répondre

4

Comme l'a dit Carlos Munoz, vous avez fermé votre connexion sql. Vous avez besoin de la connexion SQL ouverte pour que le lecteur puisse lire. Il suffit de commenter

if (sqlCon != null) 
{ 
     sqlCon.Close(); 
} 

et vous devriez aller bien.

Une autre alternative est d'utiliser SqlDataAdapter que je préfère.

Voici un exemple ...

public static DataSet GetDataSet(string sql, DatabaseType database) 
{ 
    using (var connection = new SqlConnection(GetConnectionString(database))) 
    { 
     using (var adapter = new SqlDataAdapter(sql, connection)) 
     { 
      var temp = new DataSet(); 
      adapter.Fill(temp); 
      return temp; 
     } 
    } 
} 

Il suffit de définir la source de données de votre grille de données à la table de l'ensemble de données renvoyées.

DGV.DataSource = DatabaseFunction.GetDataSet(sql, DatabaseType.Outage).Tables[0].DefaultView; 
+0

Je suis allé avec quelque chose de réel proche de cela. –

1

Je suggère d'utiliser un dactylographiées Dataset avec des adaptateurs de table typée. Ajoutez un nouveau jeu de données typé dans votre projet et déposez les tables de l'explorateur de serveur dans Visual Studio directement dans votre jeu de données typé et configurez-le. Vous pouvez ensuite utiliser ce type de dataset comme source de données de votre datagrid

+0

J'aime les jeux de données typés. Les trucs générés automatiquement avec des adaptateurs de table sont assez astucieux. Merci –

1
dataAdapter = new SqlDataAdapter(sqlQuery, DatabaseConnectionString); 
SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter); 
builder.GetUpdateCommand(); 
dataSet = new DataSet(); 
DataAdapter.Fill(dataSet); 
dataGridView.DataSource = dataSet.Tables[0]; 

SqlCommandBuilder doit être utilisé si vous souhaitez mettre à jour les modifications apportées à datagridview retour à SqlDatabase! Que vous pouvez écrire:

dataAdapter.Update(dataSet); 

Si vous souhaitez utiliser de nouvelles choses, vous pouvez générer le modèle d'objet qui correspond à vous SqlDatabase avec l'outil SqlMetal. Cela générera des classes qui ont des membres en tant que tables est votre dataabse. Après cela, vous utilisez la requête LINQ qui est utilisée comme source de données de dataGeidView.

Questions connexes