이놈의 귀차니즘 때문에 @.@ 글을.. 쓰고 싶은데 쏘스가 주어지고 해야될일이 생기니 에휴 ~~ 이놈의 핑계~ 어째던 이번에 알아볼 것은 db에 접속 하는것을 알아 보겠다. 그것도 동일한 sql문에 param 값을 설정 하여서 한개의 sql문으로 처리 하는 방법을 해보는 것이다.


자바 소스
import java.sql.*;
public class CallableTest {
 public static void main(String[] args) throws SQLException{
  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", "apmsetup");
 
  PreparedStatement stmt;
 
  String sqlStr = "select * from db where id=?";
 
  stmt = conn.prepareStatement(sqlStr);
 
  stmt.setInt(1, 10);
 
  ResultSet rs = stmt.executeQuery();
 
  while(rs.next())
  {
   System.out.println(rs.getString(1));
  }
 
  stmt.close();
  conn.close();
 }
}



 

그리고 C# 소스
using System;
using System.Data;
using System.Data.SqlClient;

class SqlParamTest
{
    static void Main(string[] args)
    {
        string connStr = "Provider=MySQLProv;Data Source=mysql;" +
                         "Location=localhost;User Id=root;Password=apmsetup";
        string query = "select * from db where id=@ID";
        SqlConnection conn = new SqlConnection(connStr);
        conn.Open();
        SqlCommand comm = new SqlCommand(query, conn);
        comm.Parameters.Add("@ID", SqlDbType.Int);
        comm.Parameters["@ID"].Value = "10";
        SqlDataReader sr = comm.ExecuteReader();
        while (sr.Read())
        {
            Console.WriteLine(sr.GetInt32(0)));
        }
        sr.Close();
        conn.Close();
    }
}



위의 코드는 솔직히 실행해보지는 못했다. 일단 실행을 할려면 MySql 설치해야 하고, 공급자도 설치해야 하고.. 아마도 자바와 닷넷용 모두 설치해야 할것이다. 그렇다고 MSSql을 설치하기도 그렇고. 그러니 이해해 주시기를 바랍니다 ^^

어째던 DB 접속에 둘다 문제가 없다면 두개의 소스가 비슷한 동작을 할것이다. 일단 둘다 각각의 Connection 객체를 통해 일단 DB에 접속 했다. 그런데 여기서 약간의 차이점은 자바에서는 DBManager 를 사용하여 객체를 생성하고, C#에서는 객체 스스로 생성되었다. 그래서 그런지는 모르겠지만 C#으로는 Connection 객체를 open을 해주는데 자바에서는 해주지 않는다.

그리고 다음은 비슷한 동작을 하는 command == statement 이두 객체가 비슷한 동작을 한다. 커넥션 객체에서 각 쿼리를 실행 하기 위한 Sql명령을 가지고 있는 객체이다. 여기서 바뀌게 되는 파라 미터 값을 command 에서는 @param 으로 구분했고 statement 에서는 ?로 구분했다. 그리고 자바에서는 preparedstatement라는 객체를 따로 만들어야 했으나, C#에서는 command라는 객체의 다른 종류는 없었다.

그리고 데이터를 읽는 것은 각각의 Reader로 읽어 값을 읽었고, 마지막으로 각 파라미터에 값을 넣을때 Java에서는 셋팅을 할때 메서드를 호출에서 ? 순서에 따라 각각의 값을 지정하였고, C#에서는 각 파라미터의 @param를 가지고 셋팅후 값을 대입 2번의 수행을 하였다.

뭐 두개다 큰 차이는 없겠지만 자바에서는 param 들이 ?로 표시되어 각각을 지정하는데 유연함이 조금 떨어질수 있겠지만, C#에서는 2번 셋팅을 해주어야 해서 불편하다는 점이 내가 내린 결론!!



에구에구 오랜만에 쓰는데 왜이리 피곤한지.. 그리고 자바에서는 또 특이하게 callablestatement라는 놈이 있다. 이놈은 preparedstatement라는 놈과는 비슷하지만 다른부분이 있다. 좀더 알아보고 기회가 된다면 다름 글에 이야기 해보겠다.

Trackback url :: http://hahakbs.dothost.co.kr/trackback/79

댓글을 달아 주세요

  1. C#으로는 ODCB인가요? 그것을 설치 하기 귀찮아서 MySQL접속을 시도 하지 않았는데요 ㅎ;;
    자바로는 요즘 한참 MySQL에 접속하여 작업을 하는 것을 하고 있네요 ;;;
    (단. MySQL홈페이지에서의 C# Client라이브러리로는 해보았네요. 그러나 성격 자체가 틀린 클래스네요 ㅎ;)

    일단 전 conn객체에서 createStatement()메소드를 씁니다.

    Statement stat = conn.createStatement();
    ResultSet res = stat.executeQuery("select * from `name` where `uidx` = '0'");

    while(res.next())
    {
    .............
    }

    res.close();
    stat.close();

    저런 식으로 씁니다. 일단 검색해 보니
    http://www.xrath.com/devdoc/jdk1.5/ko/api/java/sql/Connection.html
    와 같은 문서가 나왔네요. 번역기로 돌린건지 이해하기 좀 힘드네요 ㅎ;;

    대강 보니 prepareStatement와 createStatement와의 차이가 좀 뚜렷하네요.

    마치 리눅스의 쉘스크립트 또는 윈도우즈, 도스의 배치파일처럼 인수를 미리 무엇을 받을지
    정해 놓고 그 인수를 원하는 값으로 넘겨서 실행 하는 방식이 prepareStatement군요.

    그 반면에 createStatement는 그 배치파일의 내용을 실행 전에 직접 만들어서 실행 전에
    execute관련 명령을 주어 결과를 받는 방식이라고 할 수 있겠네요 ㅎ;;

    전혀 다른 형식의 쿼리 작업을 여러번 할땐 createStatement가 좋고 where에서 특정 조건 값만
    다르게 혹은 테이블 명만 바꿔 여러번 실행하기에는 prepareStatement가 더 좋겠네요 @_@;;

    한번만 쓰는 Statement객체를 생성 할 땐 prepareStatement를 활용한다면 훨신 깔끔한 소스가 나오겠네요 ㅎㅎ

    덧으로..

    C#은 @ID가 여러게 있다면 한번에 여러개의 @ID문자열이 지정된 값으로 대채 될까요?
    쿼리가 "select * from `user` as `t1`, `info` as `t2` where `t1`.`uidx` = '@ID` and `t2`.`uidx` = '@ID'" 로 되어 있다면 어떻게 작동할지 궁금해지네요 ㅎㅎ;; 약간 억지 쿼리지만요 ;;;

    그리고 C#과 Sun Java와의 장단점은 일단 확실하네요 ㅎ
    자바는 인수가 기존의 앞에 하나 더 추가 되면 인댁스를 고쳐줘야하고.. 덕분에 주의가 필요하지만
    C#은 명확한 대신에 좀 더 소스가 길어지고 라인이 늘어 난다는 점이 있네요.

    ㅎㅎ 이번에도 재미있는 글이네요~ 다름글도 기대합니다~

    덧2. 제가 쓰는 방법의 소스를 쓰고 난 뒤, prepareStatement 스펠링을 찾으려 확인 중 잘못 클릭해서 String가(?!)클릭 되는 바람에 ㅠ.ㅠ;;;
    덧2. id=@ID부분이 메일링크로 되어져 잇네요 ㅎ;; 처음에 어라. sql에 저런 구문이? 라고 생각했었습니다 ㅎ;; 물론 자바에서의 id=?도 첨엔 뭘까. 햇네요 ㅎ;; (prepareStatement를 처음 봐서 처음 이 글을 읽었을 땐 무슨 내용인지 이해를 못했습니다 ^^;;)
    덧3. 쿼리가 다단계로 실행 되야 할땐 곱배기로 늘어나는 변수들이 -0-;; statement와 ResultSet와 독립된다면 좋았을 ;;
    덧4. 마지막 설명 부분에 오타가 있어요~

    • 에구 좋은 지적 감사합니다.
      글만 휘리릭 써놓고 확인을 지금 했네요 ^^

      C#에서 OLE DB를 사용하여서 디비를 접속하는 방식을 했고요,
      그 방법은 전 글에 보면 나온것들이 있어요.
      자바에서도 동일하게 디비에 접속해 볼려고 MySql을 썼는데 잘 안되더라고요 아마도 공급자를 설치해줘야 하는거 같은데..

      정확히는 잘 모르지만, C#에서는 MSSql 과 자바에서는 Oracle을 사용하게는게 쉽게 사용하고 최적화 될수 있을거 같은데 각각의 프로그램을 설치하기가...특히 오라클은....

      동일한 SQL문에 각각읜 Param값들만 약간씩 변동이 된다면, 위와 같은 것을 사용하면 쉽게 사용할수 있을것 같습니다. 결론에 하나를 추가 하자면 C#은 SqlCommand 자체가 고정적인 것과 Param을 받을수 있는것 둘다 사용이 가능하지만 자바는 Statement와 preparedstatement 로 따로 구분되어 사용해야 한다는 점.

      그리고 id 부분은 글을 쓸때 링크가 자동으로 삽입이 된걸 모르고.. 사용하다 코드뷰어 플로그인이랑 겹쳐 버렸습니다. ^^
      오타 수정 했고요.

      원래는 callablestatement 이걸 찾아 볼려고 했는데 C#에서는 이와 비슷한것이 없는거 같았습니다.

    • MSSQL은 MS에서 만들어서 닷넷과 잘 맞는 걸까요 ㅎㅎ;
      (MSSQL마저도 사들여서 가공 해서 팔은건 아니..겠죠;)

      덧1. OLE DB란걸 찾아 봐야겠네요 ㅎㅎ
      덧2. 하단 설명부 세번째 단락이 잘 이해 않되네요 ;;;

    • 하단부 세번째 단락이라 하면

      그리도 다음은 비슷한 동작을 하는 command ...

      이부분 인가요? 이부분은 java에서는 동적인것과 정적인것을 쓸려면 다른 객체를 써야 하는데 statement 와 preparedstatement 라는 것을 써야 하는데 C#에서는 sqlcommand 하나로도 동적인 것과 정적인 것을 하나로 쓸수 있다는 이야기 였어요 ^^

    • 그리도라는 단어가 혼란스러웠습니다 ㅎ;;
      하나로 되어 있으면 내부적으로 몇몇 처리가 더 되어 있을테고 분리 되어 있으면 필요 없는 처리 않할 수 있을테고.... 하지만 하나로 되어있는 C#쪽이 더 편하긴 하군요 ;


div>