実現したいこと
AndroidアプリでSQL Serverへ直接、DB接続してテーブルの検索・登録・更新を行いたいです。
Android Studio、言語Javaで開発しています。
発生している問題・分からないこと
MicrosoftのJDBCドライバーでは暗号化の関係で出来ないようで、代わりにJTDSというドライバーで出来るようです。
試行錯誤してコーディングしてみましたが、エラーが解決できず行き詰りまっています。
情報が少なくて詳しい使用方法が調べても分かりません。
開発のご経験がある方がいらっしゃいましたら、設定内容やサンプルソースを交えて教えていただけますでしょうか。
よろしくお願いいたします。
JTDSドライバー ダウンロードサイト
https://sourceforge.net/projects/jtds/files/jtds/1.3.1/
参考にさせていただいた類似の質問
https://teratail.com/questions/2lu5t5gf6dva3t#reply-jphm9f0tgol7jz
該当のソースコード
Java
1package jp.ne.newest.android.handysystem; 2 3import android.os.Bundle; 4import android.text.InputType; 5import android.view.View; 6import android.widget.Button; 7import android.widget.EditText; 8 9import androidx.appcompat.app.AppCompatActivity; 10 11/** 12 * ハンディーターミナルシステム 13 * ログイン 14 * メインアクティビティクラス 15 * 16 * @author OA Promotion Center Co. Ltd. 17 * 18 * 2025/05/26 新規作成 19 */ 20public class LoginActivity extends AppCompatActivity { 21 22 public static String gUserId = ""; 23 public static String gUserName = ""; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_login); 29 30 // ログインボタンであるButtonオブジェクトを取得 31 Button btClick = findViewById(R.id.btLogin); 32 // リスナクラスのインスタンスを生成 33 LoginListener listener = new LoginListener(); 34 // ログインボタンにリスナを設定 35 btClick.setOnClickListener(listener); 36 } 37 38 /** 39 * ログインボタンをクリックしたときのリスナクラス。 40 */ 41 private class LoginListener implements View.OnClickListener { 42 @Override 43 public void onClick(View view) { 44 45 // ユーザーID入力欄であるEditTextオブジェクトを取得 46 EditText input = findViewById(R.id.etUser); 47 // 入力候補非表示 48 input.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); 49 // 入力されたユーザーID文字列を取得 50 gUserId = input.getText().toString(); 51 // ユーザー検索(非同期処理) 52 String sql = "select STRVAL from XMNGE where entry = '" + gUserId + "'"; 53 new MSSQLConnection(LoginActivity.this).execute(sql); 54 } 55 } 56} 57 58 /** 59 * ログインボタンをクリックしたときのリスナクラス。 60 */ 61 private class LoginListener implements View.OnClickListener { 62 @Override 63 public void onClick(View view) { 64 65 // ユーザー検索 66 String sql = "select STRVAL from XMNGE where entry = '1111'"; 67 gUserName = String.valueOf(new MSSQLConnection().doInBackground(sql)); 68 69 } 70 } 71} 72 73************************************************************************** 74package jp.ne.newest.android.handysystem; 75 76import static androidx.core.content.ContextCompat.startActivity; 77import static jp.ne.newest.android.handysystem.LoginActivity.gUserId; 78import static jp.ne.newest.android.handysystem.LoginActivity.gUserName; 79 80import android.content.Context; 81import android.content.Intent; 82import android.os.AsyncTask; 83import android.util.Log; 84 85import java.sql.Connection; 86import java.sql.DriverManager; 87import java.sql.PreparedStatement; 88import java.sql.ResultSet; 89 90public class MSSQLConnection extends AsyncTask<String, Void, String> { 91 92 private static final String DB_URL = "jdbc:jtds:sqlserver://10.100.XXX.XXX:1433/DBNAME;"; 93 private static final String USER = "sa"; 94 private static final String PASS = "xxxxx"; 95 96 String errMSS = "err発生"; 97 98 private final Context context; 99 100 protected MSSQLConnection(Context context) { 101 this.context = context; 102 } 103 104 protected String doInBackground(String... params) { 105 106 String result = ""; 107 108 try { 109 //ドライバを指定 110 Class.forName("net.sourceforge.jtds.jdbc.Driver"); 111 Connection objCon = DriverManager.getConnection(DB_URL, USER, PASS); 112 // SQL実行 113 PreparedStatement stmt = objCon.prepareStatement(params[0]); 114 ResultSet rs = stmt.executeQuery(); 115 116 while (rs.next()) { 117 result += rs.getString(1); 118 } 119 120 rs.close(); 121 stmt.close(); 122 objCon.close(); 123 124 } catch (Exception e) { 125 e.printStackTrace(); 126 Log.d("LogD", errMSS + ":" + DB_URL); 127 result = result + "接続エラー"; 128 } 129 return result; 130 } 131 132 protected void onPostExecute (String result) { 133 // インテントオブジェクトを生成 134 super.onPostExecute(result); 135 Intent intent = new Intent(this.context, MenuActivity.class); 136 // メニュー画面に送るデータを格納 137 gUserName = result; 138 intent.putExtra("userId", gUserId); 139 intent.putExtra("userName", gUserName); 140 141 // メニュー画面の起動 142 startActivity(intent); 143 } 144} 145 146 147### 試したこと・調べたこと 148- [x] teratailやGoogle等で検索した 149- [x] ソースコードを自分なりに変更した 150- [ ] 知人に聞いた 151- [ ] その他 152 153##### 上記の詳細・結果 154通信の非同期処理の対応もしたが、'android.os.NetworkOnMainThreadException'が発生してしまう。 155 156### 補足 157特になし

回答2件
あなたの回答
tips
プレビュー