3

Netbeans と Derby データベースを使用しています。日付フィールドを持つテーブルレコードに挿入したいので、Calendar必要なものが含まれているため、オブジェクトを使用するように言われました:日付(日、月、年)、時間、分。

以下のコードでわかるように、テーブル フィールドの型はDATEです。オブジェクトを文字列として挿入しようとするとCalendar(以下のコードのようにコンマを使用)、次のようになります。

日時値の文字列表現の構文が正しくありません。

コンマなしで挿入しようとすると、次のようになります。

構文エラー: 行 1、列 159 で "[" が検出されました

おそらくCalendarオブジェクトの何か。ここで何が欠けていますか?

String from = fromForm.getText();
String to = toForm.getText();
String []date = dateForm.getText().split("/");
String []time = timeForm.getText().split(":");
int places = Integer.parseInt(placesForm.getText());
int closinghours=Integer.parseInt(closingHoursForm.getText());
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Integer.parseInt(date[2]),Integer.parseInt(date[1]),Integer.parseInt(date[0]),Integer.parseInt(time[0]),Integer.parseInt(time[1]));

String query="INSERT INTO APP.TRUMPS (TRUMPID,DEPART,ARRIVE,START,PLACES,PROPOSING_USER_LOGIN,CLOSING_HOURS)"+
        "VALUES ('"+newTrampTrumpistClient.login+dateForm.getText()+timeForm.getText()+"','"+from+"','"+to+
                "','"+calendar+"',"+places+",'"+newTrampTrumpistClient.login+"',"+closinghours+")";
String result=newTrampTrumpistClient.WritingReading("sql_insert", query);
4

3 に答える 3

4

フィールドを設定するために使用する必要があります(またはフィールドをPreparedStatement#setTimestamp()設定するために使用する必要がありますが、それは時間と分をカバーしていません...)。TIMESTAMP/DATETIMEsetDate()DATE

String sql = "INSERT INTO"
    + " APP.TRUMPS (TRUMPID, DEPART, ARRIVE, START, PLACES, PROPOSING_USER_LOGIN, CLOSING_HOURS)"
    + " VALUES (?, ?, ?, ?, ?, ?, ?)";
// ...

PreparedStatement preparedStatement = null;
// ...

try {
    // ...
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setString(1, newTrampTrumpistClient.login+dateForm.getText()+timeForm.getText());
    preparedStatement.setString(2, from);
    preparedStatement.setString(3, to);
    preparedStatement.setTimestamp(4, new Timestamp(calendar.getTimeInMillis()));
    preparedStatement.setInt(5, places);
    preparedStatement.setString(6, newTrampTrumpistClient.login);
    preparedStatement.setInt(7, closinghours);
    preparedStatement.executeUpdate();
    // ...
} finally {
    // ...
}

さらに、プリペアド ステートメントを使用すると、アプリケーションをSQL インジェクション攻撃から保護できます。

以下も参照してください。


具体String的な問題とは関係ありませんが、 からへの変換Calendarはかなり厄介です。からへSimpleDateFormatの変換に使用することを検討してください。として永続化できます。StringDatenew Timestamp(date.getTime())

于 2012-08-22T00:03:15.063 に答える
0

追加情報を少し追加するだけです...

Java.utils.Dateオブジェクトの使用を考えたことはありますか?

必要に応じて、必要に応じて、または少しの粒度で構築できます。「日付」(年:月:日) からミリ秒単位の時間精度まで。

次に、さまざまな getXXX() メソッドを使用して、必要な部分をキャプチャできます。

日付オブジェクトをカレンダー オブジェクトに渡すことで、少しジグリー ポーキーを行う必要があります (おそらくGregorianCalendarを使用して、Java doc ページに良い例があるリンクをたどってください)。

または、Java.util.Date を使用して、java.util.date の getTime() メソッドを介して Java.sql.date に渡すこともできます。

java.sql.time で同じことを行うことができます (つまり、同じオブジェクトを渡すと、java.util.date オブジェクトの時間部分だけが得られます)。同じメソッドを sql.timestamp に渡すと、完全なタイムスタンプが得られます。

同じ手順 (sql.timestamp - to-util.date -t​​o-sql.date (または) sql.time) を使用して、タイムスタンプから日付または時刻の部分に変換することもできますが、ほとんどの DB では、からのキャストが許可されています。ネイティブに一方から他方へ。

getTime() メソッドを java.util.date オブジェクトに渡すと、「長い」値が返されます (つまり、1970 年 1 月 1 日の Unix エポックからの時間です!) これより前の時間と日付をどのように処理するかわかりません(私はそれらが単に「負の」値であると思いますか?)。

クライアントを混乱させ、コードを難読化したい場合は、日付を長い値としてDBに保存することもできます;)

デビッド

于 2012-08-24T09:33:33.160 に答える
-1

カレンダー インスタンスから時間を取得してみてください。つまり、calendar.getTime() です。( Date オブジェクトを返します) SQL 日付にキャストする必要がある場合もあります。

于 2012-08-21T23:50:35.307 に答える