어떻게 검색할 수 있습니에서 매개변수 목록에서 저장 프로시저 SQL 서버

StackOverflow https://stackoverflow.com/questions/33761

  •  09-06-2019
  •  | 
  •  

문제

를 사용하여 C#시스템입니다.데이터입니다.따,는 방법이 있을 검색하의 목록을 매개 변수에 속하는 저장된 절차에 SQL 하기 전에 서버가 실제로 그것을 실행?

나는"멀티-환경"시나리오에있는 여러 버전의 동일한 데이터베이스에 스키마.의 예 환경 될 수 있습니다"개발","준비",&"생산"."개발"가 있는 하나의 버전에 저장된 절차와"준비"해야 할 것입니다.

모든 제가 하고 싶은지 확인 매개 변수가 될 것을 전달하기 전에 그것에 가치를 호출하 저장된 절차입니다.을 피하는 SqlException 보다는 데 그것을 잡으려고 나를 위해 플러스.

여호수아가

도움이 되었습니까?

해결책

당신이 사용할 수 있습 SqlCommandBuilder.DeriveParameters()(참조하십시오 SqlCommandBuilder.DeriveParameters-얻을 매개 변수에 정보를 저장 프로시저 ADO.NET 튜토리얼 다)또는 거 이 방법 는 없는 우아한입니다.

다른 팁

SqlCommandBuilder.DeriveParameters(니다.) 방법입니다.참고 필요한 추가 라운드 여행을 데이터베이스,그래서 그것은 약간은 중요한 성능했다.고려해야 합 캐시 결과입니다.

예제 전화:

using (SqlConnection conn = new SqlConnection(CONNSTRING))
using (SqlCommand cmd = new SqlCommand("StoredProc", conn)) {
   cmd.CommandType = CommandType.StoredProcedure;
   SqlCommandBuilder.DeriveParameters(cmd);

   cmd.Parameters["param1"].Value = "12345";

   // ....
}

하지 않지만 그 정확하게 당신이 원하는 무엇을,여기에서 샘플 코드를 사용하는 이렇게 하려면 다음과 같이.GetSchema()메소드를 반환 저장된 모든 절차와 관련된 데이터베이스,그리고 이런 매개 변수 이름과 형식에 대한 각 저장된 절차입니다.예 아래드로이 변수입니다.참고로 이것은 또한 반환 모든"시스템"저장 프로시저는 바람직하지 않을 수 있습니다.

스티브

    public void LoadProcedureInfo()
    {
        SqlConnection connection = new SqlConnection();

        ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["ConnectionString"];

        connection.ConnectionString = settings.ConnectionString;
        connection.Open();

        DataTable procedureDataTable = connection.GetSchema("Procedures");
        DataColumn procedureDataColumn = procedureDataTable.Columns["ROUTINE_NAME"];

        if (procedureDataColumn != null)
        {
            foreach (DataRow row in procedureDataTable.Rows)
            {
                String procedureName = row[procedureDataColumn].ToString();

                DataTable parmsDataTable = connection.GetSchema("ProcedureParameters", new string[] { null, null, procedureName });

                DataColumn parmNameDataColumn = parmsDataTable.Columns["PARAMETER_NAME"];
                DataColumn parmTypeDataColumn = parmsDataTable.Columns["DATA_TYPE"];

                foreach (DataRow parmRow in parmsDataTable.Rows)
                {
                    string parmName = parmRow[parmNameDataColumn].ToString();
                    string parmType = parmRow[parmTypeDataColumn].ToString();
                }
            }
        }
    }

사용할 수 있습니다 SqlCommandBuilder 개체를 호출 DeriveParameters 방법입니다.

기본적으로 전달해야 합 그것은 명령에 설치되는 전화를 저장 proc,그리고 그것을 쳐 DB 을 발견하는 매개변수,그리고 만들기 적절한 매개 변수에서 매개변수의 재산입니다.

편집: 당신은 모든 너무 빨리!!

SqlCommandBuilder.DeriveParameters(command)

이 말씀은 내가 무슨 필요합니다.

여기에는 전체 코드는 샘플에 대한 해결 방법은 이 문제를 해결합니다.

Public Sub GetLogEntriesForApplication(ByVal settings As FilterSettings,
                              Optional ByVal RowGovernor As Integer = -1)

    Dim command As New SqlCommand("GetApplicationActions", 
        New SqlConnection(m_environment.LoggingDatabaseConnectionString))
    Dim adapter As New SqlDataAdapter(command)

    Using command.Connection

        With command

            .Connection.Open()
            .CommandType = CommandType.StoredProcedure

            SqlCommandBuilder.DeriveParameters(command)

            With .Parameters

                If settings.FilterOnLoggingLevel Then
                    If .Contains("@loggingLevel") Then
                        .Item("@loggingLevel").Value = settings.LoggingLevel
                    End If
                End If

                If settings.FilterOnApplicationID Then
                    If .Contains("@applicationID") Then
                        .Item("@applicationID").Value = settings.ApplicationID
                    End If
                End If

                If settings.FilterOnCreatedDate Then
                    If .Contains("@startDate") Then
                        .Item("@startDate").Value = settings.CreatedDate.Ticks
                    End If
                End If

                If settings.FilterOnEndDate Then
                    If .Contains("@endDate") Then
                        .Item("@endDate").Value = settings.EndDate.Ticks
                    End If
                End If

                If settings.FilterOnSuccess Then
                    If .Contains("@success") Then
                        .Item("@success").Value = settings.Success
                    End If
                End If

                If settings.FilterOnProcess Then
                    If settings.Process > -1 Then
                        If .Contains("@process") Then
                            .Item("@process").Value = settings.Process
                        End If
                    End If
                End If

                If RowGovernor > -1 Then
                    If .Contains("@topRows") Then
                        .Item("@topRows").Value = RowGovernor
                    End If
                End If

            End With

        End With

        adapter.TableMappings.Clear()
        adapter.TableMappings.Add("Table", "ApplicationActions")
        adapter.TableMappings.Add("Table1", "Milestones")

        LogEntries.Clear()
        Milestones.Clear()
        adapter.Fill(m_logEntryData)

    End Using

End Sub

마크는 최고의의 구현 DeriveParameters.으로 그는 말했다,당신이 캐쉬에서 같은 이 튜토리얼.

그러나 내가 이것을 생각하는 것은 위험한 방법으로 해결하는 원래의 문제 데이터베이스 sproc 버전을 관리합니다.려는 경우의 서명을 변경 절차를 추가하거나 제거하여 매개변수해야 합 다음 중 하나를 수행합니다:

  • 코드에서는 호환이 가능한 방식으로 사용하여 기본값(에 대한 새로운 params)또는 단순히 무시하고 param(에 대한 삭제 params).이렇게 하면 클라이언트 코드는 항상 모든 버전의된 절차입니다.
  • 명시적으로 버전 절차의 이름으로(그래서 당신은 my_proc 및 my_proc_v2).이렇게 하면 클라이언트 코드 및 sprocs 동기화 상태를 유지합니다.

에 의존하 DeriveParameters 유효성을 검사합니 sproc 사용하고 있는 것처럼 잘못된 업무를 위해 설계되었습니다.

이러한 모든 ADO.NET 솔루션을 요구하는 코드 라이브러리를 쿼리 데이터베이스의 메타데이터는 귀하를 대신합니다.려는 경우 그 성능을 칠 어쨌든,어쩌면 당신은 단지 일부를 작성 도우미 기능을 하는 전화

Select count(*) from information_schema.parameters 
where ...(proc name =.. param name=...) (pseudo-code)

또 어쩌면을 생성하고 매개변수를 기반으로 param 목록을 살펴볼 수 있습니다.이 기술은 여러 버전의 MS SQL 때로는 다른 ANSI SQL 데이터베이스가 있습니다.

사용 DeriveParameters 니다.NET1.1 과 2.0 은 이후 몇 년 동안 지금처럼 일니다.

지금 나는 작업에 할당니다.NET3.5 고 그냥을 발견하고 못생긴 깜짝:DeriveParameters 가 만드는 모든 매개변수와이터를 기준으로 지정"변형",대신 적절한 SqlDbTypes.이것은 만들기 SqlException 하려고 할 때 실행 SPs 숫자 매개 변수하기 때문에,SQL Server2005 는 것을 말한 sql-변형 종류 수 있 implictily 로 변환하 int(또는 smallint,또는 숫자)가지고 있습니다.

나는 그냥 테스트는 동일한 코드.NET CF2.0SQL Server2000,그리고 예상대로 작동하는 올바른터를 기준으로 지정하는 각 매개 변수입니다.

나는 테스트입니다.NET2.0 앱에 대한 SQL Server2005 데이터베이스,그래서는 SQL Server 관련 문제,그래서 그것은 무언가 있어야와 관련이다.NET3.5

어떤 아이디어가?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top