2015-12-06 65 views
1

我試圖記錄在C#中的控件添加到數據庫:爲什麼我沒有收到任何錯誤,但數據庫沒有插入記錄?

public partial class ctrl_Register : UserControl 
{ 
    public ctrl_Register() 
    { 
     InitializeComponent(); 
    } 

    private void btn_reg_Click(object sender, EventArgs e) 
    { 
     bool ok = false; 
     int col = 1; 
     if (tBox_username.Text != "") 
     { 
      if (tBox_password.Text != "") 
      { 
       if (cBox_colour.Text != "") 
       { 
        ok = true; 
       } 
      } 
     } 

     if (ok) 
     { 
      using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.data2cString)) 
      { 
       using (SqlCommand cmd = new SqlCommand()) 
       { 
        cmd.Connection = conn; 
        cmd.CommandType = CommandType.Text; 
        cmd.CommandText = @"INSERT INTO [Table](Id,username,password,colour,bestTime) VALUES ('"+tBox_username.Text+"','"+tBox_password.Text+"','"+cBox_colour.Text+"')"; 

        try 
        { 
         conn.Open(); 
         cmd.ExecuteNonQuery(); 
         MessageBox.Show("added"); 
        } 
        catch (SqlException s) 
        { 
         MessageBox.Show(s.Message.ToString(), "Error Message"); 
        } 
       } 
      } 
     } 
     else 
     { 
      MessageBox.Show("no insert"); 
     } 
    } 
} 

消息框「添加」顯示出來,所以代碼肯定得到這一點。但是,當我去檢查我的數據庫沒有新的記錄。

這是我創建表的代碼:

CREATE TABLE [dbo].[Table] 
(
    [Id]  INT   IDENTITY (0, 1) NOT NULL, 
    [username] VARCHAR (50) NOT NULL, 
    [password] VARCHAR (50) NOT NULL, 
    [colour] VARCHAR (50) DEFAULT ('Orange') NULL, 
    [bestTime] INT   DEFAULT ((0)) NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

這絕對是在設置文件的正確連接字符串。但是,當我在數據庫瀏覽器中轉到data2.mdf文件並轉到該表的「顯示數據」時,只有NULL存在。

+3

只是一個側面說明,使用參數,而不是連接SQL字符串與文本框的值,以避免安全問題。 – LightBulb

+1

在ExecuteNonQuery語句上放置一個斷點。運行代碼,它會暫停。將cmd commandText屬性捕獲到剪貼板中。打開SSMS並嘗試在那裏運行它。觀察結果。這種調試技術將爲您節省數小時的時間。 – nicomp

+0

你的'INSERT'語句有5個列名,但你只提供3個列值。我驚呆了,這不會給你一個SQL異常。 –

回答

1

你沒有顯示連接字符串 - 但既然你說「去到Data2.mdf文件服務器資源管理器中,我假設你可能使用AttachDbFileName=方法

整個AttachDbFileName =方法是有缺陷的 - !充其量運行時在Visual Studio中的應用程序,這將是圍繞.mdf文件( - 通常.\bin\debug - 從App_Data目錄輸出目錄,你的應用程序運行)複製和最有可能,你INSERT的作品就好了 - 但你只是看錯誤.mdf文件在結束!

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

在我看來真正的解決方案

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

  2. 安裝SQL Server Management Studio中快速

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

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

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

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

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

而且還:做以往串聯在一起,你的SQL命令這樣的 - 這僅僅是要求的腳本小子,探討SQL注入攻擊你的網站。使用參數化查詢 - 始終沒有例外。

+1

感謝您的建議。是的,這是錯誤的mdf文件。任何閱讀此內容的人,| DataDirectory |不是項目文件夾中的mdf文件。 –

3

這太長了評論。

首先,如果你打算寫SQL代碼。檢查錯誤。您爲五列提供三個值,所以這可能是一個錯誤。

二,使用參數化查詢。不要將用戶輸入直接放入查詢字符串中。這是危險的,並且是SQL優化器的障礙。第三,不要命名錶Table。這是一個保留字。使用更好描述實體的非保留字。

0

更改命令文本和使用參數,如:

cmd.CommandText = @"INSERT INTO [Table](username,password,colour) VALUES(@username, @password, @colour)"; 

cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = tBox_username.Text; 
cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = tBox_password.Text; 
cmd.Parameters.Add("@colour", SqlDbType.VarChar).Value = tBox_colour.Text; 
相關問題