2012-10-02 54 views
-2

這是我第一次使用數據庫。 我決定創建一個有兩個表的數據庫 - 「團隊」,「玩家」 我想添加一個新玩家到「玩家」表。 「玩家」表包含以下幾列的:ID(自動編號),名字,姓氏,TeamID如何將「自動編號」字段(ID列)插入Access數據庫/ C#ASP.NET

爲了做到這一點,我已經創建了三個文本框的名字,姓氏,TeamID 注意,我沒有處理「ID」,因爲它是一個自動編號,應自動添加 Button1_click應最終添加新行。

這裏是我的代碼:

protected void Button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      connection = new OleDbConnection(connectionString); 
     } 
     catch 
     { } 
     try 
     { 
      connection.Open(); 

      OleDbCommand command = new OleDbCommand("INSERT INTO Player VALUES ('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "')"); 

      command.ExecuteNonQuery(); 

      connection.Close(); 

     } 
     catch 
     { } 
+3

*請注意,我沒有對待「ID」,因爲它是一個自動編號,應該自動添加*您似乎在告訴我們答案。什麼是問題? – RedFilter

+1

當問一個問題時,你應該總是明確地說出你有什麼問題與適用的錯誤信息(如果適用)。關於問題的答案,似乎有一個相當不錯的猜測,但你不應該讓人們猜測。 – Chris

+1

空的catch塊是邪惡的。他們阻止你告訴我們你的問題是什麼,以及在哪裏。順便說一句:如果TeamID列是一個數字,TextBox3.Text不應該在單引號內。 – jbl

回答

3

當你寫一個INSERT字符串,不包括列名應指定的值,每一列。在你的情況下,你需要添加

string sqlText = "INSERT INTO Player (FirstName, LastName, TeamID) VALUES ('" 
        + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "')"); 

但是,這個代碼是錯誤的另一個原因。切勿編寫連接用戶鍵入的輸入文本的sql字符串。這會導致錯誤或更糟的是導致Sql Injection

using(connection = new OleDbConnection(connectionString)) 
    { 
     connection.Open(); 
     string sqlText = "INSERT INTO Player (FirstName, LastName, TeamID) " + 
         "VALUES (?, ?, ?)"; 
     OleDbCommand command = new OleDbCommand(sqlText, connection); 
     command.Parameters.AddWithValue("@First", textBox1.Text); 
     command.Parameters.AddWithValue("@Last", textBox2.Text); 
     command.Parameters.AddWithValue("@team", textBox3.Text); 
     command.ExecuteNonQuery(); 
    } 

還有一個問題。如果TeamID字段是數字字段,您需要將textbox3.text輸入轉換成數值正確的使用方法AddWithValue

 int teamID; 
     if(!Int32.TryParse(textBox3.Text, out teamID)) 
      throw new ArgumentException("Type a valid TeamID number, please!"); 
     command.Parameters.AddWithValue("@team", teamID); 
+2

參數化版本的工作很好。我懶得去確認正確的語法。 ;-)你是否需要圍繞字段名稱的括號? – Chris

+0

正確! – Steve

0

如果TeamID是一個數字,你不需要周圍的引號。

OleDbCommand command = new OleDbCommand("INSERT INTO Player VALUES ('" + TbFirstName.Text + "','" + TbLastName.Text + "'," + TbTeamID.Text + ")"); 

注:我重命名了文本框以減少歧義。

雖然這可能是您的第一個傳球,但您應該真正清理您的輸入。最低限度創建一個函數,用雙引號替換單引號。

protected string SanitizeSQL(string txt) { 
    return txt.replace("'", "''"); 
} 


OleDbCommand command = new OleDbCommand("INSERT INTO Player VALUES ('" + SanitizeSQL(TbFirstName.Text) + "','" + SanitizeSQL(TbLastName.Text) + "'," + SanitizeSQL(TbTeamID.Text) + ")"); 
0

你插入命令應該指定它的更新列,所以它應該是:

INSERT INTO Player(FirstName,LastName,TeamID) VALUES ('" + TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "')" 

另請注意,將用戶輸入中的文本直接連接到查詢中會導致SQL注入攻擊。

+0

非常感謝所有人 我確實增加了一個問題,不知怎的,它消失了(我是一個noob在這裏) – Yanker

相關問題