1

Access データベースに値を挿入しようとすると、エラーが発生し続けます。

エラーは構文上のものであり、次の例外が発生します。

OleDbException は処理されませんでした INSERT INTO ステートメントの構文エラーです。

private OleDbConnection myCon;

public Form1()
{
    InitializeComponent();
    myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}

private void insertuser_Click(object sender, EventArgs e)
{
    OleDbCommand cmd = new OleDbCommand();
    myCon.Open();
    cmd.Connection = myCon;
    cmd.CommandType = CommandType.Text;

    cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
                                        "[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
                      "VALUES ('" + userid.Text.ToString() + "' , '" +
                                    fname.Text.ToString() + "' , '" +
                                    sname.Text.ToString() + "' , '" +
                                    dob.Text.ToString() + "' , '" +
                                    tarweight.Text.ToString() + "' , '" +
                                    tarcal.Text.ToString() + "' , '" +
                                    height.Text.ToString() + "')";

    cmd.ExecuteNonQuery();
    myCon.Close();
}
4

6 に答える 6

8

エラーの内容を特定していませんが、最初の問題は、データを SQL ステートメントに直接挿入していることです。そうしないでください。SQL インジェクション攻撃を招いています。

代わりに、パラメーター化された SQL ステートメントを使用してください。それでも問題が解決しない場合は、この質問を新しいコードで編集し、エラーの内容を説明してください。大規模な連結が含まれず、不一致のブラケットなどを簡単に隠すことができないため、新しいコードはすでにより明確になっている可能性があります。

編集: コメントで述べたように、Jet/ACE は DML を許可しないため、より少ない種類の SQL インジェクション攻撃に対して脆弱です。この INSERT ステートメントには実際には脆弱性はありませんが、同様の方法で記述された WHERE 句を含む SELECT の場合、ユーザー入力が WHERE 句の保護の一部を回避する可能性があります。もちろん、パラメータ化されたクエリを使用することを強くお勧めします。

  • ユーザーデータをエスケープする必要がないことを意味します
  • データをコードとは別に保持します
  • Jet/ACE から移行する場合 (この特定のコードを移行するか、単に別のデータベースで個人的に作業を開始するか) について心配する必要が少なくなります。
  • 日付などの他のデータ型の場合、データベースに適した形式にデータを取得するための作業を行う必要はありません

( へのすべての呼び出しも必要ありません。呼び出されたプロパティが既にToString文字列であることを期待するだけでなく、文字列連結を使用しているという事実は、とにかく文字列変換が自動的に行われることを意味します。)Text

于 2011-01-07T16:15:32.207 に答える
4

これを重複した質問へのコメントとして投稿しました: Syntax error in INSERT INTO statement in c# OleDb Exception cant spot the error

テーブル名「User」を括弧 [] で囲みます。これは SQL Server の予約語です。

「ユーザー」は Access の予約語でもあります (接続文字列のプロバイダーによって判断されます)。

しかし、私はJonに完全に同意します-現在の実装を修正すると、大きなセキュリティホールが開かれるだけです(Userテーブルに対しても同様です!)

于 2011-01-07T17:28:28.283 に答える
0
public decimal codes(string subs)
    {
        decimal a = 0;


        con_4code();
            query = "select SUBJINTN.[SCODE] from SUBJINTN where SUBJINTN.[ABBR] = '" +                         subs.ToString() + "'";
            cmd1 = new OleDbCommand(query, concode);
            OleDbDataReader dr = cmd1.ExecuteReader();

これは dr のエラーです。DBMS の構文エラー eile は正常に機能しています。

            if (dr.Read())
            {
                a = dr.GetDecimal(0);
                MessageBox.Show(a.ToString());
            }
            return a;



    }
于 2012-03-26T08:35:24.630 に答える
0

TargetWeightHeight、およびTargetCaloriesが浮動小数点値または整数値の場合、SQL ステートメントで引用符で囲む必要はありません。

また、質問とは直接関係ありませんが、パラメータ化されたクエリの使用を検討する必要があります。コードは SQL インジェクションに対して非常に脆弱です。

于 2011-01-07T19:13:26.247 に答える
0

この後

cmd.CommandText="INSERT INTO User ([UserID], [Forename], [Surname], [DateOfBirth], [TargetWeight], [TargetCalories], [Height]) Values ('" + userid.Text.ToString() + "' , '" + fname.Text.ToString() + "' , '" + sname.Text.ToString() + "' , '" + dob.Text.ToString() + "' , '" + tarweight.Text.ToString() + "' , '" + tarcal.Text.ToString() + "' , '" + height.Text.ToString() + "')";

これに含まれるものを確認してください。おそらく[DateOfBirth]不正な形式です

于 2013-05-12T07:34:45.080 に答える