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#.

InformationsquelleAutor James Wilson | 2012-04-20