2013-10-20 49 views
13

我试图使用SQLite作为我的存储。我已经使用nuget添加了引用dll,并使用了语句。SQLite简单插入查询

private void SetConnection() 
{ 
      sql_con = new SQLiteConnection 
       ("Data Source=c:\\Dev\\MYApp.sqlite;Version=3;New=False;Compress=True;"); 
} 

private void ExecuteQuery(string txtQuery) 
{ 
      SetConnection(); 
      sql_con.Open(); 
      sql_cmd = sql_con.CreateCommand(); 
      sql_cmd.CommandText = txtQuery; 
      sql_cmd.ExecuteNonQuery(); 
      sql_con.Close(); 
} 

,我发送查询TXT这样

public void Create(Book book) 
{ 
      string txtSqlQuery = "INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) "; 
      txtSqlQuery += string.Format("VALUES (@{0},@{1},@{2},@{3},@{4},@{5},@{6},@{7},{8})", 
         book.Id, book.Title, book.Language, book.PublicationDate, book.Publisher, book.Edition, book.OfficialUrl, book.Description, book.EBookFormat); 
        try 
        { 
         ExecuteQuery(txtSqlQuery); 
        } 
        catch (Exception ex) 
        { 
         throw new Exception(ex.Message); 
        }  
} 

我的数据库正确地创建和使用有效数据通过本书的实例就可以了。但总是执行查询在这行代码上抛出异常:

sql_cmd.ExecuteNonQuery(); 

我明显在这里做错了什么,但我看不到。

更新:抛出的异常的消息是

SQL逻辑错误或丢失的数据库

无法识别的标记: “22cf”

这哪里是22cf通过book.Id GUID字符串的一部分。

+0

抛出了什么异常? – Alireza

+0

@Alireza更新了问题 – user2783193

+0

我注意到你没有使用正式参数到你的SQL命令。这不是很明智,因为您不得不担心将数据呈现给SQL语句(即格式化日期,小数点分隔符等)。 –

回答

-2

将字符串发送到INSERT语句时应使用(') VALUES(@ {0},'@ {1}','@ {2}','@ {3}','@ {4} ”, '@ {5}', '@ {6}', '@ {7}',{8}) 你应该也赶上SQLExeprion

+0

伟大的答案,我可能会使用命名参数tho这里建议http://stackoverflow.com/questions/809246/adding-parameters-in-sqlite-with-c-sharp为什么?因为在我的一些sql语句中,你可能会在几个不同的时间使用相同的参数。 – infocyde

41

Don't EVER insert your data in your statement!

使用准备语句和绑定参数:

public void Create(Book book) { 
    SQLiteCommand insertSQL = new SQLiteCommand("INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) VALUES (?,?,?,?,?,?,?,?)", sql_con); 
    insertSQL.Parameters.Add(book.Id); 
    insertSQL.Parameters.Add(book.Title); 
    insertSQL.Parameters.Add(book.Language); 
    insertSQL.Parameters.Add(book.PublicationDate); 
    insertSQL.Parameters.Add(book.Publisher); 
    insertSQL.Parameters.Add(book.Edition); 
    insertSQL.Parameters.Add(book.OfficialUrl); 
    insertSQL.Parameters.Add(book.Description); 
    insertSQL.Parameters.Add(book.EBookFormat); 
    try { 
     insertSQL.ExecuteNonQuery(); 
    } 
    catch (Exception ex) { 
     throw new Exception(ex.Message); 
    }  
} 
+0

如果参数不是字符串类型,则此示例不起作用。 –

+1

这是不正确的:[SqlParameterCollection.Add](https://msdn.microsoft.com/en-us/library/ms136439.aspx)接受对象值。当然,实现会将.NET类型转换为适当的数据库类型。 SQLite实现接受字符串类型,但也接受数字类型,null,... –

+0

这是SQLiteParameterCollection.Add(),但你是对的 - 它接受Object。我在测试时肯定犯了一些错误。在任何情况下,一旦您键入左括号(仅在您添加前键入时显示它),IntelliSense才会显示该版本的Add()。 –