2013-10-12 58 views
1

我有一個奇怪的問題。我正在使用vs2012連接到SQL Server CE並執行一些插入查詢。更改不會永久保存到SQL Server Compact版本

public void EstablishConnection() 
{ 
     connection = new SqlCeConnection("Data Source=DataDump.sdf;Persist Security Info=False;"); 
     try 
     { 
      connection.Open(); 
      Console.WriteLine("Connection Successful"); 
     } 
     catch (Exception exception) 
     { 
      Console.WriteLine(exception.Message); 
     } 
    } 

    public void AddRecord(string link,string content) 
    { 
     int num = 0; 
     var command = new SqlCeCommand("INSERT INTO Webpages(Link,Data) VALUES('"+link+"','"+content+"');",connection); 
     num = command.ExecuteNonQuery(); 
     Console.WriteLine("Command Successful rows affected"+num); 
     var cmd2 = new SqlCeCommand("SELECT * FROM Webpages",connection); 
     SqlCeDataReader reader = cmd2.ExecuteReader(); 
     while (reader.Read()) 
     { 
      Console.WriteLine(reader[0]); 
      Console.WriteLine(reader[1]); 
     } 
    } 

但是我有,一旦VS被關閉,之後當我打開它來顯示數據,該數據已經一去不復返了,因爲它是永遠不會保存

怎麼可能當它是明確的問題那麼它執行查詢?

+0

你有你的項目項之間列出您的數據庫文件?它的屬性'Copy to OutputDirectory'設置爲'Copy Always'? – Steve

+0

是數據庫在項目項目之間列出,但其副本屬性設置爲Copy If Newer。這是圖片http://s23.postimg.org/c8ghiu9x7/Capture.png –

回答

6

這是一種常見的情況。
您的數據庫文件列在項目項目之間。
其屬性Copy to Output directory設置爲Copy Always

現在,你用VS運行你的調試會話。編譯成功,VS將您的sdf文件從項目文件夾複製到當前輸出目錄(BIN \ DEBUG)。
您的代碼運行平穩,並將數據插入數據庫文件(在輸出目錄中)。
您停止並重新啓動調試會話以修復某些內容,但在重新啓動時,VS會將項目文件夾中的空文件複製到輸出目錄。

爲了打破這種圓,設置Copy to Output DirectoryCopy Never(或Copy if Newer

EDIT混亂的另一個來源是由於使用服務器資源管理器來查看數據庫文件的內容。如果服務器資源管理器使用指向項目文件夾中數據庫文件的連接字符串,則永遠不會看到輸出目錄中對數據庫文件所做的更改。
您應該在Server Explorer中創建兩個連接,一個名爲DEBUG DataDump,指向PROJECTFOLDER\BIN\DEBUG。您可以使用此連接來檢查在調試期間插入的數據或其他調試任務。另一個名爲DISTRIBUTION DataDump的文件指向項目文件夾中的文件,並在此處進行您的應用程序分發所需的架構更改。

說,請記住,您的代碼有一個BIG問題。這就是所謂的Sql Injection

A parameterized query將避免報價的問題,並刪除SQL注入

int num = 0; 
var command = new SqlCeCommand("INSERT INTO Webpages(Link,Data) " + 
           "VALUES(@lnk, @cnt)",connection); 
command.Parameters.AddWithValue("@lnk", link); 
command.Parameters.AddWithValue("@cnt", content); 
num = command.ExecuteNonQuery(); 
+0

但它被設置爲Copy If Newer –

+0

使用服務器資源管理器查看更改?然後看看更新 – Steve

+0

好吧,現在我只使用查詢而不是服務器資源管理器來查看數據。但是,只要我調用connection.close(),然後再次打開,那裏就沒有數據。 –

0

設置複製到輸出目錄財產副本,如果你SDF文件新

現在看來,你已經把它設置爲副本總是這導致:

的每次構建應用程序時,都將數據庫文件從項目目錄複製到bin目錄 。在運行應用程序的下一次 中,對輸出文件夾中的數據文件進行的任何 更改都將被覆蓋。