我非常喜欢保持我的代码简单和修剪以便它可以重复使用,我正在努力使用的数据读取器用于不同类型的对象,我在一个方法中找到它并找到它连接关闭或保持开放存在问题。所以我被迫,平均时间复制并粘贴代码,这是我讨厌的东西! 有什么办法可以缩小它,所以我可以把它放在一个方法中,让它可以重复使用和漂亮吗?
ENT_AuctionBid ret = new ENT_AuctionBid();
try
{
SqlParameter[] Params = new SqlParameter[]{
new SqlParameter("@ID", ID )
};
using (SqlConnection conn = new SqlConnection(this.ConnectionString))
{
using (SqlCommand command = new SqlCommand("GetItem", conn))
{
SqlDataReader reader;
command.CommandType = CommandType.StoredProcedure;
conn.Open();
command.Parameters.AddRange(Params);
reader = command.ExecuteReader(CommandBehavior.SingleRow);
while (reader.HasRows)
{
while (reader.Read())
{
//
ret = this.Convert(reader);
}
reader.NextResult();
}
reader.Close();
}
}
}
catch (Exception ex)
{
}
return ret;
答案 0 :(得分:1)
您应该使用SQLDataAdapter 这是一个关于如何使用它的一个很好的例子: http://www.dotnetperls.com/sqldataadapter
此外,您可能需要考虑切换到实体框架,它会使您的数据访问变得更加容易,但在现有项目中可能会很复杂。
答案 1 :(得分:1)
你可以使用更少的线来制作它:
// Skipped creating temp variable
try {
using (SqlConnection conn = new SqlConnection(this.ConnectionString))
using (SqlCommand command = new SqlCommand("GetItem", conn) { CommandType = CommandType.StoredProcedure} ) {
command.Parameters.AddWithValue(@ID, ID);
conn.Open();
// reader is IDisposable, you can use using
using (var reader = command.ExecuteReader(CommandBehavior.SingleRow)) {
// Skipped parsing multiple result sets, you return after the first
// otherwise there's no point using SingleRow
// If nothing is read, return default value
return reader.Read() ? this.Convert(reader) : new ENT_AuctionBid();
}
}
}
catch (Exception ex) {
// Handle your exception here
}
// Return default value for error
return new ENT_AuctionBid();
使用此代码关闭所有连接(因为使用了使用)。不会创建不需要的循环,因为您只需要一行。并且不需要临时变量,因此不会创建abondend对象,只有在使用它时才创建它。
答案 2 :(得分:0)
您可以开始使用LINQ-to-SQL,它拥有自己的DataClass系统,您可以在其中拖放数据库表和存储过程。然后,您只需在类的顶部创建一个实例 - private MyCustomDataClass _db = new MyCustomDataClass();
,然后您只需输入_db.<Here all datatables and SPROCs will appaer for you to choose>
。
示例(从所有SPROC添加到DataClass时)
private MyCustomDataClass _db = new MyCustomDataClass();
public void MethodToRunSPROC(string email, Guid userId)
{
_db.MySPORC_AddEmailToUser(email, userId);
}
答案 3 :(得分:0)
这有点小: -
try
{
using (SqlConnection conn = new SqlConnection(this.ConnectionString))
{
using (SqlCommand command = new SqlCommand("GetItem", conn))
{
command.Paramaters.AddWithValue("@ID",ID);
command.CommandType = CommandType.StoredProcedure;
conn.Open();
reader = command.ExecuteReader();
while (reader.Read())
{
//
ret = this.Convert(reader);
}
}
}
}
catch (Exception ex)
{
}
答案 4 :(得分:0)
创建辅助方法,用于创建和返回SqlCommand类型的对象。将连接对象传递给此辅助方法以及存储过程名称和参数列表(如果有)。如果您有从数据读取器创建的不同对象,请将数据读取器传递给构造函数,然后让它根据该数据生成对象。 至于关闭连接,你应该总是尝试...抓住......最后。在finally部分中关闭连接。
答案 5 :(得分:0)
在我的项目中,我通常会解决这个问题,创建一个实用程序类,其中包含访问数据库的所有方法,并管理与数据库连接和适配器相关的所有内容。 例如,一个名为DBSql的类,它包含一个连接(SqlConnection连接;)作为私有成员和以下方法:
//execute the query passed to the function
public System.Data.DataSet ExecuteQuery(string query)
//returns if a query returns rows or not
public bool HasRows(string query)
//execute commands like update/insert/etc...
public int ExcuteNonQuery(string sql)
在我的课程中,您只需传递一个字符串,该类初始化各种DataAdapter和Command以执行它并返回一个数据集。很奇怪,你可以使它复杂化以管理参数/事务和其他一切。 通过这种方式,您可以确保连接和对象始终以相同的方式处理,并且希望以正确的方式处理。
答案 6 :(得分:0)
您可以使用实用程序文件,例如Microsoft Data Access Application Block中的SqlHelper.cs。那么你需要的所有代码都是:
using (SqlDataReader sdr = SqlHelper.ExecuteReader(this.ConnectionString, "GetItem", ID))
{
while (sdr.Read())
{
ret = this .Convert(sdr);
}
}