마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

버튼 활용한 쿼리문 전송 http://www.masterqna.com/android/1문제입니다.

0 추천

개발중인 어플이 있습니다

MSSQL DB를 사용하고 있어서 JTDS를 활용하는 중입니다.

여기서 제가 query 변수에 저장된 쿼리문으로 리스트를 불러옵니다

그리고 버튼을 눌렀을때 query1 변수에 저장된 쿼리문을 실행해 데이터를 삭제하려고 합니다.

그런데 버튼은 정상적으로 호출이 되지만 stmt.executeQuery(query1); 이 구문이 실행되지 않아 쿼리문 실행이 되지 않네요

로그를 하나하나 찍어가면서 하고 있는데 발생하는 오류가 무엇때문인지 이유를 알 수가 없습니다.

혹시나 DB 업데이트나 호출할때 어떻게 해야 하는지 아시는분 계시다면 조언 부탁드리겠습니다.

 

로그입니다.

10-11 23:46:29.830  11034-11056/com.example.admin.sqltest I/Connection﹕ MSSQL 라이브러리 로드

10-11 23:46:30.733  11034-11041/com.example.admin.sqltest W/art﹕ Suspending all threads took: 11.102ms

10-11 23:46:30.761  11034-11056/com.example.admin.sqltest I/Connection﹕ MSSQL 접속 성공 : net.sourceforge.jtds.jdbc.ConnectionJDBC2@284f468b

10-11 23:46:30.769  11034-11056/com.example.admin.sqltest I/list 내용 확인 함수 :﹕ [1          2          3         , 4          5          3         ]

10-11 23:46:34.115  11034-11034/com.example.admin.sqltest I/﹕ 버튼 호출됨

10-11 23:46:34.116  11034-11034/com.example.admin.sqltest I/﹕ updateDB() 함수 호출

 

10-11 23:46:34.142  11034-11034/com.example.admin.sqltest W/버튼 에러﹕ Attempt to invoke interface method 'java.sql.ResultSet java.sql.Statement.executeQuery(java.lang.String)' on a null object reference

이 녀석이 문제인 듯 합니다

 

소스이구요.

package com.example.admin.sqltest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.os.AsyncTask;

public class MainActivity extends Activity {
    Connection conn = null;
    Statement stmt = null;
    ResultSet reset = null;
    ArrayList<String> list = new ArrayList<String>();


    ListView listview;
    ArrayAdapter<String> adapter;
    MyAsyncTask mTask;
    static String query = "select * from dbtest " ;
    static String query1 = "delete from dbtest where no=4";
            ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listview = (ListView) findViewById(R.id.listView);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        listview.setAdapter(adapter);

        findViewById(R.id.button).setOnClickListener(mClickListener);
    }
        Button.OnClickListener mClickListener = new View.OnClickListener() {
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.button:
                        Log.i("", "버튼 호출됨");
                        updateDB();

                        break;
                }
            }
        };

    public void updateDB(){
        Log.i("", "updateDB() 함수 호출");
        try {
            stmt.executeQuery(query1);
            /*
            while(reset.next()){

                final String str = reset.getString(1)+" "+reset.getString(2)+" "+reset.getString(3);
                list.add(str);
            }
            // conn.close();*/

            Log.i("list 내용 확인 함수 : ", "" + list);

        }
        catch (Exception e)
        {
            Log.w("버튼 에러", "" + e.getMessage());
        }
    }
    @Override
    protected void onStart() {
        super.onStart();

        handler.sendEmptyMessage(0);
    }

    class MyAsyncTask extends AsyncTask<String, Void, ArrayList<String>>
    {

        @Override
        protected void onPreExecute(){
            super.onPreExecute();
        }


        @Override
        protected ArrayList<String> doInBackground( String... params){
            try {
                Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
                Log.i("Connection","MSSQL 라이브러리 로드");

                conn = DriverManager.getConnection("jdbc:jtds:sqlserver://xxx.xxx.xxx.184:1433/test","mesapp","dhc8700!?#");
                Log.i("Connection","MSSQL 접속 성공 : "+conn);

                Statement stmt = conn.createStatement();

                reset = stmt.executeQuery(query);



                while(reset.next()){

                    if ( isCancelled() ) break;

                    final String str = reset.getString(1)+" "+reset.getString(2)+" "+reset.getString(3);
                    list.add(str);


                }
               // conn.close();
                Log.i("list 내용 확인 함수 : ","" + list);
            }

            catch (Exception e)
            {
                Log.w("111Error connection", "" + e.getMessage());
            }

            return list;
        }

        @Override
        protected void onPostExecute(ArrayList<String> list){

            adapter.clear();
            adapter.addAll(list);


            adapter.notifyDataSetChanged();
            //handler.sendEmptyMessageDelayed(0, 1000);
        }

        @Override
        protected void onCancelled(){
            super.onCancelled();
        }
    }

    public Handler handler = new Handler(){
        public void handleMessage( Message msg){
            super.handleMessage(msg);

            mTask = new MyAsyncTask();

            mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "");
        }
    };
}

 

Joel12 (220 포인트) 님이 2015년 10월 12일 질문

1개의 답변

+1 추천
 
채택된 답변
Statement stmt = null; 요 놈이 null 인거 같네요..

AsyncTask 안에 있는 stmt를 다시 한 번 확인해보세요
libre2k (7,420 포인트) 님이 2015년 10월 12일 답변
Joel12님이 2015년 10월 12일 채택됨
감사합니다
Statement stmt = conn.createStatement();
이걸
stmt = conn.createStatement();
변경하니 바로 적용됩니다
혹시 updateDB 함수의 e.getMessage() 함수에서 null을 계속 출력합니다.
쿼리문 실행은 정상적으로 되구요
이건 별 상관 없을까요?
Log.i("list 내용 확인 함수 : ", "" + list);

이 과정에서 list 값이 있는지 확인하세요.
로그 찍으려다 에러 나는것 같은데요.
list의 값을 찍으려면, size만큼 돌려서 index로 출력하시구요.
...