-1

Access データベース (2010) に接続された Visual Studio 2010 を使用しています。

テキストボックスからデータベースに項目を追加するボタンを作成しましたが、「INSERT INTO ステートメントの構文エラー」というエラーが表示されます。

    protected void upload_Click(object sender, EventArgs e)
{
    if (FileUpload3.HasFile)
    {
        try
        {
            string filename = Path.GetFileName(FileUpload3.FileName);
            FileUpload3.SaveAs(Server.MapPath("images") + "/" + filename);
            Picture.Text = "images/" + filename;
            Label2.Text = "";
        }
        catch (Exception ex)
        {

            Label2.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message;
        }



    }
}

protected void addnewitem_Click(object sender, EventArgs e)
{


    AccessDataSource1.InsertCommand = "Insert into RAM (RAM Name, picture) values ('" + name.Text.ToString() + ",'" + Picture.Text.ToString() + "')";

    AccessDataSource1.Insert();
}
4

3 に答える 3

1

SQL インジェクションを少し試してみてください。「名前」テキストボックスに入力したテキストに一重引用符を追加してください。

それが機能する場合は、ユーザーからのテキストを追加するのではなく、クエリでパラメーターを使用します。

参考文献:

http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html

パラメータ化されたクエリは、SQL インジェクションに対してどのように役立ちますか?

アップデート

元の質問に対する Alberto Spelta のコメントの修正も使用します (スペースを含む列名を括弧で囲みます: "RAM Name" => "[RAM Name]")。これは別の構文エラーであり、一重引用符が省略されています。

于 2013-04-18T12:32:19.357 に答える
1

一重引用符がありません:

"... values ('" + name.Text.ToString() + "','" + Picture.Text.ToString() + "')"
                                          ^

ただし、このような文字列連結を使用するべきではありません。代わりに適切なパラメーター化されたクエリを使用すると、これらの問題 (または、データに単一引用符が含まれている場合に発生するより危険な挿入の問題) が表示されなくなります。

于 2013-04-18T12:33:01.493 に答える