使用SQLCommandBuilder.DeriveParameters取出SP參數
前言
我們有個案子使用的報表工具是MS的Report Service,可是客戶要求我們如果沒有資料時,就要Show「無符合資料」的訊息!
有告訴客戶說,如果這樣搞的話,等於AP要先去Run一次,之後Report還要再Run一次。客戶說沒有資料就是不要看到Report出來!
研究
我們的報表都是用SP去產生資料的,所以就在開報表的底層物件裡,取出該Report要Run的SP,然後偷偷先Run一次看有沒有資料,有的話,再去開啟Report,沒有的話,就發一個「沒有符合資料」的訊息出去!
以下是取得SP的參數值,然後去執行它看看有沒有資料,有的話就回傳True,沒有就回傳False! 主要說明,可以使用SqlCommandBuilder.DeriveParameters來取得SP的參數。
Dim blnResult As Boolean = False '是否有資料(預設為False) Try mobjConn.OpenConnection() Dim cmdSelect As SqlClient.SqlCommand = New SqlClient.SqlCommand With cmdSelect .Connection = mobjConn .CommandType = CommandType.StoredProcedure .CommandText = strSPName End With '取出cmdSelect的SP參數 System.Data.SqlClient.SqlCommandBuilder.DeriveParameters(cmdSelect) Dim spParameter As SqlClient.SqlParameter For Each spParameter In cmdSelect.Parameters If spParameter.Direction = ParameterDirection.Input Or spParameter.Direction = ParameterDirection.InputOutput Then Dim paramsString As String = String.Empty 'Enumerate properties and create report server specific string. '以下這段是取出給Reporting Service的參數,去跟SP的參數對應,有對到就Assign值 Dim customPropEnumerator As IDictionaryEnumerator = Me.ReportParameters.GetEnumerator() While customPropEnumerator.MoveNext() If spParameter.ParameterName.ToUpper.Trim = "@" & customPropEnumerator.Key.ToString.ToUpper.Trim Then If spParameter.SqlDbType = SqlDbType.Char Then spParameter.SqlDbType = SqlDbType.VarChar End If spParameter.Value = Server.UrlDecode(customPropEnumerator.Value).Trim Exit While End If End While End If Next '指定完成後,執行看看有沒有資料 cmdSelect.CommandTimeout = 3600 Dim rdSqlReader As SqlClient.SqlDataReader = cmdSelect.ExecuteReader blnResult = rdSqlReader.Read rdSqlReader.Close() Finally mobjConn.CloseConnection() End Try Return blnResult
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^