2010-06-01 11 views

Respuesta

6

Si está utilizando el Enterprise Library, este estilo va a funcionar bien para usted:

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

Agregó las referencias y funcionó muy bien. –

8

No es el IDataReader que trata de los parámetros, que sería el IDbCommand (utilizando el método CreateParameter). Luego puede obtener un lector para el comando usando el método ExecuteReader.

que armar un ejemplo sencillo:

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

Sí, y establece la propiedad 'CommandType' de' IDbCommand' en 'CommandType.StoredProcedure'. – stakx

1

Algunos proveedores de .NET tienen un método estático DeriveParameters() en la implementación del constructor de comandos. Si es así, puede usar eso para recuperar la lista de parámetros y luego completar los valores. Proporciona una buena manera de "descubrir" la información:

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

A continuación la muestra se ha trabajado para mí (. Pasando el nombre de parámetro sólo solo he probado esto para los parámetros de cadena)

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 
Cuestiones relacionadas