2017-07-29 23 views
0

MS Accessデータベースに情報を挿入しようとしています。私のデータベースで 私は、次の列と種類があります。INSERT INTO文の構文エラー

log_order - Autonumber (I need this to keep the order where inserted in the db), 
userID - Text, 
time - Text, 
date_ - text, 
message - Text. 

マイクエリ:

command.CommandText = "INSERT INTO logs(userID, time, date_, message) VALUES ('"+verifiedUser+"', '"+msg_time+"', '"+msg_date+"', '"+msg+"')";   

OleDbDataReader reader = command.ExecuteReader(); 

私が取得エラー:

System.Data.OleDb.OleDbException: 'をINSERT INTO文の構文エラーです。 '

私はいくつかの投稿を試みましたが、投稿は私を助けませんでした。自動番号列(log_order)に問題があると思われます。私が覚えていることのために、私はそれをクエリに含める必要はありません。

PS:値をパラメータとして渡す必要があることはわかっています。

は(MSG?)おそらく事前

+0

Accessで直接質問してみて、どのようなエラーが発生しているのかを確認してください。私はおそらく、それが実際に数値フィールドの場合、verifiedUserの周りの引用符が問題を引き起こすかもしれないと思います。 – PhillipXT

+0

@marc_sしないでください..私は多くのユーザーが彼らの駄目な解決策が必要とする迅速な修正のために来ることを理解していますが、時にはそれを正しく開始するように指示する必要があることもあります。誰があなたのクレジットカード番号を保存する電子商取引ソリューションを書いているのか分かりません;) –

答えて

2

であなたの変数の1ありがとう、あなたのSQLを書いた方法は、大規模なセキュリティリスクですアポストロフィ

が含まれています。すぐに "パラメータ化されたクエリ"を検索してください。決してこれまでと同じようにSQLをもう一度書くことはありません(ここでは、文字列連結を使用して値をクエリに組み込みます)。あなたのコードには問題が増えており、パラメータ化されたクエリを使用するとすべての問題が解決されます。彼らはINSERTに渡された変数のいくつかで、あなたのデータは、このエラーを引き起こす可能性のあるようだ

enter image description here

+0

アドバイスありがとうございます。しかし、msg変数は間違いではありません。 – kdem

+4

そのSQL全体が間違いです。 –

0

書くことは困難ではありません。実行する前にcommand.CommandTextの値をデバッグしてみてください。変数のいずれかが、彼らはエスケープする必要があり、単一引用符を持っている場合は ... Refが:How do I escape a single quote in SQL Server?

また、SQLインジェクションRefにブラッシュアップ:SQL Injection

0

私は完全に言われたことすべてに同意するが、これに直接あなたの質問に答えて、私はかなりあなたのフィールド名の周りに角括弧を配置する必要があります確信しています。 OleDbは特殊文字が気に入らない傾向があり、date_などの問題が発生する可能性があります。代わりに[date_]を送信すると問題が解決されます。 時間も気に入らないでしょう。 SQLインジェクションOLEDB経由さておき、実際には呼び出しアクセスなど

上の同じ溶液

補遺は、比較的SQLインジェクションから保護されています。これは、1つのコマンドで複数の命令を実行しようとする試みが失敗するためです。 (あなたはフォーマットされていない文字列エラーを受け取る)。だから、あなたがやっていることは安全だと主張することができますが、他のDBプロバイダにとってはそうではありません。あなたが良い習慣に入ると早く、危険にさらされる可能性がある場合に脆弱性を導入する可能性は低くなります。あなたが虐待を受けているようであれば、ここの誰もがネットを安全に保つことを望んでいるからです。

+0

それはそれを解決しました、ありがとう! – kdem

関連する問題