использование IDataReader для вызова процедуры хранилища с параметрами

Я использую IDataReader для вызова хранимых процедур без параметров. Я не нахожу примеры того, как сделать это, когда параметры присутствуют. IDataReader обрабатывает параметры хранимой процедуры?

Обеспечьте пример.

10
задан dan_vitch 1 June 2010 в 21:30
поделиться

3 ответа

Если вы используете Корпоративную библиотеку , вам подойдет этот стиль:

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
    }
}
7
ответ дан 3 December 2019 в 21:58
поделиться

С параметрами работает не IDataReader , а IDbCommand (с использованием метода CreateParameter ). Затем вы можете получить средство чтения для команды, используя метод ExecuteReader .

Я собрал простой пример:

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
            }
        }
    }
}
8
ответ дан 3 December 2019 в 21:58
поделиться

Некоторые поставщики .NET имеют статический метод DeriveParameters () в реализации построителя команд. Если это так, вы можете использовать это, чтобы получить список параметров, а затем ввести значения. Он обеспечивает удобный способ "обнаружения" информации:

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();
1
ответ дан 3 December 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: