使用IDataReader调用带参数的存储过程

10

我使用IDataReader调用没有参数的存储过程。我没有找到如何在参数存在的情况下执行此操作的示例。是否可以通过IDataReader处理存储过程的参数?

请提供一个例子。

4个回答

8

不是 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
            }
        }
    }
}

1
是的,并将IDbCommandCommandType属性设置为CommandType.StoredProcedure - stakx - no longer contributing

7
如果您正在使用企业库,那么这种风格将对您有很大帮助:
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
一些.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();

0
以下示例对我有效(只传递参数名称。我只尝试过对字符串参数使用此方法)
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接