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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

13169閲覧

「SQLServerException: インデックス 1 は範囲外です。」のエラーが出て困っています。

ggpw012857

総合スコア7

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2017/10/17 01:18

編集2017/10/17 08:48

研修でjavaを勉強しています。
SELECT文でデータベースからIDと期間を指定して出力しようとしているのですが、うまくいきません。
よろしくお願いします。

###発生している問題・エラーメッセージ
com.microsoft.sqlserver.jdbc.SQLServerException: インデックス 1 は範囲外です。

###該当のソースコード
java
public class sampleDAO {
private final String DRIVER_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private final String JDBC_URL = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=sampleSUM";
private final String DB_USER = "sa";
private final String DB_PASS = "";

public List<exampleBean> find(Date date) {
Connection conn = null;
List<exampleBean> examList = new ArrayList<exampleBean>();
// DBへ接続
try {

Class.forName(DRIVER_NAME); conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); String sql = "SELECT * FROM Sample WHERE ID=1000 and YM='?'"; PreparedStatement pStmt = conn.prepareStatement(sql); pStmt.setDate(1, date); // SELECT文の実行 ResultSet rs = pStmt.executeQuery(); while (rs.next()) { int h1 = rs.getInt("h1"); int h2 = rs.getInt("h2"); int h3 = rs.getInt("h3"); int h4 = rs.getInt("h4"); ExampleBean example = new ExampleBean(h1, h2, h3, h4); exampleList.add(example); } } catch (SQLException e) { e.printStackTrace(); return null; } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); return null; } } return examList; } }

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

? にバインド変数を設定する場合、エスケープが必要であれば自動エスケープをしてくれます。

今の実装ですと、例えばDateが 2017-01-01 の場合

sql

1SELECT * FROM Sample WHERE ID=1000 and YM=''2017-01-01''

になってしまいます(= 2017-01-01 をエスケープしすぎているため、エラーになります)。

そのため、

php

1//String sql = "SELECT * FROM Sample WHERE ID=1000 and YM='?'"; 2String sql = "SELECT * FROM Sample WHERE ID=1000 and YM=?";

に変更してみてはいかがでしょう?

投稿2017/10/17 04:45

nak

総合スコア696

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

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

ggpw012857

2017/10/17 06:13

ご回答ありがとうございます。 自動エスケープしてくれるんですね。勉強になりました。 修正してみたところ今度は「オペランド型の不整合: date は int と互換性がありません」とエラーメッセージがでてしまいました。
nak

2017/10/17 11:15

バインド変数で渡している値はdateなので、YMカラムがintなのではありませんか?(型があっていないと検索できません) テーブル定義をご確認ください。
ggpw012857

2017/10/18 00:13

今調べてみたところテーブル定義ではYMカラムはDate型となっています。
nak

2017/10/18 04:39

ご確認ありがとうございます。となると、問題になっているのはテーブル定義(カラム定義)ではなさそうですね。 新しく問題になった「オペランド型の不整合」については、 https://teratail.com/questions/96667 で別途質問されていらっしゃる&回答してくださる方もいらっしゃるようですので(私も、そちらの回答者さんと似たような質問をしようと思っておりました)、こちらの質問はいったん閉じてしまっても良いのではないでしょうか?
ggpw012857

2017/10/18 06:03

ありがとうございます。 かしこまりました。こちらの質問は閉じさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問