2015-08-08 53 views
0

将生日数据添加到Access数据库有点麻烦。我已经尝试过运行代码而没有'生日'进入方式,然后它的工作。根据我的研究,'DBDate'也考虑了毫秒数,我试着将文本字段的输入保存为日期时间格式,但可惜的是,这也不起作用。将日期添加到Access数据库失败

下面是我正在使用的代码。

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(); 
      [email protected]"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.ExecuteCommandTextForSingleResult System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult 小时)在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象&(tagDBPARAMS dbParams,对象&的ExecuteReuslt) 的ExecuteReuslt)在 System.Data.OleDb.OleDbCommand.ExecuteCommand(的CommandBehavior 行为,在 System.Data.OleDb对象在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(的CommandBehavior 行为,字符串方法)&的ExecuteReuslt)。 OleDbCommand.ExecuteNonQuery() Records.btnSubmit_Click(对象发件人,EventArgs e)在 E:\收存箱\临时\ OOD指派\雇员 目录\ Records.aspx.cs:线54

“出生” 在字段类型Employee.accdb文件是日期/时间。

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

+0

如果参数需要DateTime,然后将DateTime传递给它的值而不是字符串,那么应该在有效的日期时间内转换用户输入 – Steve

回答

4

DBDate mapped with DateTime在CLR方面。

这意味着,您需要首先解析您的tbBirthDate.TextDateTime

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); 
+0

我试过了你所问的内容,但不幸的是,它不起作用。我也尝试以下 - 我将用户输入的字符串转换为DateTime并将其放入 - cmd.Parameters.Add(“@ ebirth”,OleDbType.DBDate).Value = dt; 其中dt是转换后的字符串。 此外,如果文本字段中的日期格式为 - mm/dd/yyyy,我应该使用DateTime.ParseExact吗?有一个附加到该特定文本字段的日历扩展程序。 –

+0

@RajSaha您应该使用您在命令中定义的相同顺序提供参数值。更新了我的答案。看一看。 –

+0

@RajSaha另外_that_日历应该有一些'SelectedValue'或'Value'属性或其他东西。你也可以使用它们。 –

0

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

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

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