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

时间:2015-08-08 09:58:39

标签: c# asp.net oledb positional-parameter

在将生日数据添加到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   hr)at   System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS   dbParams,Object& executeResult)at   System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象&安培;   executeResult)at   System.Data.OleDb.OleDbCommand.ExecuteCommand(的CommandBehavior   行为,对象& executeResult)at   System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(的CommandBehavior   行为,String方法)at   System.Data.OleDb.OleDbCommand.ExecuteNonQuery()at   Records.btnSubmit_Click(Object sender,EventArgs e)in   e:\ Dropbox \ Temporary \ OOD Assignment \ Employee   Directory \ Records.aspx.cs:第54行

"出生的字段类型"在Employee.accdb文件中是日期/时间。

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

2 个答案:

答案 0 :(得分:5)

CLR方面的

DBDate mapped with DateTime

这意味着,您需要先将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);

答案 1 :(得分:0)

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

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

其他方法是使用DateTimePicker而不是TextBox。请注意,因为我听说OleDB无法处理毫秒。