---
# System prepended metadata

title: Android連結Azure database的方法
tags: [JDBC, JTDS, AZure, SQL]

---

---
Android連結Azure database的方法
===

###### tags: `AZure` `JDBC` `JTDS` `SQL` 

#### jtds.jar 連線(code by Rafael)
- jtds-1.3.1.jar 導入專案中
[下載jar檔](https://www.dropbox.com/s/86o0i16wqhuq7ki/jtds-1.3.1.jar?dl=0)
- driver 引入
``` java
    Class.forName("net.sourceforge.jtds.jdbc.Driver");
```
- 連線方式

``` java
    static String v_server="***.database.windows.net";
    static String v_user="***";
    static String v_password="***";
    
    public static Connection Open(String v_db)
    {
        StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);  //此段為必要否則無法連線
        String v_url = sql_server + "databaseName="+v_db+";"+sql_user+sql_other;
        Connection con= null;
        try{
            try {
                Class.forName(v_javaname);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            con=java.sql.DriverManager.getConnection(v_url);
        }catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }
```

- 單行指令
```java
 public static List<Map<String,Object>> Load(String v_db, String v_sql) throws SQLException {
        ResultSet v_RSet=null;
        Statement stmt = null;
        Connection conn= null;
        List<Map<String,Object>> resultList=new ArrayList<Map<String,Object>>();
        Map<String,Object> row=null;
        try{
            conn=Open(v_db);
            stmt = conn.createStatement();
            v_RSet = stmt.executeQuery(v_sql);
            ResultSetMetaData metaData= v_RSet.getMetaData();
            Integer columnCount=metaData.getColumnCount();
            while (v_RSet.next())
            {
                row=new HashMap<String,Object>();
                for(int i=1;i<=columnCount;i++)
                {
                    row.put(metaData.getColumnName(i),v_RSet.getObject(i));
                }
                resultList.add(row);
            }
            v_RSet.close();
        }catch (SQLException e) {
            e.printStackTrace();
        }finally{
            try
            {
                if (v_RSet!=null && !v_RSet.isClosed()){
                    v_RSet.close();
                }
            }
            catch (SQLException ex2){
                ex2.printStackTrace();
            }
            try
            {
                if (stmt!=null && !stmt.isClosed()){
                    stmt.close();
                }
            }
            catch (SQLException ex2){
                ex2.printStackTrace();
            }
            try
            {
                if (conn!=null && !conn.isClosed()){
                    conn.close();
                }
            }
            catch (SQLException ex1){
                ex1.printStackTrace();
            }
        }
        return resultList;
```
- 呼叫方式
``` java
       public void onClick(View view) {
            String text = "";
            String dbName = "PID";
            String sqlString = "SELECT * FROM Device";
            try{
                List<Map<String, Object>> result = SQL.Load(dbName, sqlString);
                if(result.size() > 0){
                    for(Map<String, Object> map : result){
                        text += map.get("DeviceSerialNo") + "_" + map.get("DevTypeId") + "_" + map.get("DeviceFwVersion") + "_" + map.get("DeviceMacAddress") + "\n";
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            textView.setText(text);
        }
```

===
==以下是錯誤的不用看了==

#### JDBC (using Java) -- 失敗的嘗試/SSL問題
##### error1: no JDBC driver
copy mssql-jdbc-7.2.2.jre8.jar into /libs
```java     
public class MainActivity extends AppCompatActivity {

    private static final String hostName = "***.database.windows.net";
    private static final String database = "PID";
    private static final String userName = "***";
    private static final String passwd = "***";
    private String url = String.format("jdbc:sqlserver://%s:1433;database=%s;user=%s;password=%s;encrypt=true;"
                + "hostNameInCertificate=*.database.windows.net;loginTimeout=30;", hostName, database, userName, passwd );
    private String azureUrl = String.format("Data Source=tcp:%s,1433;Inital Catalog=%s;User ID=%s;Password=%s", hostName, database, userName, passwd);
    Connection connection = null;protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

                    connection = DriverManager.getConnection(url);

                    String selectSql = "SELECT * FROM Device";
                    Statement statement = connection.createStatement();
                    ResultSet resultSet = statement.executeQuery(selectSql);
                    while(resultSet.next()){
                        System.out.println(resultSet.getString(1));
                    }
                    connection.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();

    }
```