C#:如何缩短代码以运行存储过程?

时间:2011-11-15 14:06:43

标签: c# ado.net sqldatareader

我非常喜欢保持我的代码简单和修剪以便它可以重复使用,我正在努力使用的数据读取器用于不同类型的对象,我在一个方法中找到它并找到它连接关闭或保持开放存在问题。所以我被迫,平均时间复制并粘贴代码,这是我讨厌的东西! 有什么办法可以缩小它,所以我可以把它放在一个方法中,让它可以重复使用和漂亮吗?

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;

7 个答案:

答案 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);
    }
  }