1

Insert INTO ステートメントで「構文エラー」が表示されますが、その理由がわかりません。

私はその声明を私が見つけた他のものと比較しましたが、構造上の違いは見つかりませんでした. 唯一の違いは、これでは MS Access データベースに DateTime を保存しようとしていることです。

MM/DD/YY HH:MM:SS AM (または PM) の一般的な形式の日付/時刻に設定された MS Access のデータベース フィールドがあります。DateTime 形式を同じに設定しています。

ブレーク ポイントを設定してそれを実行すると、渡された 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.DtDateMS Accessの日付/時刻形式と一致することを示しています

4

3 に答える 3

4

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

これを行うには?パラメータのプレースホルダー

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

その後、パラメータを追加します

   cmd.Parameters.AddWithValue("?", busObject.UserName);
   cmd.Parameters.AddWithValue("?", busObject.DtDate);
于 2012-04-27T15:38:10.833 に答える
1

Accessでは、日付を#文字で囲む必要があります。

したがって、コマンドを次のように変更します。

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

最良の結果を得るには、日付文字列を次のようにフォーマットします。

#2012-04-21 13:21:25#
于 2012-04-27T15:39:58.063 に答える
1

Access Date/Time 列に割り当てた表示形式は、クエリの日付/時刻値の正しい文字列形式には関係ありません。

DateTime 値に対して適切なオーバーロードを呼び出してToString、Access の必要に応じて書式設定するか、SLaks がコメントしたように、パラメーターを使用できます。パラメータを使用する方が安全であり、値がどのようにフォーマットされるかを気にする必要がないことも意味します。OleDb プロバイダーがそれを処理します。

于 2012-04-27T15:41:12.330 に答える