0

選択クエリを使用して、テーブルから特定のレコードを名前で選択しています。テーブルは 25000 を超えるレコードで構成されています。

テーブル形式は

|rcode|rname|vcode|vname|div_sec|ofrn|phone|dat|

また、同じ名前のレコードが複数含まれている場合があります。次のクエリを使用しています

ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'");
if(rs.next())
{
     rcode=rs.getString("rcode");
     out.print(rcode);
     out.print(" ");
}

与えられた rname の rcode を見つけなければなりません。上記のクエリを使用することによる問題は、「kannan」という名前のレコードを検索すると、テーブルに「kannan」という名前のレコードが6つ含まれることです。

10001 kannan
10089 kannan
11826 kannan
12241 kannan
12389 kannan
19926 kannan

今、私のクエリは最初のレコードのみをフェッチし、結果をrcode="10001"として返します

私が使用する場合

while(rs.next())
{
     rcode=rs.getString("rcode");
     out.print(rcode);
     out.print(" ");
}

最後のレコードのみをrcode="19926"として出力します。rcode 12241 で "kannan" のレコードを取得したいとします。クエリを変更してレコードを取得するにはどうすればよいですか? 詳細を取得するには rname のみを使用する必要があることに注意してください。

この問題の解決策はありますか? 誰か助けてください

4

2 に答える 2

2

実際には、2 番目のスニペットは、書き起こしが間違っていない限り、すべてのレコードを出力するはずです。これは最後を出力します:kannan

while(rs.next()) {
    rcode=rs.getString("rcode");
}
out.print(rcode);
out.print(" ");

理想的な解決策は、両方の列に基づいてクエリを制限するように変更することです。

select * from newfarmer where rname = 'kannan' and rcode = '12241'

ただし、それを可能性として却下しているため、それらをすべて取得して、必要なものをフィルター処理する必要があります (ただし、DBMS に任せる場合と比較すると非効率的です)。つまり、次のようなものです。

while(rs.next()) {
    rcode=rs.getString("rcode");
    if (rcode == "12241") {       // or some other identifying condition.
        out.print(rcode);
        out.print(" ");
    }
}

rname私のアドバイスは、戻って、レコードを取得するためだけに使用する必要性を再検討することです. これは奇妙な制限のように思われ、他の方法よりもはるかに最適ではないソリューションになります。

于 2013-02-06T09:34:24.773 に答える
1

2 番目の切り取りでは、確かに ResultSet 内のすべての行が取得されますが、SQL で order by 句を指定しない限り、レコードの順序が保証されないことに注意してください。たぶんそれが最後のものだけを取得していると思う理由です-返された最初の行だけを見て、それが最後に期待するIDであることを見つけ、残りを無視しています。ただの可能性。

rname 列にインデックスはありますか? そうでない場合、クエリは非常に遅くなります。

また、これ:

ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'");

は、SQL インジェクション攻撃への大きな公然の誘いです。プリペアド ステートメントでパラメーターを使用する:

//Just prepare the statement once for multiple uses:
Statement stmt = conn.prepareStatement("select * from newfarmer where rname=?");

//use it:
stmt.setString(1, name);
ResultSet rs = stmt.execute(); 
// etc...
于 2013-02-06T09:47:37.360 に答える