3

我正在尝试将用户名和 DateTime 对象保存到 MS-Access 数据库,但出现“INSERT INTO 语句中的语法错误”。当我调试程序时,我看到日期已正确传递。此外,我完全删除了 DateTime 信息,并仅使用用户名使用 insert 命令并正确保存,因此它与 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

尝试在设置参数之前设置命令文本...这可能没什么,但我从未见过按此顺序完成...

于 2012-04-27T16:28:28.680 回答
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

试试这个方法:

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 提供程序使用位置参数而不是命名参数,但在集合中拥有两个同名的参数并不是一件好事。

此外,如果您使用的是访问数据库,则 DateTime 是保留字。需要用方括号封装

于 2012-04-27T16:34:00.067 回答