0

我在一个类中有一个方法,它包含 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(???)
    }
4

2 回答 2

2

通常,您永远不应该返回SqlDataReader到数据库访问代码之外的层。这个一般原则背后的原因是它SqlDataReader是一个非常“昂贵”的对象,它保持与数据库的开放连接!因此,如果您保持一个SqlDataReader周围,那还不错,但是如果您在任何给定时间保持 10 个周围都是?其中100个呢?1000?这是灾难的秘诀。

那么如何关闭从 SqlDataReader 到数据库的连接呢?.NET 在IDisposable调用的接口中有一个非常方便的方法Dispose(),它将为您处理清理工作。所以你的代码可能看起来像

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

但实际上该代码存在问题。如果您的代码在到达之前抛出异常Dispose()怎么办?它应该看起来像

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

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

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()Close()SqlDataReader,并且一旦你这样做就无法从中获取数据,那么你显然不应该将它返回给需要处理数据的代码(但不一定是它占用的数据库连接)。我建议使用一个DataTable类,你可以在这里阅读它:

.NET 数据表类

DataTable还调用了转换为 a 的方法DataTable.Load(SqlDatareader...

于 2013-07-26T18:46:48.263 回答
1

您可以添加每个单独的值以List<string>返回它并在方法之外使用。

于 2013-07-26T18:17:29.457 回答