2

Delphi 2010 と Tim Anderson の SQLite3 ラッパー - http://www.itwriting.com/blog/?page_id=659 - を使用していますが、日付の挿入に問題があります

これが私のデータベースの作成です

DB.ExecSql('CREATE TABLE Tags (No Integer NOT NULL, Title VarChar(25) NOT NULL, Creator VarChar(25) NULL, Born Date NULL, Charter Boolean Default False NULL, Owned Boolean Default False NULL, Image Blob NULL, CONSTRAINT PK_No PRIMARY KEY (No));');

ビルドして正常に動作します。SQLite 管理者でテストしました - http://sqliteadmin.orbmu2k.de/管理者 を使用して日付を手動で入力することもできます

ここに私のインサートがあります

DB.ExecSql('Insert into Tags (No, Title, Creator, Born, Charter, Owned) ' +
             'values (' + quotedStr(frmTag.edtTagNo.Text) + ',' + quotedStr(frmTag.edtTitle.Text) + ',' +
                          quotedStr(frmTag.edtCreator.Text) + ',' + quotedStr(frmTag.edtBorn.Text) + ',' +
                          quotedStr(BoolToStr(frmTag.cbxCharter.Checked)) + ',' + quotedStr(BoolToStr(frmTag.cbxOwned.Checked)) + ');');

日付フィールドは、edtBorn コントロール (TRzDateEdit) によって提供されています。

挿入前に edtBorn.Text amd edtBorn.date の値を確認しましたが、日付は常に正しいです。

私は次の方法を挿入しようとしました:

frmTag.edtBorn.Text 
FormatDateTime('mm/dd/yyyy',frmTag.edtBorn.Text)
quotedStr(frmTag.edtBorn.Text)
quotedStr(FormatDateTime('mm/dd/yyyy',frmTag.edtBorn.Text))

パラメータを使用してみました

 DB.AddParamText('@ABorn', frmTag.edtBorn.Text);
 DB.AddParamFloat('@ABorn', frmTag.edtBorn.Date);

何も機能していないようです!例外はありませんが、私のフィールドは dat 値を取得しません!

4

3 に答える 3

3

日付と時刻のデータ型

SQLite は、日付と時刻を TEXT、REAL、または INTEGER 値として格納できます。

  • ISO8601 文字列としての TEXT ("YYYY-MM-DD HH:MM:SS.SSS")。
  • ユリウス日としての REAL。先発グレゴリオ暦による紀元前 4714 年 11 月 24 日のグリニッジ正午からの日数。
  • UNIX 時間としての INTEGER、1970-01-01 00:00:00 UTC からの秒数。

たとえば、REAL と INTEGER の部分を示します。

変更された SQLite3 ラッパー テストファイル:uTestSqlite

sSQL := 'CREATE TABLE testtable ([ID] INTEGER PRIMARY KEY,[OtherID] INTEGER NULL,';
sSQL := sSQL + '[Name] VARCHAR (255),[Number] FLOAT,[Date] INTEGER, [notes] BLOB,
       [picture] BLOB COLLATE NOCASE);';
sldb.execsql(sSQL);
sldb.execsql('CREATE INDEX TestTableName ON [testtable]([Name]);');

//begin a transaction
sldb.BeginTransaction;

sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Date) VALUES ("Some Name", 4,
         julianday("now"), strftime("%s","now"));';
sldb.ExecSQL(sSQL);

sSQL := 'INSERT INTO testtable(Name,OtherID,Number,Date,Notes) VALUES ("Another Name",12,
         julianday("2013-03-01"),strftime("%s","2013-03-01"), "More notes");';
sldb.ExecSQL(sSQL);

//end the transaction
sldb.Commit;

[...]

//query the data
sltb := slDb.GetTable('SELECT * FROM testtable');
if sltb.Count > 0 then
begin
//display first row
updateFields;
end;

値を表示します。

procedure TForm1.updateFields;
var
Notes: string;
myDate :TDateTime;

begin
ebName.Text := sltb.FieldAsString(sltb.FieldIndex['Name']);
ebID.Text := inttostr(sltb.FieldAsInteger(sltb.FieldIndex['ID']));

if TryJulianDateToDateTime(sltb.FieldAsDouble(sltb.FieldIndex['Number']),myDate)
   then
   ebNumber.Text := DateTimeToStr(myDate)
   else
   ShowMessage('Not a valid Julian date');

myDate:=UnixToDateTime(sltb.FieldAsInteger(sltb.FieldIndex['Date']));
ebDate.Text := DateTimeToStr(myDate);

[...]
end;

出力:

ここに画像の説明を入力

あなたの問題ではDB.ExecSql('CREATE TABLE Tags (..., Born Date NULL,...);');

で置き換えるDB.ExecSql('Insert into Tags (....) VALUES (...

+ quotedStr(frmTag.edtBorn.Text) 

'strftime("%Y-%m-%d","'+frmTag.edtBorn.Text+'")'

の値は次のfrmTag.edtBorn.Textようにする必要があります1975-10-21

次の方法で取得できます。

ebDate.Text := sltb.FieldAsString(sltb.FieldIndex['Born']);
于 2013-03-02T01:08:10.783 に答える
1

私は独自の「本当に軽い」SQLite3 ラッパーを作成しましたが、バリアントを使用して、使用する sqlite3 内部型を決定します: https://github.com/stijnsanders/TSQLite

そこで、「ゆるいタイピング」の sqlite3 が内部的に非常にうまく機能し、Variant に格納された Delphi の日付が SQLite3 で浮動小数点値に変換されることがわかりました (ちなみに TDateTime は実際にはそうです)。考えられる欠点は、日付値を SQL から操作するのが少し面倒なことです。残念ながら、既に AddParamFloat (および FieldAsFloat) を試してみましたが、うまくいかなかったようです。

したがって、日付を文字列として保存することをお勧めします.sqliteの日付形式の場合は、FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',d). 詳細はこちら: http://www.sqlite.org/lang_datefunc.html

于 2013-03-01T19:12:09.077 に答える