2016-04-24 101 views
0

我在向數據庫插入簡單記錄時遇到困難。我在保存時沒有收到任何錯誤。另外,如果我在程序運行時嘗試檢索它,我可以驗證它是否已插入。但是,一旦我關閉程序並刷新數據庫,它就不會出現在數據庫中。我知道這是一個提交問題,但不知道我在這裏錯過了什麼。在數據庫中保存記錄時提交不起作用

private void saveEmpBtn_Click(object sender, EventArgs e) 
{ 
    string aSQL = "INSERT INTO Employee(Id, Name, Type, Email, UTAId, Dept) VALUES (@Id, @Name, @Type, @Email, @UTAId, @Dept) "; 

    using (conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 

     using (var tx = conn.BeginTransaction()) 
     using (SqlCommand command = new SqlCommand(aSQL, conn)) 
     { 
      command.Connection = conn; 
      command.Transaction = tx; 

      command.Parameters.AddWithValue("@Id", 3); 
      command.Parameters.AddWithValue("@Type", empTypCmbBx.SelectedItem.ToString()); 
      command.Parameters.AddWithValue("@Name", nmTxtBx.Text); 
      command.Parameters.AddWithValue("@UTAId", utaIdTxtBx.Text); 
      command.Parameters.AddWithValue("@Email", emailTxtBx.Text); 
      command.Parameters.AddWithValue("@Dept", deptTxtBx.Text); 

      try 
      { 
       command.ExecuteNonQuery(); 
       tx.Commit(); 
       conn.Close(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     MessageBox.Show("Employee Saved Successfully"); 
    } 
} 

包括表的數據庫腳本的幾張圖片。模式定義和ID屬性。一些問題:我跟着的例子有employee.mdf,只有一張桌子。在我的情況下,數據庫名稱是RoomAllocationSystemDatabase,表名是Employee。我是否必須將模式包含爲點符號來訪問插入語句中的表?我試過這個。當我這樣做,它說無效的對象。不知道我是否需要在其他地方包含數據庫名稱。

CREATE TABLE [dbo].[Employee] 
(
    [Id]  INT   NOT NULL, 
    [Name]  VARCHAR (50) NULL, 
    [Type]  VARCHAR (50) NULL, 
    [Email] VARCHAR (50) NOT NULL, 
    [UTAId] VARCHAR (50) NULL, 
    [Dept]  VARCHAR (50) NULL, 
    [Password] VARCHAR (50) NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

連接字符串邏輯,同時加載形式app.config

connectionString = ConfigurationManager.ConnectionStrings["RoomAllocationSystem.Properties.Settings.RoomAllocationSystemDatabaseConnectionString"].ConnectionString; 

連接字符串:

<connectionStrings> 
    <add name="RoomAllocationSystem.Properties.Settings.RoomAllocationSystemDatabaseConnectionString" 
     connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\RoomAllocationSystemDatabase.mdf;Integrated Security=True" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 
+0

不知道爲什麼它沒有提交,但爲什麼你插入一個ID?您應該使用主鍵。也許這就是問題表中有一個主鍵列(Id),你試圖插入沒有IDENTITY_INSERT開/關的記錄 –

+0

@JeremyThompson感謝您的建議。嘗試過一些事情,但迄今爲止沒有成功。如果我刪除Id字段並指定其他字段作爲插入的一部分,則會得到「Id不能爲空」。如果我刪除特定的字段前值和後值除Id外的所有字段,我得到「列名或提供的值數量不匹配表定義」。不知道如何在沒有指定Id的情況下插入。另外,不知道我的表格定義是否正確。 MS Access數據庫中的Id是否會自動插入帶有序列的主鍵? –

+0

如果你想使用這個事務,它應該是'SqlCommand command = new SqlCommand(aSQL,conn,tx)'。見https://msdn.microsoft.com/en-au/library/352y4sff(v=vs.110).aspx – potatopeelings

回答

-1

嘗試使用大括號內交易明細

  using (var tx = conn.BeginTransaction()) 
      { 
       using (SqlCommand command = new SqlCommand(aSQL, conn)) 
       { 
        command.Connection = conn; 
        command.Transaction = tx; 
        command.Parameters.AddWithValue("@Id", 3); 

        try 
        { 
         command.ExecuteNonQuery(); 
         tx.Commit(); 
         conn.Close(); 
        } 
        catch (Exception ex) 
        { 
        } 
       } 
      } 
+0

試過。沒有工作。 :( –

0

這是答案。它被張貼爲here。 這是一種常見的情況。您有一個使用替換字符串| DataDirectory |的連接字符串。在桌面應用程序中,該目錄通常與程序運行的目錄相同。在Visual Studio中,您的程序在BIN \ DEBUG(或x86變體)目錄中運行。因此,Visual Studio將您的MDF文件從項目目錄複製到BIN \ DEBUG文件夾。您將記錄添加到此副本,而不是項目文件夾中的記錄。但是,「服務器資源管理器」窗口具有特定於項目文件夾數據庫的連接,當然,該數據庫仍爲空。

您可以將另一個連接添加到指向文件夾BIN \ DEBUG的服務器資源管理器,並檢查您的數據庫是否已更新。

使事情複雜化,有屬性複製到與MDF文件關聯的輸出目錄。如果將此屬性設置爲始終複製,則每次使用Visual Studio啓動新的調試會話時,都會將該文件從項目文件夾中再次複製到輸出目錄(BIN \ DEBUG),並使用新的空白覆蓋已有的副本。所以第一次運行成功,第二次失敗。你觀察到的症狀是這種情況的明顯標誌。

只需更改屬性複製到輸出目錄複製如果更新,代碼運行良好。 (Peraphs現在還爲時過早,但記得要將你的查詢改爲參數化查詢,因爲你可能會破壞你的代碼,只需在txtName文本框中插入一個單引號,比如O'Malley,更不要說Sql Injection hack)

相關問題