在访问中插入日期

Posted

技术标签:

【中文标题】在访问中插入日期【英文标题】:Date insert in access 【发布时间】:2012-12-23 15:19:21 【问题描述】:

我正在处理访问问题,但遇到了具有日期时间的插入查询。像这些查询对我不起作用。

INSERT INTO tbl_fuel_levels([genset_id], [rec_time], [fuel_level], 
[grid_electricity], [genset_electricity], [genset_number]) 
VALUES('001', '#12/12/23 18:46:38+20#', '0', 'T', 'F', '+923468280124');

INSERT INTO tbl_fuel_levels([genset_id], [rec_time], [fuel_level], 
[grid_electricity], [genset_electricity], [genset_number]) 
VALUES('001', #'12/12/23 18:46:38+20'#, '0', 'T', 'F', '+923468280124');

INSERT INTO tbl_fuel_levels([genset_id], [rec_time], [fuel_level], 
[grid_electricity], [genset_electricity], [genset_number]) 
VALUES('001', '12/12/23 18:46:38+20', '0', 'T', 'F', '+923468280124');

有什么想法吗?可能出了什么问题。

这是我在 c# 中的代码:

con = new OleDbConnection(ConnStr);
con.Open();

cmd = con.CreateCommand();
cmd.CommandText = "INSERT INTO tbl_fuel_levels([genset_id], [rec_time], 
[fuel_level], [grid_electricity], [genset_electricity], [genset_number]) 
VALUES('" + genset_id + "', '" + rec_time + "', '" + fuel_level + "', '" +
grid_electricity + "', '" + genset_electricity + "', '" + genset_number + "');";
cmd.ExecuteNonQuery();

我也试过这个。

cmd.CommandText = "INSERT INTO tbl_fuel_levels([genset_id], [rec_time], 
[fuel_level], [grid_electricity], [genset_electricity], [genset_number]) 
VALUES('" + genset_id + "', @rec_t, '" + fuel_level + "', '" + grid_electricity 
+ "','" + genset_electricity + "', '" + genset_number + "');";
cmd.Parameters.Add("@rec_t", OleDbType.DBTimeStamp).Value 
                              = DateTime.Parse(rec_time);

所有其他插入和选择查询都工作正常

【问题讨论】:

能否请您展示一下您的 OLEDB 命令代码是什么样子的,同时检查数据库并告诉我们数据类型设置为 ' 找不到你吗?你的意思是c#代码? 日期字段数据类型是 DateTIme 还是 Text,时间字段也很重要吗..? 附加快照中提供的日期时间 你试过YYYY-MM-DD HH:NN:SS格式 【参考方案1】:

试试这个

try


  con = new OleDbConnection(ConnStr);
  con.Open();

  cmd = con.CreateCommand();
  cmd.CommandText = "INSERT INTO tbl_fuel_levels([genset_id], [rec_time], [fuel_level], [grid_electricity], [genset_electricity], [genset_number]) 
VALUES(?,?,?,?,?,?)";
cmd.Parameters.AddWithValue("@id",id);

cmd.Parameters.AddWithValue("@date",DateTime.Parse("12/12/2009 11:34:55"));
  cmd.ExecuteNonQuery();


catch (OleDBException ex)

  MessageBox.Show(ex.Message);

更新:

如果您使用的是 Access 2010,那么您也可以在 MSAccess 上使用存储过程。更多内容请看这篇文章How do I make a stored procedure in MS Access?

【讨论】:

OleDB 并没有真正使用参数名称,它是基于索引的,这就是为什么您可以将每个参数的问号作为名称传递。您必须确保您的参数与查询语句的顺序相同。 @DJKRAZE :是的,参数必须对齐。你是真的。【参考方案2】:

您的INSERT 查询不止一个问题。我从您的评论中复制了这个版本给 DJ:

INSERT INTO tbl_fuel_levels (
    [genset_id],
    [rec_time],
    [fuel_level],
    [grid_electricity],
    [genset_electricity],
    [genset_number]
    )
VALUES (
    '001',
    '#12/11/2023 2:46:38 PM#',
    '0',
    'T',
    'F',
    '+923468280124'
    );

问题是:

    您正在尝试将字符串'#12/11/2023 2:46:38 PM#' 插入日期/时间字段rec_time。丢弃单引号以使该值成为日期/时间文字而不是字符串:#12/11/2023 2:46:38 PM# 您正在尝试将字符串 'T' 插入“是/否”字段 grid_electricity。请改用不带引号的True。 您正在尝试将字符串 'F' 插入“是/否”字段 genset_electricity。这与问题 #2 相同。使用不带引号的False

使用 Access 的查询设计器创建新查询。将其切换到 SQL 视图并粘贴到此语句中:

INSERT INTO tbl_fuel_levels (
    [genset_id],
    [rec_time],
    [fuel_level],
    [grid_electricity],
    [genset_electricity],
    [genset_number]
    )
VALUES (
    '001',
    #12/11/2023 2:46:38 PM#,
    '0',
    True,
    False,
    '+923468280124'
    );

如果该语句还有任何剩余问题,请在 Access 中解决它们,然后再使用 c# 代码创建语句。

或者更好的是,使用参数查询方法。一旦您使用“是/否”字段解决了这些问题,也许您可​​以使其正常工作。

【讨论】:

【参考方案3】:

我可以建议以下这种方式,您可以先捕获确切异常,以便我们可以确定插入失败的字段.. 我认为您传递的日期很奇怪尝试传递“MM/DD/YYY HH:MM :SS"

try


  con = new OleDbConnection(ConnStr);
  con.Open();

  cmd = con.CreateCommand();
  cmd.CommandText = "INSERT INTO tbl_fuel_levels([genset_id], [rec_time], [fuel_level], [grid_electricity], [genset_electricity], [genset_number]) VALUES('" + genset_id + "', '" + rec_time + "', '" + fuel_level + "', '" + grid_electricity + "', '" + genset_electricity + "', '" + genset_number + "');";
  cmd.ExecuteNonQuery();


catch (OleDBException ex)

  MessageBox.Show(ex.Message);

如果您决定使用 AddWithParameters() 方法,您可能想尝试这样的方法

cmd.Parameters.AddWithValue("?", DateTime.Parse("12/11/2023 2:46:38"));

或者正确的方法是这样的

"INSERT INTO tbl_fuel_levels[genset_id], [rec_time], [fuel_level], [grid_electricity], [genset_electricity], [genset_number])
 VALUES('0','1','2','3','4','5','6')", genset_id, rec_time, fuel_level, grid_electricity, genset_electricity, genset_number)";

我建议创建变量并将值分配给变量

创建变量并将其分配给这些值 这样你就不必有一个看起来很讨厌的带有所有逗号的插入语句

genset_id、rec_time、fuel_level、grid_electricity、genset_electricity、genset_number

【讨论】:

System.Data.OleDb.OleDbException:标准表达式中的数据类型不匹配 我的查询 INSERT INTO tbl_fuel_levels([genset_id], [rec_time], [fuel_level], [grid_electricity], [genset_electricity], [genset_number]) VALUES('001', '#12/11/ 2023 2:46:38 PM#', '0', 'T', 'F', '+923468280124'); 你通常在做选择时使用#号。我认为你不需要它来表示日期【参考方案4】:

要在 MSAccess 查询中格式化日期,您只需使用 # 符号:

#12/12/23 18:46:38+20#

【讨论】:

以上是关于在访问中插入日期的主要内容,如果未能解决你的问题,请参考以下文章

在访问数据库c#中插入日期和时间

当日期为空时,在访问中的日期列中插入空值

将日期插入访问数据库

将日期值插入 MS 访问

使用 java 和 sql INSERT Query 在 MS 访问中插入字符串类型变量和日期类型变量

在 SQLite 中插入或更新