SqlServer預存程序傳入Table參數

來源:互聯網
上載者:User

標籤:style   blog   color   資料   io   for   問題   cti   

今天是周日,剛好有空閑時間整理一下這些天工作業務中遇到的問題。

有時候我們有這樣一個需求,就是在後台中傳過來一個IList<類>的泛型集合資料,該集合是某個類的執行個體集合體,然後將該集合中的執行個體的資料一個個地插入到資料庫或者更新到資料庫中去。一開始我想到的方法是拼接字串,然後通過預存程序對接收到的字串進行截取,再一個個地插入或者更新到資料庫中去,這是最原始的方法,不過過程會比較複雜,想到這就頭疼。後來尋找發現說SqlServer2008中為預存程序添加了一個新特性,可以傳遞表類型的參數,既然可以傳遞表型別參數,那問題就變得簡單啦。以下是開發中寫的code.

1.asp.net後台:

 1         /// <summary> 2         /// Add the PayrollCycle 3         /// </summary> 4         /// <param name="payrollCycle">payrollCycle</param> 5         /// <returns>bool</returns> 6         public bool AddPayrollCycle(IList<PayrollCycle> payrollCycles) 7         { 8             DataTable dataTable=new DataTable(); 9             dataTable.Columns.Add("Year",typeof(int));10             dataTable.Columns.Add("Month",typeof(int));11             dataTable.Columns.Add("CutoffDate",typeof(int));12             dataTable.Columns.Add("PayrollDate",typeof(int));13             dataTable.Columns.Add("EnterUser",typeof(string));14             dataTable.Columns.Add("EnterDate",typeof(DateTime));15             dataTable.Columns.Add("LastUpdatedUser",typeof(string));16             dataTable.Columns.Add("LastUpdatedDate",typeof(DateTime));17             foreach (PayrollCycle p in payrollCycles)18             {19                 DataRow dataRow = dataTable.NewRow();20                 dataRow["Year"] = p.Year;21                 dataRow["Month"] = p.Month;22                 dataRow["CutoffDate"] = p.CutoffDate;23                 dataRow["PayrollDate"] = p.PayrollDate;24                 dataRow["EnterUser"] = UserSession.LogOnUserAccount;25                 dataRow["EnterDate"] = DateTime.Now;26                 dataRow["LastUpdatedUser"] = UserSession.LogOnUserAccount;27                 dataRow["LastUpdatedDate"] = DateTime.Now;28                 dataTable.Rows.Add(dataRow);29             }30             31             SqlParameter[]paras=new SqlParameter[]32                                     {33                                         new SqlParameter("@PayrollCycles",dataTable)34                                     };35             return SqlHelper.ExecuteNonQuery("MCU.USP_AddPayrollCycles", paras) > 0;36         }

為dataTable添加column的時候,必須明確該列的typeof,否則在預存程序當中會把傳入的該列當成varchar類型看待,導致某些類型轉換失敗

2.在SqlServer中先定義一個Table類型的Type:

 1 CREATE TYPE [MCU].[PayrollCycleType] AS TABLE( 2     [YEAR] [int] NOT NULL, 3     [Month] [int] NOT NULL, 4     [CutoffDate] [int] NOT NULL, 5     [PayrollDate] [int] NOT NULL, 6     [EnterUser] [varchar](20) NULL, 7     [EnterDate] [datetime] NULL, 8     [LastUpdatedUser] [varchar](20) NULL, 9     [LastUpdatedDate] [datetime] NULL10 )11 GO

接著編寫一個傳入上步驟中定義的表類型的參數的預存程序,該參數為Readonly(作為表型別參數必須為可讀),代碼如下:

 1 CREATE PROCEDURE [MCU].[USP_AddPayrollCycles] 2 ( 3     @PayrollCycles MCU.PayrollCycleType Readonly  4 ) 5 AS 6 BEGIN 7     SET NOCOUNT ON 8     BEGIN TRANSACTION 9     INSERT INTO MCU.PayrollCycle10             ( 11               [Year] ,12               [Month] ,13               CutoffDate ,14               PayrollDate ,15               EnterUser ,16               EnterDate ,17               LastUpdatedUser ,18               LastUpdatedDate19             )20     SELECT    21               [Year] ,22               [Month] ,23               CutoffDate ,24               PayrollDate ,25               EnterUser ,26               EnterDate ,27               LastUpdatedUser ,28               LastUpdatedDate 29               FROM @PayrollCycles 30     COMMIT TRANSACTION           31 END32 33 GO

就這樣大功告成,用起來相當方便,就不用通過拼接字串進行資料的插入,更新操作了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.