нет ошибки при вставке SQL, но таблица не имеет данных - PullRequest
0 голосов
/ 07 февраля 2011

Я использую sqlite в Titanium Mobile.У меня не было проблем с запуском обновлений для другой таблицы, в том же БД, так что, похоже, мое соединение в порядке.однако, когда я запускаю вставки в таблицу, я не получаю вставленных данных, и не выдается ошибка / исключение.так что я запутался в происходящем.вот моя структура таблицы

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();

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

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);
1 голос
/ 07 февраля 2011

Строковые литералы SQL должны быть заключены в одинарные, а не двойные кавычки.

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

неверное утверждение.

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

- правильный оператор SQL.

Кроме того, вы ДОЛЖНЫ убедиться, что то, что вы вставляете, правильно экранировано (чего у вас нет). Поэтому вы должны удваивать каждую одиночную кавычку внутри вашей переменной, прежде чем объединять ее с остальной частью оператора SQL.

...