質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

417閲覧

AndroidアプリでSQL Serverへの直接接続し、検索・登録・更新を行いたい

gucchi61

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2025/05/30 11:40

編集2025/06/03 00:45

実現したいこと

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特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

utm.

2025/05/30 12:08

こんにちは android.os.NetworkOnMainThreadExceptionの回答とは関係ないのですが、 そちらの回答でSQL Serverのドライバのバグと私が回答していると思うのですが、実際にはSQL Serverのバージョンが古いTLSという暗号化技術?の対応バージョンが古いとなるようです。 対策としてはSQL Serverのバージョンをあげるというのが正しいようです。
utm.

2025/05/30 12:45

この人のコードって参考にならなかったんですかね?接続出来てる見たいですが... Kotlinだったらご助力できるかと思うのですが。 https://teratail.com/questions/237899
jimbe

2025/05/30 17:14 編集

コードが中途半端で、どのような構造・処理をされている/されていないのが問題なのかが判断出来ません。 現象が再現される実行可能な小さいコードと、そのコードを実行して表示された例外(エラー)メッセージを(解釈を入れずそのまま)御呈示下さい。 また、android や java、 SQLServer 等関係物の各種バージョン、ダウンロードしたものをどのように開発環境に配置したか等も書かれた方が良いと思います。
utm.

2025/05/30 17:23 編集

単純に android.os.NetworkOnMainThreadException というエラーが発生していて、Android上でjdbcでConnectionが取れないという話ですよね? 呼び出し時のコードがあるといいと思うのですが、上の例を見る限りそのエラーは出なさそうにも思えはします。 (Javaに明るくありませんが...)
gucchi61

2025/06/02 02:34

>jimbeさん ご回答いただき、誠にありがとうございます。 コードを整理して記載しましたので、ご確認お願い致します。 エラー箇所  Connection objCon = DriverManager.getConnection(DB_URL, USER, PASS); エラー内容  android.os.NetworkOnMainThreadException ・androidバージョン:14.0 ・SQL Server:2019(15.02) ・jtdsドライバー:C:\Users\ユーザー名\AndroidStudioProjects\HandySystem\app\libs\jtds-1.3.1.jar  Androd StudioでProject Structure - Deprendencies からこのjarを配置しました。 ・java.sqlパッケージをimportして、Connection、DriverManagerなどは参照できています 情報足りていますでしょうか。よろしくお願いいたします。 >utmさん ご確認ありがとうございます。 >android.os.NetworkOnMainThreadException >というエラーが発生していて、Android上でjdbcでConnectionが取れないという話ですよね? おっしゃる通りです。 原因が分かっておらず、jtdsドライバーが正常に使えていないなどですかね。。。
dodox86

2025/06/02 03:19

> android.os.NetworkOnMainThreadException これは、「メインスレッドでネットワーク通信をしちゃってますよ(してはダメですよ)」を示すExceptionです。 https://developer.android.com/reference/android/os/NetworkOnMainThreadException 最近のAndoridアプリでは、メインスレッド(単純にActivityでの実行)でのネットワーク通信はできません。 古いサンプルアプリなどを参照する場合にはその辺りの兼ね合いがあるので、自分のアプリと実行するAndroidのバージョンに気を付けないといけません。 > 原因が分かっておらず、jtdsドライバーが正常に使えていないなどですかね。。。 それ以前の問題ですね。JTDSのドライバーに限らず、Microsoftの提供するJDBCドライバーでも起こるはずです。まず、メインスレッドではなく別のスレッドから実行するような形態にする必要があると思います。HTTPや独自でもTCPの通信をする最新のサンプルソースコードなどから参考にする必要があります。
jimbe

2025/06/02 05:07

編集ありがとうございます。 なお、出来ればエラー内容やバージョン等も質問に入れて頂いたほうが、後から見る方々がコメントを見なくても分かって良いかと思います。 もし再編集される機会がありましたら、エラー(例外)に関しては表示から一部を抽出するのではなく、なるべくそのままコピペしてください。 例外の表示内には、どのクラスの何行で何が起きていたのかの詳細が含まれています。それが原因を把握する重要な情報になります。 そして既に utm. さんがコメントされていますが、 AsyncTask の使い方を間違われておられるようです。
gucchi61

2025/06/02 11:10

>dodox86さん ご回答ありがとうございました。 AsyncTaskで非同期の処理にしてandroid.os.NetworkOnMainThreadExceptionを回避し、検索結果を取得することができました。 >jimbeさん ご指摘ありがとうございます。記載内容について、今後はそのようにします。 AsyncTaskの使い方が間違っていましたが、解決することができました。 ------------------- また別の問題になってしまうのですが、非同期処理後に画面遷移(ログイン→メニュー)を行いたいのですが、可能でしょうか。 onPostExecuteメソッドでUI処理が可能なようですが、以下がビルドエラー(メソッドを作成しなさい、という指示)になってしまいます。 // メニュー画面の起動 startActivity(intent); ネットで調べていろいろ情報はありましたが、Android初心者の私には難しくて理解できませんでした。 ご教示いただけますと幸いです。よろしくお願いいたします。
jimbe

2025/06/02 18:19

この欄は「質問へのコメント」で、仕様上は回答ではありません。 問題が解決しましたら回答からベストアンサーを選ぶことで「解決済」となりますが、今の所回答がありませんので、ご自身で回答としてどのようなソースにすることで解決したのかをお書きになって、それをベストアンサーとしてください。 なお >また別の問題になってしまうのですが(ry は、余程この質問に関係するので無ければ別質問とされたほうが良いと思います。 その際は先にコメントさせて頂いたように、現象が再現される実行可能な小さいコードと、そのコードを実行して表示された例外(エラー)メッセージを(解釈を入れずそのまま)御提示下さい。 本件のように、ご自身が問題個所と思って書かれた部分は実は関係無くコードの他の部分に原因があったということは、決して少なくありません。
gucchi61

2025/06/03 01:01

コメントありがとうございます。別の質問で投稿したいと思います。 皆様から多数コメントをいただき、解決できましたので、ベストアンサーを選びたいのですが、ボタンがどこにも見つかりません。ベストアンサーの選び方をご教示いただけますか。よろしくお願いします。
jimbe

2025/06/03 05:19

>ベストアンサーの選び方をご教示いただけますか。 >今の所回答がありませんので、ご自身で回答としてどのようなソースにすることで解決したのかをお書きになって、それをベストアンサーとしてください。 です。
guest

回答2

0

特に、一般への公開を行うアプリでは、このような構成は危険なので取るべきではありません

「アプリから直接RDBMSへ接続する」ということは、「配布するアプリにデータベースのID・パスワード(あるいはそれに相当する認証情報)を入れてばらまく」ということになるので、認証情報も容易に入手できてしまいます。

おまけに、接続情報がなかったとしても、インターネットから直接見える位置にDBサーバを置くという構成は、これもこれで攻撃対象となるなど、褒められたものではありません。

Androidということで、ストアに登録せず内輪で使う野良アプリにするということであれば、前者の問題はあまり影響しませんが、後者の問題は相変わらず影響します。

投稿2025/06/03 05:46

maisumakun

総合スコア146628

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

utm.

2025/06/03 07:52 編集

どうするべきですか? WebAPIなどを介して特定の操作を特定のユーザーだけができるようにすべき? ビルド時に埋め込み、envファイルなどで定義するべき? その他、どうする方法があるのでしょうか?質問者ではないのですが、せっかくここまでの情報があるのであれば、追記したほうが良いかと思い質問させていただきました。 少し調べてみましたが、 Play Integrity APIというのがあるみたいですね。 https://developer.android.com/google/play/integrity/overview?hl=ja 回答者さんはどのような方法を推奨しているのでしょうか。
maisumakun

2025/06/03 07:59

> WebAPIなどを介して特定の操作を特定のユーザーだけができるようにすべき? 基本的には、この路線が標準的です。
gucchi61

2025/06/03 09:04

回答ありがとうございます。 おっしゃる通り、セキュリティ面で非常にリスクがありますので、WEBサーバを経由する方法を検討したいと思います。
guest

0

自己解決

「該当のソースコード」に記載したコードで解決。
AsyncTaskで非同期処理内で接続処理を行うこと。

投稿2025/06/03 09:07

gucchi61

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問