์ฐ์ AndroidManifest.xml์ ๊ถํ์ ๋ถ์ฌํด์ฃผ์
Android-Manifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
๋ง์ฝ ์ฝ๋ฉํ๋ ์ค ์ค๊ฐ์ ๊ถํ ๋ถ์ฌ๊ฐ ํ์ํด์ ธ์ ๊ถํ์ ์ฝ์ ํ ์ฌ์คํ ํ ๊ฒฝ์ฐ ์จ์ ํ๊ฒ ๊ถํ ๋ถ์ฌ๊ฐ ์๋ ์๊ฐ ์๋ค.
์ด์ ๋ ๋งค๋ํ์คํธ ํ์ผ์ ์ปดํ์ผ ์ดํ ์ ๋ฐ์ดํธ ๋ ๊ฒฝ์ฐ ์ด์ ์ ๊ถํ๋ค์ด ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ด๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ ์ดํ ์์ฒด๋ฅผ ์ญ์ ํ ์ฌ์ค์นํ๋ค๋ฉด ์ ์์ ์ผ๋ก ๊ถํ์ ์์ฒญํ ์ ์๊ฒ ๋๋ค.
์ด์ ์ ์ ํ ์คํธ๋ฅผ ์งํํ๊ธฐ ์ํด ๊ฐ๋จํ ๋ฒํผ, ์๋ํธํ ์คํธ๋ฅผ ์ถ๊ฐํ ๋ ์ด์์์ ๊ทธ๋ ค๋ณด์
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerVertical="true"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="getSql"
android:id="@+id/sql_btn"
android:onClick="sqlButton"
/>
<EditText
android:layout_width="300dp"
android:layout_height="wrap_content"
android:id="@+id/sql_et"
/>
</LinearLayout>
</RelativeLayout>
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฝ๋ฉ์ ์ค์ํ๊ธฐ ์ ์ ์๋๋ก์ด๋์ JTDS๋๋ผ์ด๋ฒ๋ฅผ ์ํฌํธ ์์ผ๋์
JTDS๋๋ผ์ด๋ฒ๋ฅผ ์ด์ฉํด MSSQL ์๋ฒ์ ์ ์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค.
๊ฐ๋จํ ์๋ ์ฌ์ง์ฒ๋ผ build.gradle ์ ์ฝ๋ ํ์ค๋ง ์ถ๊ฐํ๊ณ Sync Now ์์ผ๋ฒ๋ฆฌ๋ฉด ๋๋ค.
์ฝ๋: implementation 'net.sourceforge.jtds.jtds:1.3.1'
build.gradle
build.gradle
์ฌ๊ธฐ๊น์ง ์ ๋ฐ๋ผ์๋ค๋ฉด ๋ฌธ์ ์๋ค.
MainActivity.class ํ์ผ์ ์ด์ด์ ์๋ ๋ณ์๋ค์ ์ถ๊ฐํ๋ค.
EditText etSql;
private static String ip = "192.168.0.1"; //์ ์ํ ์๋ฒ์ธก์ IP, ํ์ฌ๋ ๋ก์ปฌ์์ ์งํํ๋ ์ด ์ปดํจํฐ์ IP์ฃผ์๋ฅผ ํ ๋นํ๋ฉด ๋๋ค.
private static String port = "49670"; //SQL ๊ตฌ์ฑ ๊ด๋ฆฌ์์์ TCP/IP ๊ตฌ์ฑ ์ค ๋ชจ๋ IPํฌํธ๋ฅผ ์ค์ ํ๋ ๊ตฌ๊ฐ์์ ๋์ ํฌํธ๋ฅผ ์ ์ผ๋ฉด ๋๋ค.
private static String Classes = "net.sourceforge.jtds.jdbc.Driver";
private static String database = "MyDataBase"; //์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ
private static String username = "Kim"; //์๋ฒ์ ์์ฉ ID PW
private static String password = "qwer";
private static String url ="jdbc:jtds:sqlserver://"+ip+":"+port+"/"+database;
private Connection connection = null;
database์ ๋ณ์๊ฐ
username์ ๋ณ์๊ฐ
password์ ๋ณ์๊ฐ ์ ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ์ ์์ ๊ฒ์ด๋ค. (๋ชจ๋ฅด๋ฉด DB๊ตฌ์ถ ์ฒ์๋ถํฐ ํด๋ผ)
๊ทธ๋ฌ๋ ip์ port๊ฐ์ ๋ชจ๋ฅผ ์๋ ์๋ค.
๊ทธ๋์ ์๋ ๋ด์ฉ์ฒ๋ผ ๋ฐ๋ผํด์ ๊ฐ๋ค์ ๊ฐ์ ธ์ค๋๋ก ํ์.
ip ๋ณ์์ ๋ฃ์ ๊ฐ:
CMD์ฐฝ์์ ipconfig ๋ฅผ ์ ๋ ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋จ๋๋ฐ ์ฌ๊ธฐ์ ipv4์ ๊ฐ์ ๋ณต๋ถํ๋ค.
port๋ณ์์ ๋ฃ์ ๊ฐ:
sql ์๋ฒ ๊ตฌ์ฑ๊ด๋ฆฌ์๋ฅผ ์ด์ด์ Sql Server ๋คํธ์ํฌ ๊ตฌ์ฑ ์๋ SQLEXPRESS์ ๋ํ ํ๋กํ ์ฝ๋ก ๋ค์ด๊ฐ๋ฉด
TCP/IP๊ฐ ์ฌ์ฉ์ํจ์ผ๋ก ๋์ด์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๊ฐ์์์ดํ์ด ๋ด์์ ๋ก์ปฌ ํธ์คํธ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ TCP/IP๋ฅผ
์ฌ์ฉ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
๊ทธ๋ฆฌ๊ณ port์ ๊ฐ์ ์๋ ๋์ ํฌํธ ๋๋ ๊ทธ๋ฅ ํฌํธ ๋์ค ํ๋๋ก ํ๋ฉด ๋๋ค.
์ด์ ๋ด ์๋๋ก์ด๋์์ ๋ก์ปฌํธ์คํธ๋ก ์ด๋ฆฐ MSSQL ์๋ฒ์ ์ ์ํ ์ค๋น๋ฌผ์ด ๋ชจ๋ ์ค๋น ๋์๋ค.
์๋ ๋ฉ์๋๋ค์ ์ถ๊ฐํ์.
MainActivity.class
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//์ธํฐ๋ท ํผ๋ฏธ์
์ ์๊ตฌํ๋๋ก ํจ
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.INTERNET},PackageManager.PERMISSION_GRANTED);
//๋ ์ด์์์ ์๋ํธํ
์คํธ๋ฅผ ๊ฐ์ ธ์ด
etSql = (EditText)findViewById(R.id.sql_et);
try {
//์ฐ๊ฒฐ์๋
Class.forName(Classes);
connection = DriverManager.getConnection(url,username,password);
//์ฐ๊ฒฐ์ฑ๊ณต ํ SUCCESS๋ฌธ์ ํ์
etSql.setText("SUCCESS");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
//์คํจ์ ์๋ฌ ํ์
etSql.setText("ERROR");
}
}
public void sqlButton(View view) {
if(connection != null){
Statement statement = null;
try {
statement = connection.createStatement();
//๋ฏธ๋ฆฌ ์ค๋นํ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ๊ฐ์ ธ์ resultSet ๋ณ์์ ๋ด์๋๋๋กํ๋ค.
//ResultSet์ C#์ DataSet๊ณผ ์ฑ๋ฅ์ ๋จ์ด์ง์ง๋ง ๊ธฐ๋ฅ์ ์ผ๋ก๋ ํก์ฌํจ.
ResultSet resultSet = statement.executeQuery("SELECT userName FROM userTbl WHERE userID = 'kim'");
while(resultSet.next()){
//๊ฐ์ ธ์จ ๋ชจ๋ ๊ฐ๋ค์ next()๋ฉ์๋๋ก ๋ชจ๋ ์ํํ์ฌ ๋์ฐ๋๋ก ํ๋ค.
etSql.setText(resultSet.getString(1)); //resultSet์์๋ ์ฒซ๋ฒ์งธ ํ๋๊ฐ 1๋ถํฐ ์์ํ๋ค.
}
} catch (SQLException e) {
e.printStackTrace();
}
}else{
etSql.setText("Connection is null");
}
}
MainActivity.class ์ ์ฒด ์ฝ๋
package com.example.mssqlconn;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.EditText;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MainActivity extends AppCompatActivity {
EditText etSql;
private static String ip = "192.168.0.1"; //์ ์ํ ์๋ฒ์ธก์ IP, ํ์ฌ๋ ๋ก์ปฌ์์ ์งํํ๋ ์ด ์ปดํจํฐ์ IP์ฃผ์๋ฅผ ํ ๋นํ๋ฉด ๋๋ค.
private static String port = "49670"; //SQL ๊ตฌ์ฑ ๊ด๋ฆฌ์์์ TCP/IP ๊ตฌ์ฑ ์ค ๋ชจ๋ IPํฌํธ๋ฅผ ์ค์ ํ๋ ๊ตฌ๊ฐ์์ ๋์ ํฌํธ๋ฅผ ์ ์ผ๋ฉด ๋๋ค.
private static String Classes = "net.sourceforge.jtds.jdbc.Driver";
private static String database = "MyDataBase"; //์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ
private static String username = "kim"; //์๋ฒ์ ID PW
private static String password = "qwer";
private static String url ="jdbc:jtds:sqlserver://"+ip+":"+port+"/"+database;
private Connection connection = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//์ธํฐ๋ท ํผ๋ฏธ์
์ ์๊ตฌํ๋๋ก ํจ
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.INTERNET},PackageManager.PERMISSION_GRANTED);
//๋ ์ด์์์ ์๋ํธํ
์คํธ๋ฅผ ๊ฐ์ ธ์ด
etSql = (EditText)findViewById(R.id.sql_et);
try {
//์ฐ๊ฒฐ์๋
Class.forName(Classes);
connection = DriverManager.getConnection(url,username,password);
//์ฐ๊ฒฐ์ฑ๊ณต ํ SUCCESS๋ฌธ์ ํ์
etSql.setText("SUCCESS");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
//์คํจ์ ์๋ฌ ํ์
etSql.setText("ERROR");
}
}
public void sqlButton(View view) {
if(connection != null){
Statement statement = null;
try {
statement = connection.createStatement();
//์ฟผ๋ฆฌ๋ฌธ์ ์ด์ฉํด ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ๊ฐ์ ์ ํ๋ค.
ResultSet resultSet = statement.executeQuery("SELECT userName FROM userTbl WHERE userID = 'kim'");
while(resultSet.next()){
//๊ฐ์ ธ์จ ๋ชจ๋ ๊ฐ๋ค์ next()๋ฉ์๋๋ก ๋ชจ๋ ์ํํ์ฌ ๋์ฐ๋๋ก ํ๋ค.
etSql.setText(resultSet.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}else{
etSql.setText("Connection is null");
}
}
}
์ด์ ์คํํด๋ณด๋๋กํ๋ฉด
์ผ๊ธฐ๋งํ์๋ ์ ์์ ์ผ๋ก SUCCESS๊ฐ ๋จ๋ฉด ์ ์์ ์ฑ๊ณตํ๊ฑฐ๋ค
GETSQL๋ฒํผ์ ๋๋ฅด๋ฉด ์ด์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ ๊ฒ์ด๋ค.
์ด ๋ฐฉ์์ผ๋ก SQLServer์ ์ ์ํ๋ ๊ฒ์ ๋ฆฌ๋ฒ์ฑ์ ์ํ ๋ณด์์ ๋ฌธ์ ๊ฐ ๋งค์ฐ ํฌ๋ค๊ณ ํ๋๋ผ.. (๊ฑ ํ ์คํธ์ฉ์ผ๋ก ํ์)
๋ค์ ํฌ์คํ ์ ์ด ๋ฐฉ์์ผ๋ก MSSQL์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋๋ก์ด๋ Custom ListView์ ๋์ฐ๋๋ก ํ๊ฒ ๋ค.