无法将日期添加到 Access 数据库

Posted

技术标签:

【中文标题】无法将日期添加到 Access 数据库【英文标题】:Failed to add Date to Access database 【发布时间】:2015-10-31 17:38:59 【问题描述】:

将生日数据添加到 Access 数据库时遇到了一些麻烦。我曾尝试在不妨碍“生日”的情况下运行代码,然后它就可以工作了。根据我的研究,“DBDate”也考虑了毫秒,我尝试将文本字段中的输入保存为 DateTime 格式,但可惜,这也不起作用。

这是我正在使用的代码。

public partial class Records : System.Web.UI.Page

    OleDbConnection con;
    OleDbCommand cmd;

    protected void Page_Load(object sender, EventArgs e)
    
        // Trace.Warn("2310", "Beginning of life Page_Load");
    

    protected void btnSubmit_Click(object sender, EventArgs e)
    
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString=@"Provider=Microsoft.ACE.OLEDB.12.0;
            Data Source=E:\Dropbox\Temporary\OOD Assignment\Employee Directory\AppData\Employee.accdb";

        String empName;
        String ebirth;
        String job;
        String location;
        String pnumber;
        String email;

        OleDbCommand cmd = new OleDbCommand("INSERT into EmployeeRecords ([ename],[job],[location],[phonenumber],[email],[birth])Values(@empName,@job,@location,@pnumber,@email,@ebirth)");
    cmd.Connection = conn;

        conn.Open();

        if(conn.State == ConnectionState.Open)
        
            cmd.Parameters.Add("@empName", OleDbType.VarChar).Value = tbEName.Text;
            cmd.Parameters.Add("@ebirth", OleDbType.DBDate).Value = tbBirthDate.Text;
            cmd.Parameters.Add("@job", OleDbType.VarChar).Value = tbJobTitle.Text;
            cmd.Parameters.Add("@location", OleDbType.VarChar).Value = tbOfficeLocation.Text;
            cmd.Parameters.Add("@pnumber", OleDbType.Numeric).Value = tbPNumber.Text;
            cmd.Parameters.Add("@email", OleDbType.VarChar).Value = tbEmail.Text;

            try
            
                cmd.ExecuteNonQuery();
                Label1.Text = "Data Added";
                conn.Close();
            
            catch(OleDbException ex)
            
                Label1.Text = "Exception" + ex;
                conn.Close();
            
         else
        
            Label1.Text = "Connection Failed!";
        
    

这是我得到的错误:

ExceptionSystem.Data.OleDb.OleDbException (0x80040E07):数据类型 标准表达式不匹配。在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult 小时)在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象& 执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery() 在 Records.btnSubmit_Click(Object sender, EventArgs e) in e:\Dropbox\Temporary\OOD 分配\员工 目录\Records.aspx.cs:第 54 行

Employee.accdb 文件中“birth”的字段类型为 Date/Time。

有没有什么方法可以将文本字段中的用户输入转换为 Access 可以理解的格式?任何帮助将非常感激。

【问题讨论】:

如果参数需要 DateTime 然后将 DateTime 传递给它的值,而不是字符串,您应该将用户输入转换为有效的日期时间 【参考方案1】:

DBDate mapped with DateTime 在 CLR 端。

这意味着,您需要先将tbBirthDate.Text 解析为DateTime

cmd.Parameters.Add("@ebirth", OleDbType.DBDate).Value = DateTime.Parse(tbBirthDate.Text);

如果您的文本框值不是 CurrentCulture 的标准日期和时间格式,您可以使用 DateTime.ParseExact method 以字符串的确切格式对其进行解析。

还可以使用using statement 自动处理您的连接和命令,而不是手动调用CloseDispose 方法。

顺便说一下,OleDbCommand 不支持命名参数。实际上,它支持但它并不只是关心。只关心它们的参数值。

OleDbCommand cmd = new OleDbCommand(@"INSERT into EmployeeRecords ([ename],[job],[location],[phonenumber],[email],[birth])
                                      Values(@empName,@job,@location,@pnumber,@email,@ebirth)");
....
cmd.Parameters.Add("@empName", OleDbType.VarChar).Value = tbEName.Text;
cmd.Parameters.Add("@job", OleDbType.VarChar).Value = tbJobTitle.Text;
cmd.Parameters.Add("@location", OleDbType.VarChar).Value = tbOfficeLocation.Text;
cmd.Parameters.Add("@pnumber", OleDbType.Numeric).Value = tbPNumber.Text;
cmd.Parameters.Add("@email", OleDbType.VarChar).Value = tbEmail.Text;
cmd.Parameters.Add("@ebirth", OleDbType.DBDate).Value = DateTime.Parse(tbBirthDate.Text);

【讨论】:

我尝试了你的要求,但不幸的是,它没有用。我还尝试了以下操作 - 我将用户输入的字符串转换为 DateTime 并将其放入 - cmd.Parameters.Add("@ebirth", OleDbType.DBDate).Value = dt;其中 dt 是转换后的字符串。另外,如果文本字段中的日期格式是 - mm/dd/yyyy,我应该使用 DateTime.ParseExact 吗?该特定文本字段附加了一个日历扩展器。 @RajSaha 您应该按照您在命令中定义的顺序提供参数值。更新了我的答案。看看吧。 @RajSaha 另外 that 日历应该有一些 SelectedValueValue 属性或其他东西。您也可以使用它们。 你是最棒的!太感谢了。那行得通。我不知道订单如此重要。再次感谢您!【参考方案2】:

您不能将字符串传递给日期/时间。您需要将日期转换为日期时间:

DateTime value = new DateTime(year, month, day);

其他方法是使用 DateTimePicker 代替 TextBox。请注意,因为据我所知 OleDB 无法处理毫秒。

【讨论】:

以上是关于无法将日期添加到 Access 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期添加到 Microsoft Access?

如何将版本号添加到 .msi 中的 Access 文件

使用 Workbench 将 MS Access 迁移到 MySQL 时出现日期时间错误

C# Access OleDB 分别添加时间和日期

Access 和 VBA:在导入期间将日期添加到一列的所有值

将具有单独日期范围的表格组合在一起而不重叠数据 - Access