2010-06-01 14 views

Répondre

6

Si vous utilisez le Enterprise Library, ce style va bien travailler pour vous:

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("YourConnectionString"); 
DbCommand cmd = db.GetStoredProcCommand("YourProcName"); 
cmd.Parameters.Add(new SqlParameter("YourParamName", "param value")); 

using (IDataReader dr = db.ExecuteReader(cmd)) 
{ 
    while (dr.Read()) 
    { 
     // do something with the data 
    } 
} 
+1

Ajout des références et cela a très bien fonctionné. –

8

Ce n'est pas le IDataReader qui traite les paramètres, ce serait le IDbCommand (en utilisant la méthode CreateParameter). Ensuite, vous pouvez obtenir un lecteur pour la commande en utilisant la méthode ExecuteReader.

Je mis en place un exemple simple:

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 = "parameter value"; 
     cmd.Parameters.Add(param); 
     using (IDataReader reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       // get data from the reader 
      } 
     } 
    } 
} 
+1

Oui, et définissez la propriété 'CommandType'' IDbCommand' sur 'CommandType.StoredProcedure'. – stakx

1

Certains fournisseurs .NET ont une méthode statique DeriveParameters() dans l'implémentation du générateur de commandes. Si c'est le cas, vous pouvez l'utiliser pour récupérer la liste des paramètres, puis remplir les valeurs. Il offre une belle façon de « découvrir » les informations:

IDbCommand cmd = conn.CreateCommand(); 

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

// to avoid hard coded reference to a specific provider type, get a 
// command builder object and use reflection to invoke the derive method 
DbCommandBuilder cb = dbfact.CreateCommandBuilder(); 
MethodInfo mi = cb.GetType().GetMethod("DeriveParameters", 
           BindingFlags.Public | BindingFlags.Static); 
mi.Invoke(null, new object[] { cmd }); 
// show information about each parameter 
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(); 
0

Ci-dessous l'échantillon a fonctionné pour moi (. Passant le nom du paramètre que je n'ai essayé pour les paramètres de chaîne)

Using drDataReader As IDataReader = _db.ExecuteReader("usp_get_systemsetting", "ORSIniPath") 
    Dim iIndex As 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