2014-01-05 45 views
0

問題背景:無法從解決方案資源管理數據庫填充的DataGridView

我已經開發了一個WinForm的應用程序,並在希望發佈的階段,現在。

我具有如我希望數據庫到應用程序內被部署,如圖我已加入到該溶液Explorer的一個文件夾中的SQL服務器數據庫;

enter image description here

在此DataSet我增加了一些存儲過程。

問題:

當調試應用程序,提供的代碼下面的連接字符串片斷中的DataGridView是填充。

string connectionString = @"Data Source=.;Integrated Security=True;AttachDbFilename=|DataDirectory|\testDB.mdf";** 

public override DataSet FillDataGrid() 
{ 

    SqlConnection connection = new SqlConnection(connectionString); 
    SqlDataAdapter dataadapter = new SqlDataAdapter("spListAll", connection); 
    DataSet ds = new DataSet(); 
    connection.Open(); 
    dataadapter.Fill(ds, "results"); 
    connection.Close(); 

    int size = ds.Tables[0].Rows.Count; 

    return ds; 
} 

如果我從供給與連接字符串我的機器上本地存儲的數據庫連接字符串,如下所示,它完美填充的網格。

string connectionString = @"Data Source=DAVE-PC\FINAWARE; Initial Catalog=testDB; Integrated Security=SSPI;"; 

誰能告訴我,我應該如何正確設置此功能,所以我可以用testDB.mdf在Solution Explorer文件夾?

+0

您是否使用clickonce進行部署/發佈? – giammin

+0

@giammin自從我上次發佈一個應用程序和我最後一次發佈應用程序以來,已經很長時間了,數據庫被排除並單獨託管在服務器上,因此多個用戶可以訪問它。目前我只想從解決方案資源管理器的文件夾中訪問數據庫。 – user1352057

+0

您是否想在開發解決方案中的數據庫文件時使用與部署應用程序時使用的連接字符串相同的字符串? – giammin

回答

0

當然,我假設,無論從運行應用程序的計算機時,SQL Server是以前安裝。 (或者至少你有installed the LOCALDB版本的SQL Express 2012)

說,你應該記住的是,DataDirectory目錄替換字符串是根據您的應用程序運行的位置不同的方式解決。

在Visual Studio(Winforms應用程序)的DataDirectory目錄解析爲PROJECTFOLDER \ BIN \調試和數據庫文件應該有下一個調試會話(爲了確保這一點,你可以在MDF文件Copy To The Output Directory的屬性設置爲Copy Always or If Newer

在生產機,DataDirectory目錄(總是WinForms應用程序),坐落在您安裝應用程序相同的文件夾,如果你安裝在一個特殊的讀取您的應用程序僅文件夾一樣,這是一個數據庫應用一個明顯的問題C:\program files (x86)

幸運的是,它是可以改變改變DataDirectory目錄substit的位置字符串。試圖用任何數據訪問相關的代碼之前,添加這些行

string dataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 
dataPath = Path.Combiner(dataPath, "MyAppDataFolder"); 
AppDomain.CurrentDomain.SetData("DataDirectory", dataPath); 

通常安裝包應該建立在CommonApplicationData文件夾中的MyAppDataFolder並複製那裏的MDF文件。這是推薦的,因爲你有讀/寫權限和同一臺機器上的其他用戶可以使用你的應用程序

作爲一個方面說明,我看到如何調用存儲過程的另一個問題(雖然我無法解釋爲什麼它可以工作,如果你改變連接字符串)。您應該告訴適配器您正在使用存儲過程設置

SqlDataAdapter dataadapter = new SqlDataAdapter("spListAll", connection); 
dataadapter.SelectCommand.CommandType = CommandType.StoredProcedure; 
+0

謝謝。作爲一個更多背景,我將添加以下內容:1.在構建和測試應用程序期間,數據庫從SQL Server 2008運行並存儲 - 不是快速版本 - 它也包含所有存儲過程。 2.我認爲將testDB.mdf添加到解決方案資源管理器並從那裏調用它會是一個簡單的例子,我是否需要在開發過程中將此testDB.mdf添加到DEBUG文件夾? 3.所以,當發佈我的應用程序時,我需要添加一個文件夾,將testDB.mdf複製到那裏然後發佈它? – user1352057

+0

在調試中,如果要在Sql Server主安裝中使用靜態數據庫MDF,則不要使用DataDirectory方法,並且不需要在DEBUG文件夾中具有MDF。設置DataDirectory路徑的代碼將被忽略,因爲您在SQL Server中使用數據庫,或者因爲您應用了條件'#if!DEBUG'指令。您的連接字符串將是具有初始目錄密鑰的連接字符串 – Steve

+0

在部署中,可以使用DataDirectory替換字符串將您的db文件附加到存在的任何sql。然而,真正的困難是知道本地的DataSource名稱('Data Source = .;或Data Source =。\ SQLEXPRESS;'?您的安裝包是否能找到這個名稱,或者您應該向您的用戶詢問?)。但是,一旦你有一個單獨的app.config並且準備部署連接字符串,就不會有問題。順便看看我的鏈接上面的LOCALDB,你的場景似乎是它的完美用例。 – Steve

相關問題