ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# ADO.NET 파라미터 사용
    .NET/ADO.NET 2008. 11. 10. 20:45
    반응형
    - 닷넷 프로그래밍 정복 내용


    SQL 쿼리문은 단순한 문자열 포맷이지만 이 문자열 안에는 검색 조건이나 삭제 대상, 수정할 값등을 전달받기 위한 인수들이 포함된다. 앞 예제에서는 편의상 SQL명령을 상수 문자열로 하드 코딩했지만 실무에서는 사용자들이 입력한 전보를 받아들여 사용자의 지시대로 명령을 수행해야 한다. UPDATE문은 수정할 대상과 수정할 값을 입력 받아야하고 DELETE문은 삭제할 레코드의 키를 입력 받아야한다. 새로운 레코드를 삽입하는 INSERT문의 경우 새레코드의 정보를 전달받기위한 인수가 반드시 필요한다

    실행중에 사용자의 입력을 받아들이려면 텍스트 박스나 체크박스같은 컨트롤을 배치하고 이컨트롤의 값을 읽어 사용자가 입력한 값을 SQL쿼리문에 포함시키는 방법을 쓴다. 폼에는 이름 , 나이, 성별을 입력받기 위한 텍스트 박스와 체크 박스들이 배치되어 있으며 이컨트롤로 부터 입력받은 정보를 문자열로 조립하여 서버로 전달하면 된다 INSERT1 버튼을 누르면 사용자가 입력한 값으로 쿼리문을 조립하여 실행한다.

    private void btnInsert1_Click(object sender, EventArgs e)
    {
    string Sql = string.Format("INSERT INTO tblPeople VALUES('{0}' , {1} ,{2})".
    textName.Text, textAge.Text, checkMale.Checked ? 1:0);
                SqlCommand Com = new SqlCommand(Sql, Con);
                Com.ExecuteNonQuery();
                PrintTable();
    }

    INSERT INTO 쿼리문을 작성하되 VALUES절로 전달되는 필드의 값을 컨트롤로부터 입력받았다. 문자열인 경우 입력된 값을 따옴표로 적어야 함을 유의하자. 사용자가 어떤 값을 입력하는가에 따라 쿼리문의 내용이 달라지며 실제로 삽입되는 레코드도 달라질 것이다.

    INSERT INTO tblPeople VALUES ({0},{1},[2})
                                        0=>texName.Text , 1= >textAge.Text    , 2=>checkMail

    조립된 쿼리문을 ExecuteNonQuery 메서드로 실행하면 입력한 정보대로 새로운 레코드가 삽입되고 리스트 박스에도 출력된다. 예제를 실행하고 텍스트 박스에 장동건을 입력한후 INSERT버튼을 눌러보자. 기본키 충돌만 일어나지 않으면 잘 실행될것이다

     문자열을 조립하는 방법은 언어의 문자열 관리 기능을 사용하여 , 쿼리문을 생성하는 상식적인 방법이다.

    ADO.NET은 이런 전통적인 방법 대신 좀 더 효율적인 파리미터라는 문법을 제공한다. 마치 메서드에게 인수를 전달하는 것처럼 SQL문에게 파라미터를 전달하여 실행할 명령의 정보를 제공하는 것이다. 실행중에 결정되는 값에 @로 시작되는 파라미터 이름만 적어 놓고 실제 값은 쿼리문을 실행하기 전에 제공하는 방법이다

    파리미터를 쓰는 쿼리문은 한번만 컴파일되며 이후부터는 파라미터만 바꿔가며 실행할 수 있으므로 매번 문자열을 조립하는 것보다 실행 속도가 월씬 더 빠르다
    파라미터 자체SqlParameter 클래스로 표현되며 SqlCommand.의 Parameters 프로퍼티로 파라미터의 컬렉션을 관리한다. 명령 하나에 여러 개의 값이 포함될 수 있으므로 파라미터도 컬렉션을 구성한다. 


    다음은 파라미터의 생성자이다

    public SqlParameter (string parameterName.SqlDbType dbType, int size, string sourceColumn)



    파라미터의 이름 , 타입 크기, 연결된 칼럼 등을 인수로 받아들인다. 
    이 값들은 프로퍼티로도 제공되므로 객체 생성후에 언제든지 변경할 수 있다

    ParameterName -> string -> 파라미터의 이름이다. 첫글자가 반드시 @이어야한다

    DbType 또는 SqlDbType -> Dbtype -> 파라미터의 타입이. 디폴트는 NVarChar이다 SqlDbType열거형에 SQL서버가 지원하는 대부분의 타입들이 포함되어 있다

    Size -> Int 파라미터의 최대크기를 바이트 단위로 지정하며 유니코드 문자열에서는 문자의 개수이다, 주로 문자열 타입에 대해 사용되며 고정길이 타입에 대해서는 무시된다. 생략 시 실제 값으로부터 유추된다

    Scale -> byte -> Decimal 타입에 대해 소수 자릿수를 지정한다

    Direction -> ParameterDirection -> 파라미터의 방향을 나타낸다 Input, Output, InputOutput, RelurnValue 네가지가 있으며 디폴트는 Input 이다

    IsNullable -> bool -> NULL 허용 여부를 조사한다

    Value -> object -> 파라미터의 값이다. 파라미터가 있는 명령은 실행 전에 Value에 값을 대입해야한다
    출력용 인수도 Value를 통해 값을 확인한다

    SourceColumn -> string -> 소스의 열이름이다

    SourceVersion -> DataRowVersion -> UPDATE를 수행하는 동안 필드의 언제 값을 읽을 것인가를 지정한다. Original은 원래 들어 있던 값이고 Current는 현재 값이다. 디폴트는 Current이다

    쿼리문에게 정보를 제공하는 것이 파라미터의 주된 기능이므로 특별한 메서드는 정의되어 있지 않다. 파라미터가 있는 명령문에 실행하려문 파라미터 개수만큼 SqlParameter 객체를 생성하여 Parameters 컬렉션에 넣어 두어야 한다. 파라미터 객체를 미리 생성한 후 컬렉션의 Add메서드로 추가할 수 도 있고 아니면 컬렉션의 Add메서드로 파라미터의 주요 프로퍼티를 전달하여 생성과 동시에 추가할 수도 있다.

    public SqlParameter Add (SqlParameter value)
    public SqlParameter Add ( string parameterName, SqlDbType ,sqlDbType, [int size , string sourceColumn])

    파라미터의 실제 값은 Value 프로퍼티를 통해 제공한다. 쿼리 실행문은 파라미터의 실제 값으로 쿼리문을 재작성하여 실행할 것이다. INSERT2 버튼을 누르면 파라미터를 사용하여 새 레코드를 삽입한다.

    private void bunInsert2_Click(object sender , EventArgs e)
    {
    string Sql = "INSERT INTO tblPeople VALUES (@Name, @age,@Mail)";
    SqlCommand Com = new SqlCommand(Sql, Con);
    Com.Parameters.Add("@Name", SqlDbtype.NVARCHAR , 10);
    Com.Parameters.Add("@Age" , SqlDbType.Int);
    Com.Parameters.Add("@Male", SqlDbType.Bit);

    Com.Parameters["@Name"].Value = textNAme.Text;
    Com.Parameters["@Age"].Value = textAge.Text;
    Com.Parameters["@Male"].Value = checkMale.Checked ? 1:0;

    Com.ExecuteNonQuery();
    PrintTable();

    }

    쿼리문 내에는 @Name , @Age, @Male 파라미터 마커를 작성해 놓았다. 이명령을 실행하기 위해서는 파라미터 마커와 대응되는 세개의 파라미터가 명령 객체에 정의 되어 있어야 하며 파라미터의 실제 값이 Value 프로퍼티로 제공되어야 한다

    실행 결과는 문자열을 조립하는 방식과 동일하다. 당장 보기에는 소스가 더 길어 보이지만 비슷한 명령을 반복적으로 실행해야한다면 Value 프로퍼티만 바꾸어 가며 호출할 수 있어 간편하다. 서버의 입장에서도 파라미터만 다른 명령은 실행 계획이 동일하며 캐시에 이미 컴파일되어 있으므로 속도가 월씬 더 빠르다.

    파라미터를 쓰는 방법은 공급자별로 조금씩 차이가 있다.
    OLE DBODBC에서 파라미터 마커로 이름을 쓰수 없고    ? 를 사용해햐한다. 파라미터의 이름이 없으므로 ? 의 순서대로 파라미터가 대응된다






    반응형

    댓글

Designed by Tistory.