3

ユーザー名と DateTime オブジェクトを MS-Access データベースに保存しようとしていますが、「INSERT INTO ステートメントの構文エラー」が発生します。プログラムをデバッグすると、日付が正しく渡されていることがわかります。また、DateTime 情報を完全に削除し、ユーザー名だけで挿入コマンドを使用して正しく保存したため、DateTime 自体と関係がありますが、何がわかりません。関連するコードは次のとおりです。

//event handler for Begin Program button
private void btnBeginProgram_Click(object sender, EventArgs e)
{
  //assign DateTime object to current computer date/time 
  busObject.DtDate = DateTime.Now;

  //assign input to busObject.UserName property
  busObject.UserName = txtEnterName.Text;   

  //call method to save input data
  busObject.SaveData();           

  this.Close();
}

//properties for variables and objects
public string UserName
{
  get { return userName; }
  set { userName = value; }
}

public DateTime DtDate
{
  get { return dtDate; }
  set { dtDate = value; }
} 

//method to call SaveData method in ProgramLoginDAL class
public void SaveData()
{
  ProgramLoginDAL.SaveData(this);
}

//method to save user input to database
public static void SaveData(ProgramLoginBOL busObject)
{
  try
  {
    OleDbCommand cmd = aConnection.CreateCommand();

    String sSQLCommand = "INSERT INTO ProgramLogin (UserName, DateTime) VALUES (?,?)";

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

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

    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.");
  }
}
4

5 に答える 5

4

フィールド名を括弧で囲んでみてください。それはおそらくキーワードです:

String sSQLCommand = "INSERT INTO ProgramLogin (UserName, [DateTime]) VALUES (?,?)";

DateTime の場合、データ型を指定する必要がある場合があります。

sSQLCommand .Parameters.Add(
  new OleDbParameter("?", OleDbType.Date) { Value = busObject.DtDate });
于 2012-04-27T16:29:23.390 に答える
1

パラメータに別の名前を付けてみませんか?

String sSQLCommand = "INSERT INTO ProgramLogin (UserName, DateTime) VALUES (@Name,@Date)";           

cmd.Parameters.AddWithValue("@Name", busObject.UserName);     
    cmd.Parameters.AddWithValue("@Date", busObject.DtDate); 
于 2012-04-27T16:31:16.073 に答える
1

パラメータを設定する前にコマンドテキストを設定してみてください...これは何もないかもしれませんが、その順序で行われるのを見たことはありません...

于 2012-04-27T16:28:28.680 に答える
1

この方法を試してください:

com.CommandText = "INSERT INTO ProgramLogin (UserName, [DateTime]) values (@userName, @date)";

cmd.Parameters.AddWithValue("@userName", busObject.UserName);
cmd.Parameters.AddWithValue("@date", busObject.DtDate);
于 2012-04-27T16:32:39.240 に答える
1

OleDb プロバイダーは名前付きパラメーターの代わりに位置パラメーターを使用しますが、コレクション内に同じ名前の 2 つのパラメーターを持つことは適切ではありません。

また、アクセス データベースを使用している場合、DateTime は予約語です。角括弧で囲む必要があります

于 2012-04-27T16:34:00.067 に答える