2012-11-20 46 views
0

我有一個用於查詢DB2數據庫的包裝器。我設置包裝器的方式是創建連接並將其置於查詢方法中。這樣我的包裝的消費者就不必擔心管理(打開和關閉)連接。有沒有辦法做到這一點與存儲過程?我的一些用戶發送出站參數,是否有辦法將這些參數轉換爲數據表格,就像我在查詢中所做的那樣?存儲過程連接包裝器

/// <summary> 
    /// Query A database and return a DataTable of strings with no null 
    /// </summary> 
    /// <param name="txtQuery">The Query</param> 
    /// <param name="list">the paramaters for the query</param> 
    /// <returns>Datatable with results</returns> 
    public DataTable Query(string txtQuery, params string[] list) 
    { 
    //create return ovject 
     DataTable dt = new DataTable(); 
     //pull dbconnection out of pool 
     using (var conn = new DB2Connection(connectionstring)) 
     { 
      //open connection 
      if (!OpenConn(conn)) 
      { 
       throw new Exception(「failed to connect」); 
      } 
      try 
      { 
       //query db 
       using (DB2Command cmd = new DB2Command()) 
       { 
        cmd.Connection = conn; 
        cmd.CommandText = txtQuery; 
        for (int i = 0; i < list.Length; i++) 
        { 
         DB2Parameter param = new DB2Parameter(i.ToString(), list[i]); 
         cmd.Parameters.Add(param); 
        } 
        //fill datatable 
        using (DB2DataAdapter adap = new DB2DataAdapter()) 
        { 
         adap.SelectCommand = cmd; 
         adap.Fill(dt); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      }     
     } 
     return dt; 
    } 
+2

我不確定我是否理解了這個問題。您可以將'CommandType'設置爲'StoredProcedure'並將其用於'DataAdapter'來填充'DataTable'。 –

+0

我的理解是,對於存儲過程,您可以發送輸出參數,然後使用需要原始打開連接的數據讀取器讀取這些參數。 – user889829

+0

「SP」返回什麼?如果它是一個返回行的查詢,您可以簡單地使用適配器來填充DataTable。 –

回答

3

它不會那麼容易做到,但它是可能的。我假設DB2Parameter與本答案中的SqlParameter基本相同......

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx和相關頁面將在我在這裏說的內容(或期間)中有用。

實質上調用與你怎麼稱呼它以同樣的方式,你通常會輸出參數的過程時。對於輸出參數,您正常傳遞一個對象,但參數對象上有一個Direction屬性,允許您指定它是輸出參數。

一旦您在該過程上調用了適當的執行方法,那麼這些輸出參數的值將被填充並可以從參數對象中檢索。

將它們放入數據表然後由您決定。您可以創建一個數據表,爲每個輸出參數添加一列,然後用所有值添加一行。

這樣做的主要問題當然是,在設置數據庫調用時,您需要知道哪些參數將返回以便您可以適當地設置其方向。當你只傳遞一個字符串數組時,這幾乎肯定不會成爲可能。

對此的最好的辦法是爲其他人所說在評論返回所有數據的數據集。當前使用輸出參數的任何現有過程都可以創建包裝過程,只是捕獲輸出參數,然後將它們放入可按上述方式處理的select語句中。

另一種選擇是讓你的Query方法的調用者通過關於他們正在使用的參數的更多細節(如in或out)。就我個人而言,我寧願返回所有數據作爲選擇,而不是使用輸出參數,因爲它使這類代碼更簡單。

+0

謝謝,我認爲這會奏效 – user889829