성명: 이 기사는 "컴퓨터 응용 프로그램" 23권 11호에 게재되었습니다.
개요: 다양한 시스템을 개발할 때 저장 프로시저를 사용하는 것은 좋은 습관입니다. 이는 임시 테이블, 함수, 커서와 같은 기능을 가져올 뿐만 아니라 디버깅, 업그레이드, 유지 관리가 편리해집니다. 그러나 거의 모든 저장 프로시저 호출은 동일한 모드에 있으며, 주요 차이점은 각 저장 프로시저의 매개 변수가 다르다는 것입니다. 그렇다면 모든 저장 프로시저 호출을 통합하고 불필요한 프로그래밍을 줄이는 방법을 사용할 수 있습니까? SQL Server 데이터베이스 및 ASP.NET에 대한 연구를 기반으로 우리는 통합 호출 방법을 구현했습니다. 이 방법은 호출할 저장 프로시저의 이름과 호출 시 특정 매개변수 값만 제공하면 됩니다. 절차를 호출할 수 있습니다.
키워드: 저장프로시저, 시스템 테이블, 정보구조뷰, ADO.NET 문서식별코드: ② 실무적 기술성과 보고서(기술), 이론적 학습 및 사회실천 요약(사회과학)
.NET에서 동일한 방식으로 저장 프로시저 호출
개요: 저장 프로시저를 사용하는 것은 프로젝트를 개발할 때 좋은 습관입니다. 임시 테이블, 함수 및 커서를 제공하고 디버깅, 업그레이드, 유지 관리도 이점을 얻을 수 있습니다. 그러나 저장 프로시저에 대한 거의 모든 호출은 동일한 패턴입니다. 차이점은 모든 저장 프로시저의 매개 변수입니다. 그러면 차이점에도 불구하고 동일한 방식으로 저장 프로시저를 호출하여 프로그래밍 코드를 줄일 수 있습니다. 귀하가 제공하는 정보는 다음과 같습니다. 저장 프로시저 이름과 해당 매개변수 값을 사용하면 매개변수를 직접 만들 필요가 없습니다. 키워드: Stord 프로시저, 시스템 테이블, 정보 스키마, ADO.NET
요약: 프로젝트 개발 시 종종 저장 프로시저. 그러나 거의 모든 저장 프로시저 호출은 동일한 패턴으로 이루어집니다. 주요 차이점은 생성된 각 매개변수의 유형과 값에 있습니다. 그렇다면 하나의 함수(또는 클래스)를 통해 모든 저장 프로시저를 호출하는 것이 가능한가요? 이 기사에서는 데이터베이스에서 제공하는 시스템 테이블을 사용하는 원칙에 따라 통합 호출 방법을 구현합니다. 이 방법은 호출할 저장 프로시저의 이름과 호출 시 특정 매개변수 값만 제공하면 됩니다. 저장 프로시저를 호출할 수 있습니다.
개요: 프로젝트 개발 중에 데이터베이스 시스템의 저장 프로시저를 호출해야 합니다. 그러나 저장 프로시저 호출은 거의 동일하며 주요 차이점은 매개변수 유형이나 값 등의 차이입니다. 함수(또는 클래스)? 데이터베이스 시스템에서 제공하는 시스템 테이블을 기반으로 이 문서에서는 저장 프로시저를 호출하는 클래스를 작성했습니다. 저장 프로시저를 호출하기 위해 제공하는 유일한 매개 변수는 저장 프로시저의 이름입니다. 저장 프로시저의 모든 매개변수 값.
<DIV 클래스=text4><B>1. 소개</B></DIV>
다양한 시스템을 개발할 때 저장 프로시저를 사용하는 것은 임시 테이블, 함수, 커서와 같은 기능을 제공할 뿐만 아니라 디버깅, 업그레이드 및 유지 관리도 더 쉽게 만들어주는 좋은 습관입니다. 저장 프로세스 중에 데이터를 처리한 다음 반환할 수 있으므로 데이터에 대한 더 많은 분석과 제어가 가능합니다. 저장 프로시저 호출에서 우리는 저장 프로시저 호출이 거의 다음 패턴을 따른다는 것을 발견했습니다.
1. SqlConnection 선언
2. SqlCommand를 선언하고 해당 Connection 속성을 방금 선언한 SqlConnection 인스턴스로 설정하고 CommandName을 저장 프로시저 이름으로 설정하고 CommandType을 저장 프로시저로 설정합니다.
3. 방금 선언한 SqlCommand 인스턴스의 매개 변수 컬렉션에 저장 프로시저 호출에 필요한 모든 매개 변수를 추가합니다. 4. SqlCommand의 ExecuteReader() 메서드를 호출하여 저장 프로시저에서 반환된 행 집합을 가져옵니다.
4. SqlDataAdapter 및 DataSet을 선언하고 SqlDataAdapter의 SelectCommand 속성을 3에서 선언된 인스턴스로 설정한 다음 Fill 메서드를 호출하여 반환된 행 집합을 DataSet에 채웁니다.
5. SqlConnection 개체를 닫습니다.
6. 선언된 각 개체 인스턴스를 해제합니다(참고: 4는 두 가지 데이터 추출 방법을 나타냄). 이 호출 프로세스 중에 거의 모든 저장 프로시저 호출이 2단계의 저장소에 있음을 확인했습니다. 프로세스 이름이 다릅니다. 3단계의 각 저장 프로시저 호출에 사용된 매개변수와 다릅니다. 매개변수 이름, 방향, 데이터 유형, 길이 등에 차이가 있습니다. 그렇다면 모든 저장 프로시저 호출을 구현하는 방법이 있습니까? 즉, 저장 프로시저 이름을 제공한 다음 매개변수 값을 호출 메서드에 전달하여 저장 프로시저 호출을 실현한 다음 특정 데이터 구조를 사용하여 반환된 행 집합, 나가는 매개변수 값 및 반환 값을 처리합니다. SQL Server의 시스템 테이블을 연구한 후 우리는 이 아이디어가 실현 가능하다는 것을 알았습니다.
2. 시스템 테이블 및 정보 구조 보기
SQL Server와 같은 관계형 데이터베이스는 어떤 방식으로든 데이터베이스에 메타데이터를 저장합니다. SQL Server에서는 시스템 데이터베이스와 시스템 테이블입니다. SQL Server를 설치하면 master, model, msdb 및 tempdb의 네 가지 시스템 데이터베이스가 자동으로 생성됩니다. 마스터 데이터베이스는 SQL Server의 모든 시스템 수준 정보를 보관하는 창고입니다. 로그인 계정, 구성 설정, 시스템 저장 프로시저 및 기타 데이터베이스의 존재는 master 데이터베이스에 기록됩니다. msdb 데이터베이스는 SQL Server 에이전트 정보를 저장합니다. 작업, 운영자 및 경고가 정의되면 msdb에 저장됩니다. model은 모든 사용자 생성 데이터베이스에 대한 템플릿입니다. 새 데이터베이스를 생성할 때 모델을 복사하고 필요한 개체를 생성합니다. tempdb는 SQL Server에 임시 개체를 저장합니다. 생성된 임시 테이블과 임시 저장 프로시저를 표시하고 시스템에서 생성된 임시 개체는 모두 tempdb를 활용합니다. [1] 그리고 각 데이터베이스에는 자체 시스템 테이블이 있습니다. 이러한 시스템 테이블은 구성 및 개체 정보를 저장하는 데 사용됩니다. 이러한 시스템 테이블에서 각 저장 프로시저의 모든 매개 변수에 대한 정보를 얻을 수 있습니다. 이 정보는 syscolumns 테이블에 저장됩니다. 우리의 메소드에서 사용해야 하는 매개변수 이름, 유형, 길이, 방향 등이 있습니다. 그러나 시스템 테이블의 필드는 SQL Server 버전에 따라 변경됩니다. 예를 들어 syscolumns의 type 및 xtype은 이러한 변경의 예입니다. 둘 다 유형 정보를 저장합니다. SQL Server의 버전 변경에 맞춰 방법을 적용하려면 정보 구조 보기를 사용해야 합니다. ANSI-92는 정보 구조 뷰를 시스템 데이터를 제공하는 뷰 집합으로 정의합니다. 이 보기를 활용하면 애플리케이션에서 실제 시스템 테이블을 숨길 수 있습니다. 시스템 테이블에 대한 변경 사항은 애플리케이션에 영향을 미치지 않으므로 애플리케이션은 데이터베이스 공급업체 및 버전에 독립적일 수 있습니다. [1] ANSI-92 및 SQL Server는 3세그먼트 명명 구조를 사용하여 로컬 서버의 개체를 참조하도록 지원합니다. ANSI-92 용어는 Catalog.schema.object라고 하며, SQL Server에서는 이를 Database.owner.object라고 부릅니다. [1] 예를 들어 모든 저장 프로시저의 모든 매개변수 정보를 찾으려면 다음을 사용할 수 있습니다. INFORMATION_SCHEMA.PARAMETERS에서 *를 선택합니다. 특정 저장 프로시저의 모든 매개변수 정보를 찾으려면 다음과 같이 합니다. * INFORMATION_SCHEMA.PARAMETERS에서 SPECIFIC_NAME ='Proc1 ' 정보 구조 보기를 사용하면 문제의 절반 이상이 해결되었습니다. 다음으로 .NET에서 메서드를 구현하는 방법을 살펴보겠습니다.
3. 구현 방법의 초점은 저장 프로시저의 이름을 기반으로 저장 프로시저의 모든 매개 변수 정보를 얻은 다음, 이러한 매개 변수 정보를 기반으로 각 매개 변수를 자동으로 생성하는 방법입니다. 이러한 작업을 자동화하려면 SqlConnection, SqlCommand 및 SqlParameter를 선언하는 프로세스와 각 SqlParameter를 생성하는 프로세스가 사용자에게 표시되지 않아야 합니다. 사용자가 제공해야 하는 유일한 것은 저장 프로시저의 이름이며 호출 시 다양한 매개변수를 제공하며 해당 유형도 제공할 필요가 없습니다.
3.1 저장 프로시저의 매개변수 획득 및 생성 호출할 저장 프로시저의 매개변수를 획득하고 생성하는 방법이 정보 구조 뷰를 통해 자동으로 구현될 수 있습니다.
// 저장 프로시저의 매개변수 가져오기 및 생성
private void GetProcedureParameter(params object[] 매개변수)
{ SqlCommand myCommand2 = new SqlCommand();
myCommand2.Connection = this.myConnection;
myCommand2.CommandText = "select * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME = '" + this.ProcedureName + "' order by ORDINAL_POSITION";
SqlDataReader reader = null; reader = myCommand2.ExecuteReader(); // 반환 매개변수 생성
myParameter = new SqlParameter();
myParameter.ParameterName = "@Value";
myParameter . SqlDbType = SqlDbType.Int;
myParameterDirection.ReturnValue;
myCommand.Parameters.Add(myParameter);
int i = 0; 여기서는 SqlParameter 유형, 값, 방향 및 기타 속성을 자동으로 생성할 수 있습니다.
while(reader.Read())
{
myParameter = new SqlParameter();
myParameter.ParameterName = reader["PARAMETER_NAME"].ToString();
myParameter.Direction = reader["PARAMETER_MODE"].ToString()=="IN" ?ParameterDirection.Input:ParameterDirection.Output;
스위치(reader["DATA_TYPE"].ToString()) {
케이스 "int" :
if(myParameter.Direction == ParameterDirection.Input)
myParameter.Value = (int)parameters[i] ;
myParameter.SqlDbType = SqlDbType.Int
; //...
특정 유형 처리가
많이 생략됨
default
: break
;
3.2 반환 결과 데이터 집합, 반환 값 및 나가는 매개 변수 집합 저장 프로시저의 매개 변수를 생성한 후 저장 프로시저를 호출할 수 있습니다. .NET에서는 결과 집합을 반환하는 일반적으로 사용되는 클래스가 SqlDataReader 및 DataSet이고, SqlDataReader는 연결을 유지하는 동안에만 사용할 수 있지만 DataSet은 그렇지 않습니다. 우리 구현에서는 호출 후에 연결이 끊어져야 하므로 DataSet을 사용하여 반환된 결과 집합을 저장합니다.
public SqlResult Call(params object[] 매개변수){ // SqlResult는 결과 데이터 세트, 반환 값 및 나가는 매개변수 세트를 저장하는 데 사용되는 자체 정의 클래스입니다. SqlResult result = new SqlResult() // 다음과 같이 자체 연결을 정의합니다. need String
myConnection = new SqlConnection(ConnectionString);
myCommand = new SqlCommand(this.ProcedureName, myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlDataAdapter
myAdapter = new SqlDataAdapter(myCommand);
프로시저의 매개변수를 저장하고 값을 설정합니다.
GetProcedureParameter(parameters);
myAdapter.Fill(result.dataSet, "Table") // 저장 프로시저의 나가는 매개변수 값과 이름 쌍을 가져와서 Hashtable에 저장합니다. GetOutputValue(result) ; // 여기에서 다양한 리소스를 해제하고
myCommand.Dispose
(
)
myConnection.Dispose()
;
4. 추가 작업 여기서 구현한 것은 SQL Server 데이터베이스용이지만 이 방법은 정보 구조 보기를 제공하거나 ANSI-92 표준을 따르거나 메타데이터를 제공하는 모든 데이터베이스에 사용할 수 있습니다. 이를 SqlProcedure 클래스로 캡슐화하면 필요할 때 저장 프로시저를 쉽게 호출할 수 있어 기본적으로 반복적인 코드 작업이 많이 줄어듭니다. SqlProcedure 클래스가 더 많은 데이터 유형을 지원하려면 GetProcedureParameter() 메서드에서 필요에 따라 각 매개 변수의 유형, 방향, 길이, 기본값 및 기타 정보를 분석한 후 이 매개 변수를 생성해야 합니다. 기본적으로 모든 유형을 구현할 수 있으며, 이미지 유형도 이런 방식으로 생성할 수 있습니다. 이런 방식으로 수업은 모든 프로젝트에서 매우 일반적이고 유용할 수 있습니다.
참고자료
[1] Ray Rankins, Paul Jensen, Paul Bertucci, SQL Server 2000 실용 서적, 베이징: 전자 산업 출판부, 2002
[2] MSDN Library 2003년 1월, Microsoft Corporation
저자 소개: Liu Zhibo(1979-), 남성, 후난성 신화 출신, 석사 학위, 주요 연구 방향: 신경망 및 패턴 인식, 사무 자동화 정보 시스템
이메일:[email protected]