-2

DBを扱うのはこれが初めてです。「チーム」、「プレーヤー」の 2 つのテーブルを持つ DB を作成することにしました。新しいプレーヤーを「プレーヤー」テーブルに追加したいと考えています。「プレーヤー」テーブルは次の列で構成されています: ID(autonumber)、FirstName、LastName、TeamID

これを行うために、FirstName、LastName、TeamID の 3 つのテキスト ボックスを作成しました。「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 インジェクションが発生したりします

   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 フィールドが数値フィールドの場合、addWithValue メソッドを正しく使用するには、textbox3.text 入力を数値に変換する必要があります。

        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 に答える