2016-05-02 79 views
1

與2個開發人員一起處理Windows窗體應用程序項目。通過tfs共享源代碼,已將數據目錄路徑替換爲|DataDirectory|關鍵字,因爲每臺PC中的數據目錄不同。 (C:\Users\username\Documents\Visual Studio 20XX\Projects\solution folder\solution folderC#Visual Studio:| DataDirectory |連接字符串衝突中的關鍵字衝突mdf文件

曾使用連接字符串作爲

class ConnectionManager 
{ 
     public static SqlConnection dbcon() 
     { 
      string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\systemdb.mdf;Integrated Security=True"; 
      SqlConnection con = new SqlConnection(connectionString); 
      con.Open(); 
      return con; 
     } 
} 

問題是,當C#應用程序將數據發送到SQL Server數據庫的相對路徑,它表明數據已經被添加到數據庫中,但實際上數據庫沒有更新。

發現連接字符串與位於bin\debug中的.mdf位於根文件夾中的.mdf文件衝突。當使用|DataDirectory|時,SELECT查詢工作正常。 INSERT查詢在使用|DataDirectory|時不起作用,但在使用實際目錄路徑而不是|DataDirectory|時可以正常工作。

如何解決這個問題?要求是:

  1. 應該不需要每次修改目錄路徑從TFS獲取最新版本之後,需要像|DataDirectory|始終保持。

  2. 連接字符串不應與根文件夾中的.mdf文件和bin\debug文件夾發生衝突。

回答

0

整個AttachDbFileName =方法是有缺陷的 - 在最好的!在Visual Studio中運行應用程序時,它將複製.mdf文件(從您的App_Data目錄到輸出目錄 - 通常爲.\bin\debug) - 最有可能爲,您的INSERT工作得很好 - 但是您只是看着錯誤.mdf文件到底!

如果你想堅持這種方法,那麼試着在myConnection.Close()調用上放一個斷點 - 然後用SQL Server Mgmt Studio Express檢查.mdf文件 - 我幾乎可以確定你的數據在那裏。

在我看來真正的解決方案

  1. 安裝SQL Server Express(和你已經做到這一點無論如何)

  2. 安裝SQL Server Management Studio中快速

  3. 中創建您的數據庫SSMS Express,給它一個邏輯名稱(例如systemdb

  4. 使用其邏輯數據庫名稱連接到它(在服務器上創建時給出) - 並且不要亂用物理數據庫文件和用戶實例。在這種情況下,您的連接字符串將是這樣的:

    Data Source=.\\SQLEXPRESS;Database=systemdb;Integrated Security=True 
    

    和其他一切是正是和以前一樣......

另見阿龍貝特朗的優秀博客文章Bad habits to kick: using AttachDbFileName更多背景信息。