我在类中有一个方法,它包含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(???)
}
答案 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()
课程,你可以在这里阅读:
转换为DataTable
的方法也称为DataTable
答案 1 :(得分:1)
您可以将每个单独的值添加到List<string>
,然后将其返回并在方法外部使用。