2014-01-19 6 views
0

Есть ли способ хранить TEXT в базе данных SQLite без SQLite, пытаясь его разобрать? Устранена проблема, когда при хранении ТЕКСТА, подобном SQLite-запросу, он пытается каким-то образом разобрать его.Хранение данных в SQLite

запросов я использую, чтобы сохранить TEXT: "insert into tableName (Name, DateCreated, Reminder, Content) values ('name', 'currentDate', 'reminder', 'content')".

Похожие текст Я пытаюсь сохранить: "SELECT NAME FROM sqlite_master WHERE TYPE='table' ORDER BY NAME".

Когда я пытаюсь сохранить что-то подобное, он говорит: логическая ошибка SQL или отсутствуют базы данных: Ошибка рядом с «таблицей»: синтаксическая ошибка

Обратите внимание, что значения (имя, currentDate, напоминание, контент) не являются жестко закодированными, они передаются как строки. фактический код выглядит следующим образом:

SQLiteCommand command = new SQLiteCommand("insert into " + cateName + " (Name, DateCreated, Reminder, Content) values ('" + noteName + "', '" + currentDate + "', '" + reminder + "', '" + content + "')", connection); 

Спасибо за любой вклад.

+1

Пожалуйста, покажите код, который вы используете, чтобы сохранить значение. Ваше заявление INSERT на данный момент жестко закодировано для символьных литералов ... Я уверен, что это не то, что вы на самом деле делаете. (Я подозреваю, что проблема заключается в том, что вы должны использовать параметризованный SQL, но мы не можем сказать, не видя ваш код.) –

+1

У вас есть дополнительный «во втором тексте, была ли опечатка при подготовке этого вопроса?» – waTeim

+1

@JonSkeet, извините, просто обновил код. – NetInfo

ответ

2

Как я подозреваю, проблема в том, что вы помещаете свои значения непосредственно в SQL - даже не пытаясь их избежать. Не делайте этого. Как и проблемы, которые вы видите, вы открыли себя до SQL injection attack. Вместо этого используйте параметрированный SQL и укажите значения параметров.

Например:

// It's not clear what cateName is, but I'll assume *that* bit is valid... 
string sql = new SQLiteCommand("insert into " + cateName + 
    " (Name, DateCreated, Reminder, Content) values " + 
    "(@Name, @DateCreated, @Reminder, @Content)"); 

using (var command = new SQLiteCommand(sql, connection)) 
{ 
    command.Parameters.Add("@Name", SQLiteType.Text).Value = noteName; 
    command.Parameters.Add("@DateCreated", SQLiteType.DateTime).Value = currentDate; 
    command.Parameters.Add("@Reminder", SQLiteType.Text).Value = reminder; 
    command.Parameters.Add("@Content", SQLiteType.Text).Value = content; 
    command.ExecuteNonQuery(); 
} 
+0

Спасибо за ваш ответ, cateName - это имя таблицы переменная, спасибо за ваше объяснение, однако command.Parameters.Add не принимает SQLiteType, только принимает DbType, который не содержит TEXT или DateTime. – NetInfo

+0

Сортировка работы, с помощью DbType.String, сохраняет контент в порядке. Должен ли я использовать тот же метод (Параметрированный) для извлечения данных из базы данных? Большое вам спасибо за вашу помощь. – NetInfo

+0

@NetInfo: Да, вы должны использовать параметризованные SQL для * all * динамических значений. Это помогает во всех отношениях. –

Смежные вопросы