這段時間在做一個價格平台的項目時候,同事讓我寫一個存儲過程。該存儲過程是根據查詢條件得出一組新數據,並且返回該組數據的總條數,此處的存儲過程我用到了分頁,其中主要知識點和難點是之前做項目的時候沒有用到過存儲過程輸出參數,更沒有在C#調用存儲過程的時候得到輸出參數的值,因此在網上搜了一會很快找到答案。
此處難點一:輸出參數的定義
-- Add the parameters for the stored procedure here @title varchar(100), @pageindex int, @pagesize int, @result_value int out -- 輸入出參數
難點二:在數據庫中執行(exec)存儲過程輸出參數怎么用
--首先定義輸出參數 DECLARE @result_value int exec [searchdata] '三',2,2,@result_value output --搜索輸出參數值 SELECT @result_value
難點三:改造數據庫操作類
在下面的操作方法參數中定義了一個out類型的輸出參數,目的是在調用下面的方法的時候給數據總條數賦值。
/// <summary> /// 執行存儲過程取得數據 /// </summary> /// <param name="storeName">存儲過程名字</param> /// <param name="parameters">存儲過程參數</param> /// <returns></returns> public static DataTable ExecuteStoredPro(string storeName, out int resultcount, string title, int pageindex, int pagesize) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = storeName; SqlParameter[] para ={ new SqlParameter("@title",SqlDbType.Int), new SqlParameter("@pageindex",SqlDbType.Int), new SqlParameter("@pagesize",SqlDbType.Int), new SqlParameter("@result_value",SqlDbType.Int) }; para[0].Value = title; para[1].Value = pageindex; para[2].Value = pagesize; para[3].Direction = ParameterDirection.Output; //設定參數的輸出方向 cmd.Parameters.AddRange(para);// 將參數加入命令對象 SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); adapter.Fill(dt); resultcount = Convert.ToInt32(cmd.Parameters[3].Value); return dt; } } }
總結:技術難點分解完成順便把存儲過程公布一下

ALTER PROCEDURE [dbo].[searchdata] -- Add the parameters for the stored procedure here @title varchar(100), @pageindex int, @pagesize int, @result_value int out -- 輸入出參數 AS BEGIN declare @resultcount int --創建臨時數據庫表開始 if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[#tmp_linshi]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) begin drop table #tmp_linshi end else begin CREATE TABLE #tmp_linshi (id int identity(1,1),nid int,channel_id int,company_id int,title varchar(150),retail_price nvarchar(20)) end --創建臨時數據庫表結束 --超市商品數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,retail_price from dbo.eazy_life where title like '%'+@title+'%' --家用電氣數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,retail_price from dbo.eazy_appliances where title like '%'+@title+'%' --汽車數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,retail_price from dbo.eazy_car where title like '%'+@title+'%' --農貿數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,price from dbo.eazy_farm where title like '%'+@title+'%' --醫葯數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,retail_price from dbo.eazy_medicine where title like '%'+@title+'%' --客運數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,price from dbo.eazy_amtrack where title like '%'+@title+'%' --景點數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,price from dbo.eazy_scenic where title like '%'+@title+'%' --旅行社數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,price from dbo.eazy_travel where title like '%'+@title+'%' --酒店住宿數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,price from dbo.eazy_hotel where title like '%'+@title+'%' --文化娛樂數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,price from dbo.eazy_culture where title like '%'+@title+'%' --餐飲美食數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,price from dbo.eazy_food where title like '%'+@title+'%' --電力電纜數據查詢 insert into #tmp_linshi (nid,channel_id,company_id,title,retail_price) select id,channel_id,company_id,title,retail_price from dbo.eazy_electric where title like '%'+@title+'%' select @result_value=COUNT(*) from #tmp_linshi select * from (select *,ROW_NUMBER() over(order by id) rownum from #tmp_linshi) t where t.rownum>=(@pageindex-1)*@pagesize+1 and t.rownum<=@pageindex*@pagesize END