在访问表中更新日期时间

时间:2012-01-31 23:40:50

标签: c# ms-access datetime oledbcommand oledbparameter

我正在尝试将datetime值插入数据表中,然后使用oledbdataadapter的update(datatable)方法将其加载到我的数据库中..但我不断得到“条件表达式中的数据类型不匹配”。错误。我访问表中的数据类型是:

ID Number
Nombre_Proyecto Text
Codigo_Ine_Proy Text
Cliente text
Fecha_Creacion Datetime (short date) 

根据访问短日期是mm / dd / yyy,哪个符合我的datetime / toshortdatestring方法?我至少这么认为。

任何帮助将不胜感激。这是我的代码:

在数据适配器中插入OledbCommand:

  sql = "PARAMETERS [@Fecha_Creacion] datetime;INSERT Into [Proyectos] ([ID], [Nombre_Proyecto],[Codigo_Ine_Proy],[Cliente],[Fecha_Creacion]) Values (@ID,@Nombre_Proyecto,@Codigo_Ine_Proy,@Cliente,@Fecha_Creacion)";
  Comando = new OleDbCommand(sql, conn);
  Comando.Parameters.Add("@Nombre_Proyecto", OleDbType.VarWChar, 500, "Nombre_Proyecto");
  Comando.Parameters.Add("@Codigo_Ine_Proy", OleDbType.VarWChar, 500, "Codigo_Ine_Proy");
  Comando.Parameters.Add("@Cliente", OleDbType.VarWChar, 500, "Cliente");
  Comando.Parameters.Add("@Fecha_Creacion", DbType.DateTime);
  Comando.Parameters.Add("@ID", OleDbType.Integer, 10000, "ID");

我在数据表上创建数据行的部分

  DataRow newRow = Tabla_Proyectos_BD_General.NewRow();
  Max_IDs["Proyectos"] += 1;
  newRow["ID"] = Max_IDs["Proyectos"];
  newRow["Nombre_Proyecto"] = textBox2.Text;
  newRow["Codigo_Ine_Proy"] = textBox1.Text;
  newRow["Cliente"] = textBox3.Text;
  string x = System.DateTime.Now.ToShortDateString();
  newRow["Fecha_Creacion"] = x;
  Tabla_Proyectos_BD_General.Rows.Add(newRow);

2 个答案:

答案 0 :(得分:0)

string x = System.DateTime.Now.ToShortDateString();

这是一个字符串,而不是日期时间!因此不匹配。

newRow [“Fecha_Creacion”] = System.DateTime.Now;

你的参数化查询应该只为你做。

如果您想以短日期格式显示您放入的日期(无论是在进行格式化的电脑上,请将其作为日期时间,然后根据需要进行格式化。

PS如果要将日期作为字符串传递给数据库,请使用格式yyyy-MM-dd或yyyyMMdd。除了通用和明确的日期格式之外的任何其他格式只是一个等待发生的错误,除非你必须这样做,否则永远都不会。

提示输出日期时,将它们转换为某种格式的字符串是最后一项操作,输入时,从字符串转换为日期时间是你应该做的第一件事。

评论后编辑 最简单的解决方案是

Comando.Parameters.Add(“@ Fecha_Creacion”,DbType.DateTime,System.DateTime.Now);

答案 1 :(得分:0)

你应该使用

newRow["Fecha_Creacion"] = System.DateTime.Now;

您在Access中看到的是“格式化日期”。通过OleDB进行交互时,您需要使用DateTime而不是格式化的字符串。