【问题标题】:using IDataReader to call store procedure with parameters使用 DataReader 调用带参数的存储过程
【发布时间】:2010-06-01 21:30:50
【问题描述】:

我使用 IDataReader 来调用不带参数的存储过程。我没有找到在参数存在时如何执行此操作的示例。 IDataReader 是否处理存储过程的参数?

请举个例子。

【问题讨论】:

    标签: c# stored-procedures idatareader


    【解决方案1】:

    处理参数的不是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
                }
            }
        }
    }
    

    【讨论】:

    • 是的,并将IDbCommandCommandType属性设置为CommandType.StoredProcedure
    【解决方案2】:

    如果您使用的是Enterprise Library,这种风格会很适合您:

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

    【讨论】:

      【解决方案3】:

      一些 .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();
      

      【讨论】:

        【解决方案4】:

        以下示例对我有用(仅传递参数名称。我只对字符串参数进行了尝试)

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 2011-10-08
          • 1970-01-01
          • 2012-11-03
          • 1970-01-01
          相关资源
          最近更新 更多