【问题标题】: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格式

标签: c# visual-studio ms-access insert


【解决方案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'
    );

问题是:

  1. 您正在尝试将字符串'#12/11/2023 2:46:38 PM#' 插入日期/时间字段rec_time。丢弃单引号以使该值成为日期/时间文字而不是字符串:#12/11/2023 2:46:38 PM#
  2. 您正在尝试将字符串 'T' 插入“是/否”字段 grid_electricity。请改用不带引号的True
  3. 您正在尝试将字符串 '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#
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多