2012-08-27 112 views
3

我只是C#上的一個begginer,所以我需要太多的幫助。現在的問題是,我設計了一個Windows窗體,其中有許多字段,如名字,姓氏,地址等。現在我想要做的是,當我填寫表單並單擊插入按鈕,所有的信息進入數據庫。有誰知道這是怎麼做到的嗎?如何使用C#語言在數據庫中插入記錄?

private void button1_Click(object sender, System.EventArgs e) 
{ 
    string connetionString = null; 
    SqlConnection cnn ; 
    SqlDataAdapter adapter = new SqlDataAdapter(); 
    string sql = null; 
    connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ; 

    cnn = new SqlConnection(connetionString); 
    sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)"; 

    try 
    { 
     cnn.Open(); 
     adapter.InsertCommand = new SqlCommand(sql, cnn); 
     adapter.InsertCommand.ExecuteNonQuery(); 
     MessageBox.Show ("Row inserted !! "); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
+0

做任何事情現在就加入?因爲它看起來像「textbox2.text」和「textbox3.text」值可能是 – Keerigan

+0

沒有什麼。我用這個來檢查,但都是徒勞的。 –

+0

數據庫中是否存在一個名爲「Firt Name」和「Last Name」的列?他們之間真的有空間嗎? – Keerigan

回答

0

你應該形成與文本框的內容的命令:

sql = "insert into Main (Firt Name, Last Name) values(" + textbox2.Text + "," + textbox3.Text+ ")"; 

這,當然,前提是你管理的正確打開連接。

這將有助於瞭解當前的代碼發生了什麼。如果您在該消息框中顯示一些錯誤,那麼知道它在說什麼會很好。

您應該在實際運行命令之前驗證輸入(即確保它們不包含惡意代碼...)。

+2

確實應該使用參數化查詢來代替查詢連接。 – Matthew

12

查詢中有很多問題。
這是你的代碼的修改版本

string connetionString = null; 
string sql = null; 
connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ; 
using(SqlConnection cnn = new SqlConnection(connetionString)) 
{ 
    sql = "insert into Main ([Firt Name], [Last Name]) values(@first,@last)"; 
    cnn.Open(); 
    using(SqlCommand cmd = new SqlCommand(sql, cnn)) 
    { 
     cmd.Parameters.AddWithValue("@first", textbox2.text); 
     cmd.Parameters.AddWithValue("@last", textbox3.text); 
     cmd.ExecuteNonQuery(); 
     MessageBox.Show ("Row inserted !! "); 
    } 
} 
  • 列名包含(這應該避免),因此你 需要使用方括號括
  • 您需要使用using語句是空間確保連接 將被關閉並釋放資源
  • 您將控件直接放在字符串中,但這不起作用
  • 您需要使用參數化查詢,以避免報價的問題和 sqlinjiection攻擊
  • 無需使用DataAdapter一個簡單的插入查詢
從這個

除此之外,還有其他一些潛在的問題。如果用戶在文本框控件中沒有輸入任何內容會怎麼樣?在嘗試插入之前,你有沒有做過任何檢查? 正如我所說的字段名稱中包含空格,這會在您的代碼中造成不便。嘗試改變這些字段名稱。

編輯:如果您使用NET Framework 1.1的工作,那麼你就沒有方法AddWithValue,所以更改與這些

cmd.Parameters.Add("@first", SqlDbType.NVarChar).Value = textbox2.text; 
    cmd.Parameters.Add("@last", SqlDbType.NVarChar).Value = textbox3.text; 

此代碼假定兩個AddWithValue線,你的數據庫列類型如果不是NVARCHAR,則使用適當的SqlDbType枚舉值。

請計劃儘快切換到更新版本的.NET Framework。
1.1現在已經過時了。

+0

仍然錯誤! :( –

+0

你能告訴我錯誤信息嗎?:-) – Steve

+0

C:\ Users \ umair.javed \ Documents \ Visual Studio Projects \ Air Handling \ Form1.cs(278):'System.Data.SqlClient.SqlParameterCollection'不包含'AddWithValue'的定義 –

4

使用參數化查詢防止SQL注入(問題與危機干預)

使用using語句,這樣的連接將被關閉,資源將被配置。

using(var connection = new SqlConnection("connectionString")) 
{ 
    connection.Open(); 
    var sql = "INSERT INTO Main(FirstName, SecondName) VALUES(@FirstName, @SecondName)"; 
    using(var cmd = new SqlCommand(sql, connection)) 
    { 
     cmd.Parameters.AddWithValue("@FirstName", txFirstName.Text); 
     cmd.Parameters.AddWithValue("@SecondName", txSecondName.Text); 

     cmd.ExecuteNonQuery(); 
    } 
} 
0
sql = "insert into Main (Firt Name, Last Name) values(textbox2.Text,textbox3.Text)"; 

(Firt名稱)不是有效的領域。它應該是名字或First_Name。這可能是你的問題。

4

你應該改變你的代碼使用SqlParameters和適應你的INSERT語句下面

string connetionString = "Data Source=UMAIR;Initial Catalog=Air; Trusted_Connection=True;" ; 
// [ ] required as your fields contain spaces!! 
string insStmt = "insert into Main ([First Name], [Last Name]) values (@firstName,@lastName)"; 

using (SqlConnection cnn = new SqlConnection(connetionString)) 
{ 
    cnn.Open(); 
    SqlCommand insCmd = new SqlCommand(insStmt, cnn); 
    // use sqlParameters to prevent sql injection! 
    insCmd.Parameters.AddWithValue("@firstName", textbox2.Text); 
    insCmd.Parameters.AddWithValue("@lastName", textbox3.Text); 
    int affectedRows = insCmd.ExecuteNonQuery(); 
    MessageBox.Show (affectedRows + " rows inserted!"); 
} 
相關問題