-2

这是我第一次与 DB 合作。我决定创建一个包含两个表的数据库 - “团队”、“玩家” 我想在“玩家”表中添加一个新玩家。“玩家”表由以下列组成:ID(autonumber)、FirstName、LastName、TeamID

为此,我为 FirstName、LastName、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
        { }
4

3 回答 3

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);
于 2012-10-02T14:28:47.063 回答
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) + ")");
于 2012-10-02T14:28:29.540 回答
0

您的插入命令应该指定它正在更新的列,所以它应该是:

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

另请注意,将用户输入中的文本直接连接到查询中会使您面临 sql 注入攻击。

于 2012-10-02T14:29:04.657 回答