使用SQLCommandBuilder.DeriveParameters取出SP參數

使用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:從零開始的軟體開發生活

請大家繼續支持 ^_^