在访问中插入日期
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#
【讨论】:
以上是关于在访问中插入日期的主要内容,如果未能解决你的问题,请参考以下文章