2012-03-25 98 views
2

所以當我的表單加載時,它會連接到數據庫,當我點擊按鈕時,它會插入一個新行到我的數據庫,但我後我點擊它,我沒有看到我的表中有任何更改。無法在C#sql數據庫中插入數據

namespace database 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     SqlConnection con; 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      con = new SqlConnection(); 
      con.ConnectionString = 
       "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
      con.Open(); 
      MessageBox.Show("OPEN!"); 
     } 

     private void label1_Click(object sender, EventArgs e) 
     { 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      int x; 
      SqlCommand thiscommand = con.CreateCommand(); 
      thiscommand.CommandText = 
       "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery(); /* I used variable x to verify 
                that how many rows are 
                affect, and the return is 1. 
                The problem is that I don't 
                see any changes in my table*/ 
      MessageBox.Show(x.ToString()); 
      con.Close(); 
     } 
    } 
} 
+0

你用什麼來檢查記錄是否被插入? SQL Server管理工作室? – 2012-03-25 20:12:28

+0

您是否將用戶名和密碼留下來發布問題,或者他們不在代碼中? – mowwwalker 2012-03-25 20:14:29

+3

你爲什麼要在Form_Load中打開連接?打開,使用並關閉(可能需要處理)需要它們的連接。 – 2012-03-25 20:14:41

回答

9

您正在使用附加的Db文件。這意味着Project-build會在Bin文件夾中創建一個副本,並且您正在處理2個不同版本的Db。您可能正在檢查原件。

這實際上可能相當有用(每次都新鮮複製)。如果不是,請更改Db文件的Copy-when屬性。

+1

+1不知道如果*那*是實際問題,但好點:) – Tigran 2012-03-25 20:14:34

+0

謝謝你的時間。 那麼正確或更有效的方法是什麼? 因爲它好像我插入成功,但我沒有查看正確的數據庫文件, 我應該上傳數據庫在線? 對不起,我是新手。 – 2012-03-25 23:12:54

+0

您可以在程序本身查看結果,限制複製或(有時)將bin \ debug文件夾中的版本複製到項目根目錄。 – 2012-03-26 18:56:41

1

沒有足夠的細節來確切地知道爲什麼值沒有顯示在您的數據庫中,但我建議您更改您的編碼練習(如下所述),重新測試,然後儘可能詳細地提供關於事情失敗的地方。

編碼實踐

你打開你的連接要早於需要(這意味着你保持一種寶貴的資源超過所需的時間),你不清理連接或命令。他們實現了IDisposable,所以你必須調用Dispose()。最簡單的方法是使用using聲明。

建議重寫:

// Remove initialization of the SqlConnection in the form load event. 

private void button1_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = new SqlConnection()) 
    { 
     con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True"; 
     con.Open(); 
     // Optional: MessageBox.Show("OPEN!"); 
     int x; 
     using (SqlCommand thiscommand = con.CreateCommand()) 
     { 
      thiscommand.CommandText = "INSERT INTO player_info (player_id, player_name) values (10, 'Alex') "; 

      x = thiscommand.ExecuteNonQuery();  /*I used variable x to verify that how many rows are affect, and the return is 1. The problem is that i dont see any changes in my table*/ 
      // Optional: MessageBox.Show(x.ToString()); 
     } 
    } 
} 
+0

同意使用'',但也從配置中獲取ConnString。 – 2012-03-25 20:23:07

+0

'IDisposableS'應該(不一定)被處置,並且你關閉連接與using語句是多餘的(dispose會隱式關閉它)。 +1無論如何 – 2012-03-25 20:26:34

+0

@Tim:同意不重複地調用con.Close()(更新的答案)。你評論的第一部分是什麼意思? – 2012-03-25 20:39:50

0

ExecuteNonQuery方法進行說明在MSDN如下:

 
Executes a Transact-SQL statement against the connection and returns 
the number of rows affected.

如果你1作爲返回值,一個記錄必須被插入。

忘記了查詢表格嗎?新記錄不會在您的應用程序中自動顯示。

+0

謝謝你的時間。 – 2012-03-25 23:14:18

+0

那麼,如果我的應用程序中不會自動顯示新記錄,我該如何檢查查詢是否有效。 有沒有更好的方法呢?像使用在線數據庫或SQL管理工作室? 對不起,我對這個 – 2012-03-25 23:15:33

+0

NVM是全新的,我發現使用mysql比sqlserver更容易。 問題解決了,感謝大家的幫助。 – 2012-03-25 23:32:40

0

您可以考慮運行SQL Profiler來查看實際發送到數據庫的內容。您可以捕獲SQL,然後嘗試直接對數據庫執行該代碼。

「player_id」意味着這是一個主鍵,如果是這種情況插入會失敗。

我還建議像其他人一樣,改變你的方式,以「使用」的風格,因爲這將爲你管理你的資源,並確保你不會離開連接「徘徊」。

相關問題