2012-04-27 17 views
1

を使用している間、私は、INSERT INTO文で、」構文エラーを取得していますが、私は理由を理解することはできません。構文エラーのDateTime

私は仕事が見つけることを行っている他の人に文を比較し、見つけることができます構造上の違いはありません。唯一の違いは、この1つでは、私のMS AccessデータベースにDateTimeを保存しようとしていることです。

私はMS AccessのデータベースフィールドをDate/Timeの一般的なフォーマット

ブレークポイントを設定してそれをフォローすると、私は渡されるDateTime形式が正しいことと、MS Accessの一般形式と一致することがわかります。

私は問題が正しいと確信していますが、私はそれを見ることができれば私はうんざりです。ここに私のコードは次のとおりです。

//method to save user input to database 
public static void SaveData(ProgramLoginBOL busObject) 
{ 
    try 
    { 
     String sSQLCommand = "INSERT INTO ProgramLogin (" + 
      "UserName, DateTime) VALUES ('" + busObject.UserName + 
      "','" + busObject.DtDate + "')"; 

     if (aConnection.State == ConnectionState.Closed) 
     { 
      aConnection.Open(); 
     } 

     OleDbCommand cmd = aConnection.CreateCommand(); 
     cmd.CommandText = sSQLCommand; 
     // Execute the SQL command 
     cmd.ExecuteNonQuery(); 
     aConnection.Close(); 

     MessageBox.Show("Data Saved");     
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
     MessageBox.Show("Error! Data was not saved."); 
    } 
} 

私が述べたように、デバッグがbusObject.DtDateは、MS Accessの日付/時刻の形式と一致していることを

+2

あなたはSQLインジェクションの脆弱性があります。パラメータを使用する必要があります。 – SLaks

+0

ありがとうございます。 –

答えて

4

を示し、問題を解決する1つの方法は、代わりにパラメータ化クエリを使用することです。これは、型について心配するプロバイダに任せています。文字列の値を一重引用符で区切ること(O'Donnelのような名前に役立ちます)や#で日付を区切ることについて心配する必要はありません。ボーナスとして、SQLインジェクション攻撃を防ぎます。

これを行うには?パラメータ

string sSQLCommand = "INSERT INTO ProgramLogin (" + 
      "UserName, DateTime) VALUES (?,?)" 

のプレースホルダは、後でアクセスしてパラメータ

cmd.Parameters.AddWithValue("?", busObject.UserName); 
    cmd.Parameters.AddWithValue("?", busObject.DtDate); 
+0

これは宿題の割り当てではありませんが、学校の教科書を自分のプログラムを作成するためのガイドラインとして使用しています。これはポスターを「SQLインジェクションの脆弱性」と呼ぶものを保護するために、すべてのデータベースの挿入を行うべきかどうかです。 –

+1

@ProgrammingNewbie。パラメータ化されたクエリを使用することは、SQLインジェクションから身を守る1つの方法です。 Accessでは、パラメータを使用したクエリ定義を使用してアクセスできます。他のデータベースでは、代わりにストアドプロシージャを使用できます。もちろん、あなたが価値観を完全に信じていれば、それほど問題はありません。 –

+0

ご協力いただきありがとうございます。 –

1

を追加するには、#文字で日付を囲む必要があります。だから、

のために、コマンドを変更する:あなたはアクセス日付/時刻の列に割り当てた

#2012-04-21 13:21:25# 
+0

ご協力ありがとうございます –

1

表示形式:

String sSQLCommand = "INSERT INTO ProgramLogin (UserName, DateTime) VALUES ('" + busObject.UserName + "',#" + busObject.DtDate + "#)"; 

フォーマット最良の結果を得るために、このようなあなたの日付文字列をクエリの日付/時刻値の正しい文字列形式には関係しません。

DateTimeの値にToStringの適切なオーバーロードを呼び出すことで、Accessが必要とするようにフォーマットすることができます。また、SLaksのコメントとしてパラメータを使用することもできます。パラメータを使用する方が安全です。また、値の書式設定について心配する必要もありません。 OleDbプロバイダがあなたのためにそれを世話します。

+0

ありがとうございました。私はフォーマットが一致しなければならないと思った。パラメータの使用がより安全であるので、私はそれを使用します。 –