10 Stimmen

Verwenden von IDataReader, um eine gespeicherte Prozedur mit Parametern aufzurufen

Ich verwende IDataReader, um gespeicherte Prozeduren ohne Parameter aufzurufen. Ich finde keine Beispiele dafür, wie das gemacht wird, wenn Parameter vorhanden sind. Behandelt IDataReader Parameter von gespeicherten Prozeduren?

Bitte geben Sie ein Beispiel an.

8voto

Fredrik Mörk Punkte 151006

Es ist nicht der IDataReader, der sich mit Parametern befasst, das wäre der IDbCommand (unter Verwendung der CreateParameter Methode). Dann können Sie einen Reader für den Befehl mit der ExecuteReader Methode erhalten.

Ich habe ein einfaches Beispiel zusammengestellt:

private static void ExecuteCommand(IDbConnection conn)
{
    using (IDbCommand cmd = conn.CreateCommand())
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "ProcedureName";
        IDataParameter param = cmd.CreateParameter();
        param.ParameterName = "@parameterName";
        param.Value = "Parameterwert";
        cmd.Parameters.Add(param);
        using (IDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // Daten aus dem Reader bekommen
            }
        }
    }
}

7voto

Bill Paetzke Punkte 12916

Wenn Sie die Enterprise Library verwenden, wird dieser Stil gut für Sie funktionieren:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;

// ...

SqlDatabase db = new SqlDatabase("IhreVerbindungszeichenfolge");
DbCommand cmd = db.GetStoredProcCommand("IhrProzedurname");
cmd.Parameters.Add(new SqlParameter("IhrParamName", "Parametervalue"));

using (IDataReader dr = db.ExecuteReader(cmd))
{
    while (dr.Read())
    {
        // etwas mit den Daten machen
    }
}

1voto

Mark Wilkins Punkte 39992

Einige .NET-Anbieter haben in der Implementierung des Befehlsbaumeisters eine statische DeriveParameters()-Methode. Wenn ja, können Sie diese Methode verwenden, um die Liste der Parameter abzurufen und dann die Werte einzufüllen. Es bietet eine schöne Möglichkeit, die Informationen "zu entdecken":

IDbCommand cmd = conn.CreateCommand();

cmd.CommandText = "SomeProcedure";
cmd.CommandType = CommandType.StoredProcedure;

// Um einen fest codierten Verweis auf einen bestimmten Anbietertyp zu vermeiden, holen Sie sich ein
// Befehlsbaumeisterobjekt und verwenden Sie Reflektion, um die Ableitungsmethode aufzurufen
DbCommandBuilder cb = dbfact.CreateCommandBuilder();
MethodInfo mi = cb.GetType().GetMethod( "DeriveParameters", 
                                 BindingFlags.Public | BindingFlags.Static );
mi.Invoke( null, new object[] { cmd } );
// Informationen zu jedem Parameter anzeigen
foreach ( IDataParameter p in cmd.Parameters )
    Console.WriteLine( "{0}, {1}, {2}", p.ParameterName, 
                       p.DbType.ToString(), p.Direction.ToString() );
IDataParameter prm = (IDataParameter)cmd.Parameters["SomeParam"];
prm.Value = "xyz";
IDataReader rdr = cmd.ExecuteReader();

0voto

Ahd Punkte 271

Das folgende Beispiel hat bei mir funktioniert (nur den Parameternamen übergeben. Ich habe dies nur für Zeichenfolgenparameter ausprobiert)

Verwenden von drDataReader Als IDataReader = _db.ExecuteReader("usp_get_systemsetting", "ORSIniPath")
  Dim iIndex Als Int32
  While (drDataReader.Read())
      iIndex = drDataReader.GetOrdinal("SETTING_CHAR")
      If drDataReader.IsDBNull(iIndex) Then
          g_sORSIniPath = ""
      Else
          g_sORSIniPath = drDataReader.GetString(i)
      End If
  End While
End Using

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X