binaryへのbyte配列の入れ方

このQ&Aのポイント
  • データベースにbyte配列を保存する方法について学んでいます。
  • 現在、JDBCを使用してSQLiteにデータを入れています。
  • 画像データを保存するため、byte配列をデータベースに格納する方法を知りたいです。
回答を見る
  • ベストアンサー

binaryへのbyte配列の入れ方

私は現在データベースの勉強をしている学生です。 開発環境はJDBCを使い、SQLiteにデータを入れています。 最終的には画像データ(byte)をデータベースに中に入れようと思っているのですが、まずは手始めに数字を、binaryで宣言したデータベースの中に入れたのですが、おもうような結果が得られず困っています。 具体的にソースで説明させていただくと、 String sql1 = "create table Pointing (B binary)"; statement.executeUpdate(sql1); byte[] b = new byte[2]; b[0] = 3; b[1] = 2; String sql2 = "insert into Pointing values(" + b[0] + b[1] + )"; statement.executeUpdate(sql2); ResultSet rs2 = statement.executeQuery("select * from Pointing"); while(rs2.next()) { byte[] b2 = rs2.getBytes("B"); System.out.println("B = " + b2[0]); } この結果が51となってしまいます。 正直、入れ方や取り出し方も全部いろんなサイトから引っ張ってきたり、憶測等で書いたものなので、やり方があっているとはおもっていません。なので正しい方法を知りたく書かせていただきました。 ご回答お待ちしております。

  • MySQL
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.1

> 正直、入れ方や取り出し方も全部いろんなサイトから引っ張ってきたり、憶測等で書いたものなので、やり方があっているとはおもっていません。 んじゃ、まず、C# と SQLite のマニュアルを読みましょう。 C# やら、PHP やら、文字列主体の言語では、とりあえず、文字列に暗黙の型変換が行われる。 51 というのは要するに、カラムに 文字列 '32' が代入され、その最下位バイト '3' を読んだために、51 が表示されている。 クエリが通っただけまし、位に思ったほうがいいかもしれない。 普通はバインドを使い、何だか分からないものを突っ込っこむような野蛮なことはしない。

lain_003
質問者

お礼

いわれた通りバインドを使ったら、問題なくいれることができました。 ありがとうございました。

関連するQ&A

  • Java(JDK1.6)のbyte配列をそのままpostgresqlに

    Java(JDK1.6)のbyte配列をそのままpostgresqlに保存したいのですが上手くいかず困っております。 (詳細) DBのカラム数はかなり多く、その中の1つのデータがbyte配列データになっておりJava上で動かしているデータをそのままそっくり保存したいと思うのですが上手に動作しません。方法は(1)カラムが多いのでbyte配列以外をsql命令で保存(2)その後にbyte配列部分をResultSetを利用して追加する です。 [プログラム] 下記の場合はdataカラムにbyte配列を保存する形です。dataカラム以外のカラムにまずINSERTで保存してその後に追加でdataに保存、という形になります。細かいプログラムは全て省略しております。 ResultSet rs = null; Connection con = DriverManager.getConnection(....); Statement stmt = con.createStatement(); String sql = "INSERT INTO ~"; stmt.executeUpdate(sql); // ここでdataカラム以外にデータをDBに保存。dataカラムにはnullが入っている。 rs.close(); stmt.close(); stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); sql = "SELECT data FROM ~ WHERE id..."; // プライマリキーidを使って保存したデータを引っ張ってくる rs = stmt.executeQuery(sql); if(rs.next()){ Blob blob = rs.getBlob("data"); if(blob == null){ blob = con.createBlob(); // ※ } blob.setBytes(1,bytearray); rs.updateBlob("data",blob); rs.updateRow(); } 上記のプログラムで試したところ、次のようなエラーが発生します。 ※の部分で error=org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4Connection.createBlob() is not yet implemented. というエラーが発生します。またcreateBlob()をしない場合は下の部分でNullPointerExceptionが発生します。 そこでエラーの内容からクラス宣言時にimplements Connectionと追加するとConnectionインターフェースのメソッド(たくさん)が自動追加されます。その中にcreateBlob()という命令もあるのですが、使い方が分かりません。 [参考にしたHP] http://idocsq.net/page/446 解決方法が分からず困っております。 Blobを使わないでもbyte配列がそのままDBに保存できれば構いません。ResultSet.updateBytesという命令もあって試してみたのですがうまくいきませんでした。 詳しい方居られましたら御助言頂けませんでしょうか。

  • WebSphere/DB2/ResultSet close/Exception

    WebSphereを使って、Listenerで取得したデータソースを利用していますが、 String sql1 = "SELECT A1 FROM TEST1"; String sql2 = "SELECT B2 FROM TEST2 WHERE B1 = ?"; Connection conn = datasource.getConnection(); PreparedStatement ps1 = conn.preparedStatement(sql1); ResultSet rs1 = ps1.executeQuery(); while(rs1.next()){ PreparedStatement ps2 = conn.preparedStatement(sql2); ps2.setString(1,rs1.getString("A1")); ResultSet rs2 = ps2.executeQuery(); ps2.close(); } このロジックで、ps2をクローズすると、ps1で取得したResultSet rs1がクローズされるというExceptionが発生してしまいます。 (ループして戻ったときにrs1.next()でexceptionが起こる) なにか対処方法があるかご存知の方いらっしゃいましたら、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • データ数をカウントしたいのですが

    JAVAのJDBCを使いMySqlを操作しデータ数を取得するプログラムです。自分なりに考えたプログラムは Connection con = null; String sql = "select count(*) from テーブル名"; // コネクションを作成する。 con = DriverManager.getConnection(url, user, pass); Statement st = con.createStatement(); // SQLを実行する。 ResultSet rs = st.executeQuery(sql); String count = rs.getString("count(*)"); 実行した結果上手く出来ないのですが、この部分での間違いはありますか?

    • ベストアンサー
    • Java
  • 計算ができません。

    JDBCでプログラミングをしています。 テーブルからデータを取り出して、 計算をして、違うテーブルに格納するプログラムを作っているのですが、 計算した値が出てきません。 どこがおかしいのかわかりません。 ご指摘をお願いします。 プログラムの一部です。 ********** Connection connection =DriverManager .get connection(XXXX); Statement statement = connection.createStatement(); ResultSet rs5 = statement .executeQuery("salect ENAME, JOB, SAL, COMM from EMP where JOB = 'PRESIDENT'"); while(rs5.next()) { String ename = rs5.getString(1); String job = rs5.getString(2); long sal = rs5.getLong(3); sal = round(sal*9.00+(sal*0,19)); long comm = rs5.getLong(4); String sql ="insert into BONUS values(?,?,?,?)"; PreparedStatement prestmt = connection.prepareStatement(sql); int result = 0; for(int i = 0; i<1; i++) { prestmt.setString(1.ename); prestmt.setString(2.job); prestmt.setLong(3.sal); prestmt.setLong(4.comm); result += prestmt.executeUpdate(); } } rs5.close(); statement.close(); connection.close(); ********** プログラムの中でSALの計算をしているのですが、 結果として出てくるのが元の値です。 計算結果をどうしたら出せるのか教えてください。

  • MySQLとJavaでのコードについて。

    JavaBeanを使って、MySQLにデータを追加したいのですが、それがなかなかうまくいかず質問してます。 Statement statement = connection.createStatement(); String sql_str ="INSERT INTO customer VALUES(\"" +name+"','"+email+"','"+password+"\")"; int r=statement.executeUpdate(sql_str); このコードはjavaBeanのなかに入っており、name,email,passwordはjspからjavabeanに送られてきます。多分、VALUESの後のname,emai,passwordを入れるのに”’などの使い方が間違ってると思います。本には載ってなかったので、ウェッブ検索してみよう見真似でやったので、”’の使い方を把握してません。誰か分かる方回答お願いします。 あとこれとは違うmethodにSELECT文を使った時、 String sql_str = "SELECT email, password FROM customer where email='"+email+"'AND password='"+password+"'"; ResultSet rs = stmt.executeQuery(sql_str);とやったときは動きました。最初はこれと同じようにINSERT 文も書いたのですが、動かなかったんですよね。

    • ベストアンサー
    • Java
  • SQL構文について教えて下さい!

    こんばんわ。 いつもお世話になっております。 ServletでIPアドレスを取得してデータベースに登録してあるデータであって尚且つ、AuthorityというカラムにAかBのどちらかがあるデータを抽出するSQLを作成しているのですが上手くいきません。 教えて下さい!お願いします。 作成中のSQL構文を途中から投稿致します。 String RemoteAdd = request.getRemoteAddr(); try { String sql = "SELECT * FROM Api where (Authority = 'A' OR Authority = 'B') AND IPAddress='"+ RemoteAdd +"'"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery();

  • データベースから取得したデータを配列に格納できません。

    jTableにSQL文の結果を表示させようとして結果を以下のように配列に 格納しようとしました。 public String[][] Serch(){ int i=0; String[][] rowData; String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=helloTable.mdb"; try { // ドライバクラスをロード Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // データベースへ接続 Connection con = DriverManager.getConnection(str, "", ""); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); String sql = "SELECT * FROM ハローテーブル"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ // NOを取得 String no = String.valueOf(rs.getInt("NO")); // 言語を取得 String lang = rs.getString("言語"); // メッセージを取得 String msg = rs.getString("メッセージ"); rowData[i][0] = no; rowData[i][1] = lang; rowData[i][2] = msg; i++; } stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } return rowData; } このメソッドで得た配列を表示させようとすると以下の結果が表示されます。 java.lang.NullPointerException 正常なSQL文の結果は以下の通りです。 1 日本語 こんにちは世界 2 英語 Hello World 3 ドイツ語 Hallo Welt 配列の行数はSQL文の結果の行数に合わせたかったのですがうまくいきません。 どのように直せばSQL文の結果を配列にすべて格納できるでしょうか?

    • ベストアンサー
    • Java
  • ResultSetインターフェイスでの next() の使い方

    データベースからSQLをつかって受注件数を取得したい時に、なぜ、下記のように next() をしなければいけないのかが分かりません。 初心者なので、出来ましたら詳しく教えてください。 お願いします。 int count = 0 ; Statement stmt = con.createStatement() ; String sql = "select count(*) from 受注" ; ResultSet res = stmt.executeQuery(sql) ; if (res.next()) { count = res.getInt(1) ; }

    • ベストアンサー
    • Java
  • byte型をstring型として扱うには

    今日の質問/マイページに反映されないので、再度の質問です。 windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

  • シンボルを見つけられませんのエラー原因

    Windows 8.1, Java 6です。 参考書通りに入れたので間違えているはずがないのですが、 Inquiry.java:33: シンボルを見つけられません。 シンボル: メソッド executeUpdate(java.lang.String[]) 場所 : java.sql.Statement の インタフェース ResultSet rs = st.executeUpdate(qry); となっています。何が原因でしょうか? package mybeans; import java.util.*; import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; public class Inquiry implements Serializable { private ArrayList<String> colname; private ArrayList<ArrayList> data; public Inquiry() { try{ String url = "jdbc:mysql://localhost:3306/work;create=true"; String usr = ""; String pw = ""; Connection cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/work","割愛","割愛"); DatabaseMetaData dm = cn.getMetaData(); ResultSet tb = dm.getTables(null, null, "inquiry", null); Statement st = cn.createStatement(); String[] qry = {"INSERT INTO inquiry VALUES ('いとう', '22', '名古屋市', '西区', '企画部', 2)"}; ResultSet rs = st.executeUpdate(qry);  ←ここがエラー箇所 rs.close(); st.close(); cn.close(); } catch(Exception e){ e.printStackTrace(); } } public ArrayList getData() { return data; } public ArrayList getColname() { return colname; } }

    • ベストアンサー
    • Java