0

EDIT4:

理由はわかりませんが、以下で使用した構造が機能しませんでした。java2s Web サイトで見つけたファイルを変更する必要がありました。これは TableFromDatabase と呼ばれ、JTextFields を public static にしてから、FrmMovimento などで TableFromDatabase クラスをインスタンス化します。

TableFromDatabase frame = new TableFromDatabase();
jDesktopPane2.add(frame);
frame.show();

TableFromDatabase 行も変更しました

frame.setDefaultCloseOperation( EXIT_ON_CLOSE_ );

frame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );

元の投稿:

プログラムのこの部分、JInternalFrame ファイル FrmMovimento で、Visualizar (「表示」) というボタンを作成しました。テキスト フィールドに入力した内容に基づいて、ユーザーが定義した間隔を表示する必要があります。

これらの JTextFields があります: Code from: _ To: _ Asset: _

これらの JFormattedTextFields: Date from: _ To: _

たとえば、すべてのレジスタを選択する別の SELECT ステートメントを使用すると、JInternalFrame FrmListarMov から JDesktopPane にすでに表示されているレジスタがあります。しかし、タイトルで入力したように入力した場合はそうではありません:

public List<MovimentoVO> Lista() throws ErroException, InformacaoException{
    List<MovimentoVO> listaMovimento = new ArrayList<> ();
    try {

        MySQLDAO.getInstancia().setAutoCommit(false);
        try (PreparedStatement stmt = MySQLDAO.getInstancia().prepareStatement(
             "SELECT * FROM Cadastro2 WHERE Codigo BETWEEN "+ txtCodDeMov +" AND "+ txtCodAteMov +";") {

            ResultSet registro = stmt.executeQuery();

            while(registro.next()){

                MovimentoVO Movimento = new MovimentoVO();

                Movimento.setCodDeMov(registro.getInt(1));
                Movimento.setCodAteMov(registro.getInt(2));
                Movimento.setAtivoMov(registro.getString(3));
                Movimento.setDataDeMov(registro.getString(4));
                Movimento.setDataAteMov(registro.getString(5));

                listaMovimento.add(Movimento);
            }
        }
    } catch (SQLException ex) {            
          throw new ErroException(ex.getMessage());
     } catch (InformacaoException ex) {  
          throw ex;
    }
    return listaMovimento;
}

SELECT 行の txtCodDeMov は、"Code from" の JTextField に付けた名前で、txtCodAtemov は最初の "To" の JTextField に付けた名前です。

ああ、Linux Mint 12 64 ビットで NetBeans 7.1.2 (Build 201204101705) と MySQL Ver 14.14 Distrib 5.1.63 を使用しています。

編集: 実際には、MovimentoVO2、MovimentoDAO2 などです。2 つのファイルを作成したためです。申し訳ありませんが、私はまだこれらのテクニックを使用することに初心者です。

テーブル Cadastro2 から、主キー Codigo のみがクエリに使用されます。後で、資産の売買を登録する別のテーブルを作成します。これにより、資産のタイプと移動日が保持され、SELECT ... BETWEEN ... AND に追加されます。ここまでで、JTextField に入力した値を Java が取得して SELECT コマンドに入れる方法を理解するだけで済みます。

EDIT2: クライアント登録画面では、次のようにクエリ ボタンが 100% 機能しています。しかし、これは状況が異なります。この場合、指定されたコード (テーブル Cadastro2 の主キー) を持つレジスタが見つかった場合、ボタン イベントによってすべての JTextField が完了するためです。ここでやりたいことは、間隔内のすべてのレジスターを含むテーブルを作成することです。

EDIT3: 正しい用語はレポート生成だと思います。iReport と Jasper Reports について聞いたことがありますが、使用したことはありません。このプロジェクトは 12 月に大学で発表しなければならないことを考えると、これら 2 つのツールを学習する時間はありますか? 私はまだJavaを学んでいるので、それは悪い動きでしょうか? 最初はそうだと思うので、すべてNetbeansだけでやっています。


それを見つけた。まず、mod_rewrite を有効にする必要があります。次に、プロキシ設定の前に、次のように URL を書き換えるだけです。

url.rewrite-once = ( "/(.*)" => "/search?q=$1" )

皆さん、ありがとうございました。

4

4 に答える 4

2

動的SQLを使用しないでください。SQLインジェクションが発生します。パラメータを使用します。

交換 "SELECT * FROM Cadastro2 WHERE Codigo BETWEEN "+ txtCodDeMov +" AND "+ txtCodAteMov +";"

"SELECT * FROM Cadastro2 WHERE Codigo BETWEEN ? AND ?" // without semicolon in query
...
stmt.setString(1, txtCodDeMov); // depends of 'Codigo' type, it may be stmt.setLong(1, txtCodDeMov);
stmt.setString(2, txtCodAteMov);
ResultSet registro = stmt.executeQuery();

編集:クエリでフィールドの順序を指定しない場合は、インデックスごとにフィールド値を取得しないでください。後でデータベースのフィールドの順序を変更でき、関数は誤ったrusultを返します。フィールド名で値を取得するか、フィールドの順序を指定します。

于 2012-09-17T15:30:25.313 に答える
1

私は少し誤解されているかもしれませんが、@ user1516873が言ったようにパラメーターを使用するか、@nambariが言ったように'を追加することを考慮していること以外は。各JTextfieldのgetText()メソッドが欠落していて、+演算子が暗黙的にtoStringメソッドを呼び出していると思います。

于 2012-09-17T16:10:00.173 に答える
0

JTextField.getText() を使用してこれらの値を取得してみてください。また、準備されたステートメントのパラメーター化も検討する必要があります。

あなたはこのようなことをするでしょう。

"SELECT * FROM Cadastro2 WHERE Codigo BETWEEN ? AND ?;"

stmt.setInt(1,1); stmt.setInt(2,2);

.setInt を必要なデータ型に変更します。最初のパラメーターは「?」です。位置。最初の .setInt は最初の ? を設定します。値 (そのメソッドでは 1 です)。

于 2012-09-17T15:06:52.023 に答える
0

txtCodDeMo と txtCodAteMov が日付であると仮定すると、これらは一重引用符で囲む必要があります。

SELECT * FROM Cadastro2 WHERE Codigo BETWEEN '"+ txtCodDeMov +"' AND '"+ txtCodAteMov +"'";

注: この構文は、SQL インジェクションに対して脆弱です。

可能であれば、PreparedStatement を使用してください。

于 2012-09-17T15:02:10.190 に答える