0

私はチタンモバイルでsqliteを使用しています。同じデータベース内の別のテーブルで更新を実行しても問題はなかったので、接続は問題ないようです。ただし、テーブルで挿入を実行すると、データが挿入されず、エラー/例外がスローされません。だから私は何が起こっているのか混乱しています。ここに私のテーブル構造があります

CREATE TABLE events (
gCal_uid VARCHAR,
title VARCHAR,
content VARCHAR,
location VARCHAR,
startTime VARCHAR, 
endTime VARCHAR, 
published VARCHAR,
updated VARCHAR,
eventStatus VARCHAR
);

これがコードです。以下の挿入ステートメントを見ることができます。変数の出力では、それらすべてにデータが含まれています。おそらく私の構文が間違っていますか?

var db = Ti.Database.open('content');
Titanium.API.info(" number or results returned = " + cal.feed.entry.length);
var i;
for (i=0; i < cal.feed.entry.length; i++){
    var e = cal.feed.entry[i];

    var calUid = e.gCal$uid.value;
    var title = e.title.$t;
    var content = e.content.$t;
    var location = e.gd$where.valueString;
    var startTime = e.gd$when[0].startTime;
    var endTime =  e.gd$when[0].endTime;
    var published = e.published.$t;
    var updated = e.updated.$t;
    var eventStatus = e.gd$eventStatus.value;

    Titanium.API.info(calUid + title + content + location + startTime + endTime + published + updated + eventStatus);

    var theData = db.execute('INSERT INTO events (gCal_uid, title, content, location, startTime, endTime, published, updated, eventStatus) VALUES("'+calUid+'","'+title+'", "'+content+'", "'+location+'", "'+startTime+'", "'+endTime+'", "'+published+'", "'+updated+'", "'+eventStatus+'")');
    theData;
    Ti.API.info("rows inserted" + i);
}
Ti.API.info("closed the db");
db.close();
4

2 に答える 2

1

SQL 文字列リテラルは、二重引用符ではなく、単一引用符で囲みます。

INSERT INTO foo (a) VALUES("a");

は正しい記述ではありません。

INSERT INTO foo (a) VALUES('a');

正しい SQL ステートメントです。

さらに、挿入したものが適切にエスケープされていることを確認する必要があります (そうではありません)。したがって、変数を残りの SQL ステートメントと連結する前に、変数内のすべての一重引用符を二重にする必要があります。

于 2011-02-07T17:23:28.693 に答える
1

SQL は一重引用符を使用します。Javascript はどちらかを使用します。

結果の SQL を自分で書いたかのようにしたい

INSERT info foo (a,b) values ('a value', 'b value')

最も単純でより正確な等価物は次のようになります。

var theData = db.execute("INSERT INTO events (gCal_uid, title, content, location, startTime, endTime, published, updated, eventStatus) VALUES('"+calUid+"','"+title+"','"+content+"','"+location+"','"+startTime+"','"+endTime+"','"+published+"','"+updated+"','"+eventStatus+"')");

しかし、インジェクションの問題や引用エラーを回避するために、パラメーター置換を使用したい場合があります。

var theData = db.execute("INSERT INTO events (gCal_uid, title, content, location, startTime, endTime, published, updated, eventStatus) values (?,?,?,?,?,?,?,?,?)", calUid, title, content, location, startTime, endTime, published, updated, eventStatus);
于 2011-02-07T20:33:02.647 に答える