ADO.NET C# - 使用預存程序

  • 15747
  • 0
  • 2017-08-31

此篇簡單介紹如使用ADO.NET呼叫預存程序與取得SSMS中的相關資訊。


 

有關於Stored Procedure的參考網站 : 

 

低階模組(被呼叫端) 方法 : 

#region 所有衍生類別都應至此查詢欲查詢資料。
/// <summary>
/// 使用SP查詢指定TB。目前只提供欄位資料型態為string的查詢,若不需要請設置NULL
/// </summary>
/// <param name="uConn">設置好的連線</param>
/// <param name="tableName">TB名稱</param>
/// <param name="columnName">指定欄位</param>
/// <param name="columnValue">欲查詢的值</param>
/// <param name="SpOut">SP參數回傳OUTPUT</param>
/// <param name="SpReturn">SP回傳RETURN</param>
/// <returns></returns>
protected DataTable connectSqlForSelectTb(SqlConnection uConn, string tableName,
  string columnName, string columnValue,
    out SqlParameter SpOut, out SqlParameter SpReturn)
{
    // 指定委派接收 SSMS 中的Message相關資訊
    uConn.InfoMessage += new SqlInfoMessageEventHandler(this.cn_InfoMessage);
    // 第一個參數為預存程序的名稱
    using (SqlCommand cmd2 = new SqlCommand("selectSp_testWebWms", uConn))
    {
        cmd2.CommandType = CommandType.StoredProcedure; //選擇SqlCommand的指令型別
        // 新增參數(須對應到預存程序中的參數名稱與其形態)並賦予其值
        cmd2.Parameters.Add(new SqlParameter("@TbName", SqlDbType.NVarChar)).Value = tableName;
        if (columnName != null && columnValue != null)
        {
            cmd2.Parameters.Add(new SqlParameter("@ColumnName", SqlDbType.NVarChar)).Value = columnName;
            cmd2.Parameters.Add(new SqlParameter("@ColumnValue", SqlDbType.NVarChar)).Value = columnValue;
        }
        SqlParameter outValParam = cmd2.Parameters.Add("@OutP", SqlDbType.Int); //新增OUT的變數
        outValParam.Direction = ParameterDirection.Output; //指定為 ReturnValue,接收 SP 輸出參數
        SqlParameter retValParam = cmd2.Parameters.Add("@RETURN_VALUE", SqlDbType.Int); //新增RETURN的變數
        retValParam.Direction = ParameterDirection.ReturnValue; //指定為 ReturnValue,接收 SP回傳的資料
        SqlDataAdapter da = new SqlDataAdapter(cmd2);   //建立da並,將其初始化
        DataSet ds = new DataSet(); //創建 ds
        try
        {
            da.Fill(ds, "VirtualTbName");    //使ds與sql server橋接,並設定TB名稱。(此時啟動連線)
            SpOut = outValParam;
            SpReturn = retValParam;
            return ds.Tables["VirtualTbName"];
        }
        catch (Exception ex)
        {
                ForWebPageGetSetInfo.javaMessageBox(ex.ToString());
                throw ex.GetBaseException();
        }
    }
}
#endregion

#region 給 SqlInfoMessageEventHandler 事件,註冊用的方法。
protected void cn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    // HttpContext.Current.Response.Write(e.GetType().Name.ToString())
    // e.Message.ToList().ForEach(x => ForWebPageGetSetInfo.javaMessageBox("SP:" + x.ToString()));
    for (int i = 0; i < e.Errors.Count; i++)
    {
        ForWebPageGetSetInfo.javaMessageBox("SP:" + e.Errors[i].Message);
    }
}
#endregion

 

高階模組(呼叫端) 方法 :

#region 接收SP回傳TB,並回傳該DATATABLE。 
public DataTable selectData(ForWebPageGetSetInfo.TableChnaces CheckUse, SqlConnection uConn, string seleColumnNmae = "",
    string seleColumnValue = "")
{
    if (CheckUse != ForWebPageGetSetInfo.TableChnaces.GoodMast)
    {
        throw new NotImplementedException();
    }
    SqlParameter sp_out, sp_return;
    DataTable baseReturn;
    if (seleColumnNmae != "" && seleColumnNmae != "") // 若沒有設置則是全部資料抓取
    {
        baseReturn = base.connectSqlForSelectTb(uConn, this.IsTbName,
        seleColumnNmae, seleColumnValue, out sp_out, out sp_return);
    }
    else baseReturn = base.connectSqlForSelectTb(uConn, this.IsTbName, null, null, out sp_out, out sp_return);
    ForWebPageGetSetInfo.javaMessageBox("sp_out: " + sp_out.Value.ToString() + "  " +
        "sp_return: " + sp_return.Value.ToString());
    return baseReturn;
}
#endregion

 

使用的預存程序 : 

USE [test_web_wms]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[selectSp_testWebWms](
@TbName NVARCHAR(50),@ColumnName NVARCHAR(50)='',@ColumnValue NVARCHAR(100)=''
,@OutP INT= '' OUT  )--若找到回傳找到筆數@OutP
AS
DECLARE @_sqlCmd NVARCHAR(500) ='' --需先初始化否則無法使用
BEGIN
--該程序是傳回資料表格 1.TB名稱 2.欄位名稱 3.欲查詢值 (全欄位回傳)
	-- 參數 2 or 3 其中一個沒有則帶回整個資料表格
	-- 針對欲查詢條件 目前只開放STRING的資料型態
--若找無資料表或欄位名稱時 找無TB RETURN 1 找無欄位 RETURN 2,
--若查詢時發生錯誤,系統報錯 PRINT。並回傳 -1
--若預設值都正確,找到資料後或無找無資料 RETURN TABLE , 
--輸出參數 @OutP 回傳找到的數量。
	SET NOCOUNT ON
	DECLARE @spReturn INT = ''
	IF @ColumnName=''
	BEGIN
		EXEC @spReturn =  [dbo].[CheckSpHave_TableOrColumn] @TbName
		IF @spReturn <> 0 BEGIN RETURN @spReturn END
	END
	ELSE
		BEGIN
		EXEC @spReturn =  [dbo].[CheckSpHave_TableOrColumn] @TbName,@ColumnName
		IF @spReturn <> 0 BEGIN RETURN @spReturn END
	END
	SET @OutP = 0
	SET @_sqlCmd = @_sqlCmd + N'SELECT * FROM '+@TbName+N' '
	BEGIN TRY
		IF @ColumnName='' OR @ColumnValue = ''
		BEGIN
			SET @_sqlCmd = @_sqlCmd+N'WHERE 1=1'
			EXEC [dbo].sp_executesql @_sqlCmd
			SET @OutP=@@ROWCOUNT
			Print '查詢成功'
		END
		ELSE
		BEGIN
			SET @_sqlCmd = @_sqlCmd+ N'WHERE ' + @ColumnName + N' = @ColumnValue'
			EXEC [dbo].sp_executesql @_sqlCmd,N'@ColumnValue NVARCHAR(100)',@ColumnValue
			SET @OutP=@@ROWCOUNT
			Print '查詢成功'
		END
	END TRY
	BEGIN CATCH
		PRINT N'Error Line: ' + CONVERT(NVARCHAR(100),ERROR_LINE())
		PRINT N'Error Number: '+CONVERT(NVARCHAR(100),ERROR_NUMBER())
		PRINT N'Error Message: ' +CONVERT(NVARCHAR(100),ERROR_MESSAGE())
		RETURN -1
	END CATCH
END

 

 


多多指教!! 歡迎交流!!

你不知道自己不知道,那你會以為你知道