【发布时间】:2010-06-01 21:30:50
【问题描述】:
我使用 IDataReader 来调用不带参数的存储过程。我没有找到在参数存在时如何执行此操作的示例。 IDataReader 是否处理存储过程的参数?
请举个例子。
【问题讨论】:
标签: c# stored-procedures idatareader
我使用 IDataReader 来调用不带参数的存储过程。我没有找到在参数存在时如何执行此操作的示例。 IDataReader 是否处理存储过程的参数?
请举个例子。
【问题讨论】:
标签: c# stored-procedures idatareader
处理参数的不是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
}
}
}
}
【讨论】:
IDbCommand的CommandType属性设置为CommandType.StoredProcedure。
如果您使用的是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
}
}
【讨论】:
一些 .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();
【讨论】:
以下示例对我有用(仅传递参数名称。我只对字符串参数进行了尝试)
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
【讨论】: