返回SqlDataReader方法的类型

时间:2013-07-26 18:13:24

标签: asp.net sql-server sqldatareader

我在类中有一个方法,它包含SqlDataReader(它连接到数据库表并检索多个行)。 后来我想将SqlDataReader拥有的每条记录分配给asp标签。但我不知道什么应该是方法的返回类型,所以我可以从中提取值,以及如何在代码隐藏文件中执行此操作。 这是代码;

 public (???) displayCustoemrhShipOrder()
    {
        string htmlStr = string.Empty;                   
        string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString();
        SqlConnection SqlCOn = new SqlConnection(sConnectionString);
        SqlCommand SqlCmd = new SqlCommand();
        SqlCmd.Connection = SqlCOn;
        SqlCmd.CommandText = "displayCustomerShipOrder";
        SqlCmd.CommandType = CommandType.StoredProcedure;
        SqlCOn.Open();
        SqlCmd.Parameters.AddWithValue("ShipOrderID",shipOrderID);
        SqlDataReader reader = SqlCmd.ExecuteReader();
        while (reader.Read())
        {
            htmlStr = reader.GetInt32(0).ToString();
        }
        reader.Close();
        SqlCOn.Close();            
        return(???)
    }

2 个答案:

答案 0 :(得分:2)

通常,您不应该将SqlDataReader返回到数据库访问代码之外的层。这个一般原则背后的原因是SqlDataReader是一个非常“昂贵”的对象,保持与数据库的开放连接!所以,如果你保持SqlDataReader左右,那不是很糟糕,但是如果你在任何时候保持10个左右?那100个呢? 1000?这是灾难的秘诀。

那么如何从SqlDataReader关闭与数据库的连接? .NET在名为IDisposable的{​​{1}}接口中有一个非常方便的方法,它将为您完成清理工作。所以你的代码看起来像

Dispose()

但实际上该代码存在问题。如果您的代码在到达function getData() { // instantiate SqlDataReader from SqlCommand, call it "rdr" rdr.Dispose(); } 之前抛出异常怎么办?它应该看起来像

Dispose()

这非常冗长!如果您不想输入所有内容怎么办?别担心,.NET也为您处理了这个问题。这样做:

function getData()
{
    try{
        // instantiate SqlDataReader from SqlCommand, call it "rdr"
    }
    catch(Exception){}
    Finally{
        rdr.Dispose();
    }
}

这是一种迂回的说法,如果你知道你需要public (???) displayCustoemrhShipOrder() { string htmlStr = string.Empty; string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString(); using(SqlConnection SqlCOn = new SqlConnection(sConnectionString)) { using(SqlCommand SqlCmd = new SqlCommand()) { SqlCmd.Connection = SqlCOn; SqlCmd.CommandText = "displayCustomerShipOrder"; SqlCmd.CommandType = CommandType.StoredProcedure; SqlCOn.Open(); SqlCmd.Parameters.AddWithValue("ShipOrderID",shipOrderID); using(SqlDataReader reader = SqlCmd.ExecuteReader()) while (reader.Read()) { htmlStr = reader.GetInt32(0).ToString(); } // reader.Close(); // this line becomes optional, Dispose() will call Close() } // SqlCOn.Close(); // this line becomes optional, Dispose() will call Close() } } return(???) } Dispose() SqlDataReader,并且一旦你这样做就无法从中获取数据,那么你显然应该不要将它返回到需要处理数据的代码(但不一定是它所占用的数据库连接)。我建议使用Close()课程,你可以在这里阅读:

.NET DataTable class

转换为DataTable的方法也称为DataTable

答案 1 :(得分:1)

您可以将每个单独的值添加到List<string>,然后将其返回并在方法外部使用。