반응형

가급적 테스트 용도로만 사용하세요.


MSSQL 서버에 직접 연결하여 데이터를 주고 받으면 

암호화안된 데이터 노출될 수 도 있고..


앱에서 소스코드를 추출하여 MSSQL 서버의 비밀번호가 노출될 수 있습니다.




API21을 사용하도록 새로운 안드로이드 프로젝트를 생성하고

생성된 디렉토리의 libs라는 하위 디렉토리에 jtds-1.2.8.jar를 복사해 넣었습니다.

 


왼쪽에 있는 Android를 클릭해서 Project로 바꾸고.. app하위에 있는 libs에서 jtds-1.2.8.jar를 선택하고 마우스 우클릭해서 나오는 메뉴에서 Add a Library를 선택합니다.(캡처는 1.3.1을 사용할떄 인데 문제가 있어서 1.2.8로 바꾸었습니다.)


http://sourceforge.net/projects/jtds/files/jtds/1.2.8/ 에서 jtds-1.2.8.jar가 포함된 압축파일을 다운로드 받을 수 있습니다.



 

이제 DB를 출력하기 위해 사용하게 될 listview를 사용하는 레이아웃을 생성합니다.

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"  
  3.     android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"  
  4.     android:paddingRight="@dimen/activity_horizontal_margin"  
  5.     android:paddingTop="@dimen/activity_vertical_margin"  
  6.     android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">  
  7.     
  8.     <ListView  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:id="@+id/listView" />  
  12. </RelativeLayout>  

 


그리고 AndroidManifest.xml 파일에 아래 한 줄을 추가해줍니다.

<uses-permission android:name="android.permission.INTERNET" />

 

 

 


그리고 다음과 같은 소스코드를 사용하면 원하는 결과를 얻을 수 있습니다. 5.0(API21)에서 정상적으로 동작하는 것을 확인했습니다.

버전에 따라 동작을 안하거나 문제가 발생할 수 있습니다.

  1. package com.tistory.webnautes.mssqltest;  
  2.     
  3. import android.app.Activity;  
  4. import android.os.AsyncTask;  
  5. import android.os.Build;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.util.Log;  
  10. import android.widget.ArrayAdapter;  
  11. import android.widget.ListView;  
  12. import java.sql.Connection;  
  13. import java.sql.DriverManager;  
  14. import java.sql.ResultSet;  
  15. import java.sql.Statement;  
  16. import java.util.ArrayList;  
  17.     
  18. public class MainActivity extends Activity {  
  19.     ListView listview;  
  20.     ArrayAdapter<String> adapter;  
  21.     MyAsyncTask mTask;  
  22.     static String query = "select * from state order by curdate desc " ;  
  23.     
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.     
  29.         listview = (ListView)findViewById(R.id.listView);  
  30.         adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);  
  31.         listview.setAdapter(adapter);  
  32.     }  
  33.     
  34.     @Override  
  35.     protected void onStart() {  
  36.         super.onStart();  
  37.     
  38.         handler.sendEmptyMessage(0);  
  39.     }  
  40.     
  41.     
  42.     class MyAsyncTask extends AsyncTask<String, Void, ArrayList<String>>  
  43.     {  
  44.     
  45.         @Override  
  46.         protected void onPreExecute(){  
  47.             super.onPreExecute();  
  48.         }  
  49.     
  50.     
  51.         @Override  
  52.         protected ArrayList<String> doInBackground( String... params){  
  53.     
  54.     
  55.             ArrayList<String> list = new ArrayList<String>();  
  56.     
  57.     
  58.     
  59.             ResultSet reset = null;  
  60.             Connection conn = null;  
  61.     
  62.     
  63.     
  64.             try {  
  65.                  Class.forName("net.sourceforge.jtds.jdbc.Driver");  
  66.                 conn = DriverManager.getConnection("jdbc:jtds:sqlserver://DB버주소;databaseName=DB","이디","스워드");  
  67.                 Statement stmt = conn.createStatement();  
  68.     
  69.                 reset = stmt.executeQuery(query);  
  70.     
  71.     
  72.     
  73.                 while(reset.next()){  
  74.     
  75.                     if ( isCancelled() ) break;  
  76.     
  77.                     final String str = reset.getString(1)+" "+reset.getString(3)+" "+reset.getString(4);  
  78.                     list.add(str);  
  79.     
  80.     
  81.                 }  
  82.                 conn.close();  
  83.             }  
  84.     
  85.             catch (Exception e)  
  86.             {  
  87.                 Log.w("111Error connection""" + e.getMessage());  
  88.             }  
  89.     
  90.             return list;  
  91.         }  
  92.     
  93.         @Override  
  94.         protected void onPostExecute(ArrayList<String> list){  
  95.     
  96.             adapter.clear();  
  97.             adapter.addAll(list);  
  98.     
  99.     
  100.             adapter.notifyDataSetChanged();  
  101.             handler.sendEmptyMessageDelayed(01000);  
  102.     
  103.         }  
  104.     
  105.         @Override  
  106.         protected void onCancelled(){  
  107.             super.onCancelled();  
  108.         }  
  109.     }  
  110.     
  111.     public Handler handler = new Handler(){  
  112.         public void handleMessage( Message msg){  
  113.             super.handleMessage(msg);  
  114.     
  115.             mTask = new MyAsyncTask();  
  116.     
  117.             mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");  
  118.         }  
  119.     };  
  120. }  

 

 


다음은 실행결과입니다. 1초마다 DB데이터를 다시 가져와서 뿌리도록 한 결과입니다.

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts