Retour d'un SqlDataReader
J'ai ce code:
public static SqlDataReader GetGeneralInformation ( int RecID )
{
using ( var conn = new SqlConnection( GetConnectionString() ) )
using ( var cmd = conn.CreateCommand() )
{
conn.Open();
cmd.CommandText =
@"SELECT cs.Status, cs.Completed
FROM NC_Steps s
INNER JOIN NC_ClientSteps cs
ON cs.RecID = s.RecID
WHERE cs.ClientID = 162
AND s.RecID = @value";
cmd.Parameters.AddWithValue( "@value", RecID );
using ( var reader = cmd.ExecuteReader() )
{
if ( reader.Read() )
{
return reader;
}
return null;
}
}
}
Comment dois-je faire référence à cela?
J'ai essayé ceci mais ça ne fonctionne pas.
SqlDataReader reader = GeneralFunctions.GetGeneralInformation();
Également comment pourrais-je le lire à partir du lecteur?
Reader.GetString( reader.GetOrdinal( "Status" ) )
Modifier:
Je suis maintenant le message d'erreur suivant:
Détails De L'Exception: System.NullReferenceException: la référence d'Objet n'
définie à une instance d'un objet.
Voici le code mis à jour:
public static IEnumerable<IDataRecord> GetGeneralInformation ( int ClientID )
{
using ( var conn = new SqlConnection( GetConnectionString() ) )
using ( var cmd = conn.CreateCommand() )
{
conn.Open();
cmd.CommandText =
@"SELECT i.GoLiveDate, i.FirstBonusRun, i.TechFName, i.TechLName, i.TechEmail, i.TechPhone, i.WebISPFName, i.WebISPLName,
i.WebISPEmail, i.WebISPPhone, i.FullFillFName, i.FullFillLName, i.FullFillEmail, i.FullFillPhone, d.FName,
d.LName, d.HomePhone, d.Email
FROM NC_Information i
INNER JOIN Distributor d
ON d.DistID = i.ClientID
WHERE clientID = @value";
cmd.Parameters.AddWithValue( "@value", ClientID );
using ( var reader = cmd.ExecuteReader() )
{
while ( reader.Read() )
{
yield return reader;
}
yield return null;
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
IEnumerable<IDataRecord> reader = GeneralFunctions.GetGeneralInformation( (int)Session[ "DistID" ] );
//string result = GeneralFunctions.GetGeneralInformation( Globals.GeneralInformation ).First()[ "Status" ].ToString();
}
- Pourquoi tu ne peux pas le lire comme n'importe quel autre SqlDataReader? Est-il un échec? Si oui, c'est à cause de votre
using
consolidés. Vous êtes à la fermeture de la connexion avant de commencer à utiliser le lecteur. - Je suis en train de renvoyer le lecteur lui-même. Je ne suis pas sûr de la meilleure façon d'accomplir ce que je veux faire. C'est fondamentalement un asp.net formulaire qui est rempli avec des données d'une base de données. La seule façon que je pouvais penser de le faire est de renvoyer le lecteur lui-même afin que je puisse remplir l'info dans le asp.net les zones de texte.
- Vous pouviez retourner un objet rempli à partir du lecteur. Et vous n'avez toujours pas dit ce qui n'a pas de travail.
- Je refactoriser, ce n'est pas une bonne conception à la "fuite" d'un lecteur à l'autre méthode (même si vous pouvez le faire fonctionner), il suffit de retourner les résultats.
- comment pourrais-je retourner plusieurs résultats? Je dois faire un autre struct?
- J'ai corrigé l'erreur, je n'étais pas à l'aide de Système.Les données.SqlClient dans la page. Maintenant j'ai juste besoin de comprendre la meilleure façon de renvoyer les données.
- il suffit d'utiliser un
List<T>
? - Je ne voudrais pas l'utiliser ADO.NET directement à tous. J'utilise Entity Framework ou une autre couche d'abstraction. Je voudrais aussi le faire dans une autre couche d'accès aux données de la bibliothèque de classe. Vous ne devriez pas faire d'accès direct aux données dans les pages web (si j'ai parfois faire des exceptions pour des contrôles de Source de Données).
- pas un fan de l'utilisation de la Liste pour maintenir les données à partir d'une base de données... ils manquent le point de l'ensemble de l'aide d'un datareader vs datatable/ensemble de données, pour ne garder qu'un seul enregistrement dans la mémoire RAM à la fois.
- L'entité n'est pas une option ou tout autre cadre à ce point. Les ordres de ses supérieurs.
- Vous obtenez référence nulle exception, puisque vous êtes de retour null. Vous n'avez pas besoin le "yield return null" partie. Vous êtes l'incompréhension comment rendement en C#.
Vous devez vous connecter pour publier un commentaire.
Le problème est qu'en quittant la fonction (via l'instruction return), vous coups de pied hors de la
using
des blocs, et donc de laSqlDataReader
etSqlConnections
que vous utilisez sont éliminés. Pour contourner le problème, essayez de changer la signature de la fonction comme ceci:et ensuite mettre à jour au moyen de la fonction comme ceci:
Pour la finale "Comment puis-je lire?", la partie, il pourrait ressembler à ceci:
IEnumerable<IDataRecord> reader = GeneralFunctions.GetGeneralInformation( Globals.GeneralInformation );
Exception Details: System.InvalidOperationException: Invalid attempt to call MetaData when reader is closed.
sur cette ligne:launchDate.Text = GeneralFunctions.GetGeneralInformation( ( int )Session[ "DistID" ] ).First()[ "GoLiveDate" ].ToString();
launchDate.Text = reader.First()[ "GoLiveDate" ].ToString();
même erreurAjouter votre chaîne de connexion à la section AppSettings dans l'app.config ou web.config.
//Fonction pour retourner SqlDataReader résultats
L'utilisation de la fonction:
Je crois cette StackOverflow répondre mérite d'être évoquée. Un très simple et agréable à utiliser la solution.
Le problème, c'est de la création de la connexion de base de données dans votre méthode.
Si vous allez partager ressources de base de données entre plusieurs méthodes, déplacer
SqlConnection
à l'extérieur de ce périmètre.De cette façon, vous pouvez renvoyer le Lecteur à partir de cette fonction et elle persiste.
Aussi, ne pas
.Read()
au sein de cette fonction, il suffit de retourner l'objet.Par définition, un
using
énoncé est censé Disposer d'un objet après qu'il est appelé.Donc, après votre retour à votre lecteur de données, il devient éliminés.
using
à bloc!