2011-11-15 82 views
0

我很喜歡保持我的代碼簡單和修剪,因此它可以重複使用,對於我正在努力的事情是使用數據讀取器來處理不同類型的對象,我將它放在一個方法中,並在那裏找到連接關閉或開放的問題。所以我被迫,在同時複製和粘貼代碼,這是我討厭的東西! 有沒有什麼辦法可以縮小這個比例,所以我可以把它放在一個方法中,使它可以重用和很好?C#:如何縮短我的代碼以運行存儲過程?

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; 

回答

1

您應該使用的SqlDataAdapter。
下面是關於如何使用它的一個很好的例子: http://www.dotnetperls.com/sqldataadapter

而且,你可能要考慮切換到實體框架,它會讓你的數據訪問非常非常容易,但在現有的項目可能會變得複雜。

+0

SqlDataAdapter有很多開銷 - 這真的不需要在這裏......所以我會投反對票。 EF可能在選項 –

+0

我切換到實體框架,太棒了! – Funky

0

你可以開始使用LINQ到SQL,它有它自己的數據類的系統中,你只需拖拽& -drop你的數據庫表和存儲過程。然後,您只需在類的頂部創建一個實例 - private MyCustomDataClass _db = new MyCustomDataClass();,然後您只需鍵入_db.<Here all datatables and SPROCs will appaer for you to choose>即可。

例(當所有存儲過程添加到數據類的)

private MyCustomDataClass _db = new MyCustomDataClass(); 

public void MethodToRunSPROC(string email, Guid userId) 
{ 
    _db.MySPORC_AddEmailToUser(email, userId); 
} 
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) 
     { 

     } 
0

創建用於創建和返回類型爲SqlCommand的對象的幫助器方法。將連接對象傳遞給此輔助方法以及存儲過程名稱和參數列表(如果有)。如果您有不同的數據讀取器創建的對象,請將數據讀取器傳遞給構造器,並讓它根據這些數據生成一個對象。 至於關閉連接,你應該總是嘗試......趕上......終於。在最後一節中關閉連接。

+0

使用將調用將關閉連接的處理。 –

+0

是的。只是@Funky說他在某些地方保持開放的連接方面存在問題。我個人使用try..catch..finally而不是使用(),因爲我的連接也是由輔助方法創建的,因爲我通常必須在後臺執行某些日誌記錄。然後有一個關閉連接幫助器方法,它在連接關閉之前執行一些檢查,並將其放置在finally塊中。 –

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的和司令部執行它並返回一個數據集。有意思的是,你可以把它複雜化來管理參數/事務和其他一切。 以這種方式確保連接和對象總是以相同的方式處理,並且希望以正確的方式處理。

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(); 

所有連接都使用此代碼(因爲是用來使用)關閉。沒有不必要的循環創建,因爲你只希望單行。並且臨時變量不是必需的,所以不會創建該隨機對象,只有在它被創建時才使用它。

0

您可以使用Microsoft Data Access Application Block等實用程序文件,例如SqlHelper.cs。然後你需要的所有代碼是這樣的:

using (SqlDataReader sdr = SqlHelper.ExecuteReader(this.ConnectionString, "GetItem", ID)) 
    { 
    while (sdr.Read()) 
    { 
     ret = this .Convert(sdr); 
    } 
    }