2017-01-16 161 views
1

我想寫一個應用程序在Visual Studio C#寫入基於服務的數據庫。我遇到的問題是我沒有收到任何錯誤,但是在重新啓動應用程序後,沒有任何內容保存到數據庫中...C#基於服務的數據庫不寫入數據庫

我知道這是因爲它不允許重複主鍵。這幾乎就像是一個臨時數據庫......如果是這種情況,我該如何讓它成爲一個持久的基於服務的數據庫?

這裏是我的代碼:

private void button1_Click(object sender, EventArgs e) 
{ 
    try { 
     // Connection to DB 
     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MTR_Database.mdf;Integrated Security=True"); 

     // Insert Query 
     string insertquery = "INSERT INTO dbo.Job01 ([Item #], [Manufacturer], [Mill Location], [Product Description], [Weld Seam Type], [Outer Dimension], [Wall Thickness], [Coating], [Grade], [Heat], [ANSI/ASME], [Purchase Order], [Standard]) VALUES(@ItemNum, @Manufacturer, @MillLocation, @ProductDescription, @WeldSeamType, @OuterDimension, @WallThickness, @Coating, @Grade, @Heat, @ANSIASME, @PurchaseOrder, @Standard)"; 

     SqlCommand cmd = new SqlCommand(insertquery, con); 

     // open connection 
     con.Open(); 

     // Parameters 
     cmd.Parameters.AddWithValue("@ItemNum", item__TextBox.Text); 
     cmd.Parameters.AddWithValue("@Manufacturer", manufacturerTextBox.Text); 
     cmd.Parameters.AddWithValue("@MillLocation", mill_LocationTextBox.Text); 
     cmd.Parameters.AddWithValue("@ProductDescription", product_DescriptionTextBox.Text); 
     cmd.Parameters.AddWithValue("@WeldSeamType", weld_Seam_TypeTextBox.Text); 
     cmd.Parameters.AddWithValue("@OuterDimension", outer_DimensionTextBox.Text); 
     cmd.Parameters.AddWithValue("@WallThickness", wall_ThicknessTextBox.Text); 
     cmd.Parameters.AddWithValue("@Coating", coatingTextBox.Text); 
     cmd.Parameters.AddWithValue("@Grade", gradeTextBox.Text); 
     cmd.Parameters.AddWithValue("@Heat", heatTextBox.Text); 
     cmd.Parameters.AddWithValue("@ANSIASME", aNSI_ASMETextBox.Text); 
     cmd.Parameters.AddWithValue("@PurchaseOrder", purchase_OrderTextBox.Text); 
     cmd.Parameters.AddWithValue("@Standard", standardTextBox.Text); 

     // Execute 
     cmd.ExecuteNonQuery(); 

     // close connection 
     con.Close(); 
    } 
    catch (Exception ex) 
    { 
     // catch error 
     MessageBox.Show(ex.Message); 
    } 
} 

我真的不能把我的手指上正在發生的事情。

+0

我想更多,我希望它充當SQLite ...沒有一個活動的服務器,並在應用程序內。在Visual Studio中嵌入SQL Express可能嗎? – Mokey

+0

閱讀此:http://stackoverflow.com/questions/6221951/sqlexception-catch-and-處理與SQL服務器的異常處理。也使用MDF的直接文件路徑,看看會發生什麼 –

回答

1

整個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,給它一個邏輯名稱(例如MTR_Database

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

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

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

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

+0

將做@marc_s感謝您的信息...我會試試這個。我一直在MySql中工作很多,但試圖切換到SQL工作......迄今爲止,這是一個可怕的經歷。除了這個事實,我會再次努力。如果它有效,我會Upvote的答案:)我可能明天就完成它,因爲它幾乎是時間去取下工作:( – Mokey

+1

你是完全正確的......我在看錯誤的DB文件,一切正常插入。我必須學習如何創建一個新的服務器並給它一個數據庫名稱,然後我可以把它看作是mySQL,我可能只是將它從服務器而不是本地運行。 – Mokey