返回SqlDataReader

我有这个代码:

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

我该如何参考?

我试过这个,但它不起作用。

 SqlDataReader reader = GeneralFunctions.GetGeneralInformation(); 

另外我怎么读读者?

 Reader.GetString( reader.GetOrdinal( "Status" ) ) 

编辑

我现在收到以下错误:

exception详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

这是更新的代码:

 public static IEnumerable 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 reader = GeneralFunctions.GetGeneralInformation( (int)Session[ "DistID" ] ); //string result = GeneralFunctions.GetGeneralInformation( Globals.GeneralInformation ).First()[ "Status" ].ToString(); } 

问题是离开函数(通过return语句)将你踢出using块,因此你正在使用的SqlDataReader和SqlConnections被释放。 要解决此问题,请尝试更改function签名,如下所示:

 public static IEnumerable GetGeneralInformation ( int RecID ) 

然后像这样更新函数的中间部分:

 using ( var reader = cmd.ExecuteReader() ) { while ( reader.Read() ) { yield return reader; } } 

对于最后的“如何从中读取?” 部分,它可能看起来像这样:

 string result = reader.First()["Status"].ToString(); 

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

  public string GetSqlConnection() { return System.Configuration.ConfigurationManager.AppSettings["SqlConnectionString"]; } 

//返回SqlDataReader结果的函数

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

要使用该function:

  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(); 

我相信这个StackOverflow答案值得一提。 一个非常简单和令人愉快的解决方案。

问题是您方法中创建数据库连接。

如果要在多个方法之间共享数据库资源,请将SqlConnection移到此范围之外。

这样你就可以从这个函数返回Reader,它会一直存在。

另外,不要在此函数中使用.Read(),只返回对象。

根据定义, using语句应该在调用后调用对象。

因此,在您返回数据阅读器后,它将被处理掉。