Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему
Вы можете динамически строить параметризованный оператор SQL формы
SELECT * FROM TABLE WHERE col IN (?, ?, ?)
, а затем вызывать sqlite_bind_int один раз для каждого «?» вы добавили в оператор.
Невозможно напрямую привязать текстовый параметр к множеству целочисленных (или, если на то пошло, нескольких текстовых) параметров.
Вот псевдокод для чего Я имею в виду:
-- Args is an array of parameter values
for i = Lo(Args) to Hi(Args)
paramlist = paramlist + ', ?'
sql = 'SELECT * FROM TABLE WHERE col IN (' + Right(paramlist, 3) + ')'
for i = Lo(Args) to Hi(Args)
sql_bind_int(sql, i, Args[i]
-- execute query here.
Я сам сам столкнулся с этим вопросом, но ответил на это, создав временную таблицу и вставив в нее все значения, чтобы я мог тогда:
SELECT * FROM TABLE WHERE col IN (SELECT col FROM temporarytable);
Более простой и безопасный ответ просто включает в себя создание маски (в отличие от части данных запроса) и позволяет механизму форматирования SQL-инъекций выполнять свою работу.
Предположим, что у нас есть некоторые id
s в массиве и некоторый обратный вызов cb
:
/* we need to generate a '?' for each item in our mask */
const mask = Array(ids.length).fill('?').join();
db.get(`
SELECT *
FROM films f
WHERE f.id
IN (${mask})
`, ids, cb);
это прекрасно работает (Javascript ES6):
let myList = [1, 2, 3];
`SELECT * FROM table WHERE col IN (${myList.join()});`
Например, если вы хотите выполнить запрос sql:
select * from table where col in (110, 130, 90)
Что относительно:
my_list = [110, 130, 90]
my_list_str = repr(my_list).replace('[','(').replace(']',')')
cur.execute("select * from table where col in %s" % my_list_str )
Работа над такой же функциональностью приводит меня к такому подходу: (nodejs, es6, Promise)
var deleteRecords = function (tblName, data) {
return new Promise((resolve, reject) => {
var jdata = JSON.stringify(data);
this.run(`DELETE FROM ${tblName} WHERE id IN (?)`, jdata.substr(1, jdata.length - 2), function (err) {
err ? reject('deleteRecords failed with : ' + err) : resolve();
});
});
};
Еще проще, постройте свой запрос следующим образом:
"SELECT * FROM TABLE WHERE col IN ("+",".join(["?"]*len(lst))+")"