2014-01-19 165 views
0

有沒有一種方法可以將SQLite存儲在SQLite數據庫中,而不需要SQLite試圖解析它? 在存儲類似於SQLite查詢的TEXT時遇到問題,因爲某些原因它會嘗試解析它。在SQLite中存儲數據

查詢我用它來保存文本:"SELECT NAME FROM sqlite_master WHERE TYPE='table' ORDER BY NAME".

當我嘗試拯救類似的東西,它說:我試圖挽救"insert into tableName (Name, DateCreated, Reminder, Content) values ('name', 'currentDate', 'reminder', 'content')".

類似的文本錯誤:SQL邏輯錯誤或丟失的數據庫在「table」附近:語法錯誤

請注意,值(name,currentDate,reminder,content)不是硬編碼的,它們作爲字符串傳遞。實際代碼如下所示:

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是tableName變量,感謝您的解釋,但是command.Parameters.Add不接受SQLiteType,只接受不包含TEXT或DateTime的DbType。 – NetInfo

+0

通過使用DbType.String獲取它的工作排序,保存內容的罰款。我應該使用相同的(Paramaeterized)方法從數據庫檢索數據嗎?非常感謝你的幫助。 – NetInfo

+0

@NetInfo:是的,您應該使用參數化SQL來處理* all *動態值。它以各種方式提供幫助。 –