2013-03-20 59 views
3

我是SQLite的初学者。现在我正试图在示例northwind数据库中插入新记录。我的C#代码如下:C#SQlite INSERT INTO不起作用

 SQLiteConnection myConnection = new SQLiteConnection(); 

     myConnection.ConnectionString = @"Data Source=|DataDirectory|\northwindEF.db"; 

     using (myConnection) 
     { 
      SQLiteCommand myCommand = myConnection.CreateCommand(); 
      myCommand.CommandText = "INSERT INTO Categories(CategoryID,CategoryName,Description) VALUES(11,'Bakery','Baked goods such as bread and cakes')"; 
      myConnection.Open(); 
      myCommand.ExecuteNonQuery(); 
      myConnection.Close(); 
     } 

当我运行这个程序,我没有得到任何错误。但我的新纪录没有插入表格。我的代码有什么问题。请帮帮我。

+0

我不知道,但如果类别ID是主键,改变你的查询是这样的:“INSERT INTO类别(类别名称,描述)VALUES(‘面包’,‘烘焙食品,如面包,蛋糕’)” – 2013-03-20 22:13:02

+0

CategoryID是主键。正如你所说,我改变了我的查询,但问题仍然存在。 :-( – 2013-03-20 22:23:46

+0

SQLiteCommand可能需要用分号终止CommandText属性 – pixelbadger 2013-03-20 22:24:30

回答

0

你为什么认为“新记录没有插入”? ExecuteNonQuery会告诉你有多少记录受到影响;它返回什么?

您是如何运行该程序的?从调试器? DataDirectory是数据安装到的文件夹。如果您尚未在.sdf文件项目属性中更改某些内容,Visual Studio会将数据安装到项目\ debug \ bin \文件夹中。在那里寻找一个.sdf文件,是你的“新纪录”吗?

4

这是一个常见的陷阱。服务器资源管理器中的连接将构建到存储在项目文件夹中的数据库文件。然后,在运行时将数据库复制到输出目录,并且每个插入,更新和删除都针对该数据库。在服务器资源管理器中没有任何更改,因为数据库不同如果属性'Copy to the output directory'设置为Copy always,也会发生同样的情况。在这种情况下,每次运行时,输出目录中的数据库都会被从项目根文件夹获取的全新副本覆盖,并且每次删除,更新或插入都会在下次运行时消失。

0

尝试这样编码,它总是检查连接是否有错误或您的查询是否有错误。

using (SQLiteConnection con = new SQLiteConnection { ConnectionString = "connectionstring" }) 
{ 
    using(SQLiteCommand cmd = new SQLiteCommand { Connection = con }) 
    { 
     // check connection state if open then close, else close proceed 
     if(con.State == ConnectionState.Open) 
      con.Close(); 

     //then 
     try 
     { 
      // try connection to Open 
      con.Open(); 
     } 
     catch 
     { 
      // catch connection error. 
     } 

     try 
     { 
      // your insert query 
     } 
     catch 
     { 
      // catch query error 
     } 

    } // Close Command 

} // Close Connection