首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回SqlDataReader

返回SqlDataReader
EN

Stack Overflow用户
提问于 2012-04-20 19:40:09
回答 5查看 38K关注 0票数 12

我有这样的代码:

代码语言:javascript
复制
public static SqlDataReader GetGeneralInformation ( int RecID )
{
    using ( var conn = new SqlConnection( GetConnectionString() ) )
    using ( var cmd = conn.CreateCommand() )
    {
        conn.Open();
        cmd.CommandText =
        @"SELECT cs.Status, cs.Completed
          FROM NC_Steps s
          INNER JOIN NC_ClientSteps cs
              ON cs.RecID = s.RecID
          WHERE cs.ClientID = 162
          AND s.RecID = @value";
        cmd.Parameters.AddWithValue( "@value", RecID );
        using ( var reader = cmd.ExecuteReader() )
        {
            if ( reader.Read() )
            {
                return reader;
            }
            return null;
        }
    }
}

我该怎么引用这个?

我试过了,但没有用。

代码语言:javascript
复制
SqlDataReader reader = GeneralFunctions.GetGeneralInformation();

另外,我如何从读者那里读到?

代码语言:javascript
复制
Reader.GetString( reader.GetOrdinal( "Status" ) )

编辑

我现在收到以下错误:

异常详细信息: System.NullReferenceException:对象引用未设置为对象实例。

以下是更新的代码:

代码语言:javascript
复制
public static IEnumerable<IDataRecord> GetGeneralInformation ( int ClientID )
{
    using ( var conn = new SqlConnection( GetConnectionString() ) )
    using ( var cmd = conn.CreateCommand() )
    {
        conn.Open();
        cmd.CommandText =
        @"SELECT i.GoLiveDate, i.FirstBonusRun, i.TechFName, i.TechLName, i.TechEmail, i.TechPhone, i.WebISPFName, i.WebISPLName, 
          i.WebISPEmail, i.WebISPPhone, i.FullFillFName, i.FullFillLName, i.FullFillEmail, i.FullFillPhone, d.FName,
          d.LName, d.HomePhone, d.Email
          FROM NC_Information i
          INNER JOIN Distributor d
            ON d.DistID = i.ClientID
          WHERE clientID = @value";
        cmd.Parameters.AddWithValue( "@value", ClientID );
        using ( var reader = cmd.ExecuteReader() )
        {
            while ( reader.Read() )
            {
                yield return reader;
            }
            yield return null;
        }
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    IEnumerable<IDataRecord> reader = GeneralFunctions.GetGeneralInformation( (int)Session[ "DistID" ] );

    //string result = GeneralFunctions.GetGeneralInformation( Globals.GeneralInformation ).First()[ "Status" ].ToString();
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-20 19:45:54

问题是保留函数(通过返回语句)将您踢出using块,因此您使用的SqlDataReaderSqlConnections将被释放。要解决这个问题,请尝试像下面这样更改函数签名:

代码语言:javascript
复制
public static IEnumerable<IDataRecord> GetGeneralInformation ( int RecID )

然后更新函数的中间,如下所示:

代码语言:javascript
复制
using ( var reader = cmd.ExecuteReader() )
{
    while ( reader.Read() )
    {
        yield return reader;
    }
}

最后的“我该怎么读?”部分原因可能是这样的:

代码语言:javascript
复制
int RecID = 12345;
string result = GetGeneralInformation(RecID).First()["Status"].ToString();
票数 21
EN

Stack Overflow用户

发布于 2014-02-22 00:19:18

将连接字符串添加到AppSettings节中的app.config或web.config中。

代码语言:javascript
复制
   public string GetSqlConnection()
    {
        return  System.Configuration.ConfigurationManager.AppSettings["SqlConnectionString"];
    }

返回SqlDataReader结果的//函数

代码语言:javascript
复制
    public SqlDataReader executeReader(string sql, SqlParameter[] parameters=null)
    {
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = GetSqlConnection();
        conn.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = sql;
        if (parameters != null)
        {
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter p in parameters)
            {
                cmd.Parameters.Add(p);
            }
        }
        else
        {
            cmd.CommandType = CommandType.Text;
        }
        SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        return reader;
    }

要使用该功能:

代码语言:javascript
复制
        string query = @"SELECT cs.Status, cs.Completed
      FROM NC_Steps s
      INNER JOIN NC_ClientSteps cs
          ON cs.RecID = s.RecID
      WHERE cs.ClientID = 162
      AND s.RecID = @value";
       //you can add more parameters by adding commas
       var parameters = new SqlParameter[] {
            new SqlParameter("@value", RecID )
           };

        SqlDataReader dr = executeReader(query, parameters);
        while (dr.Read())
        {
            //fill your controls with data 
        }
        dr.Close();
票数 6
EN

Stack Overflow用户

发布于 2016-10-09 11:23:58

我认为this StackOverflow answer值得一提。一种非常简单且易于使用的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10252531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档