我几乎尝试了所有方法来使用 C# 将当前日期和时间插入到 MS Access 数据库中,但似乎没有任何效果。 表结构看起来像
ID(Primary Key) Est_ID(Number) saveName(Text) userName(Text) timestamp(Date/Time)
代码看起来像
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
DateTime today = DateTime.Today;
DateTime time= DateTime.Now;
string name = Request.Form["saveName"];
string my_querry = "INSERT INTO TABLENAME (userName, Est_id,saveName,timestamp) VALUES(@userName,@Est_id,@saveName,@timestamp)";
OleDbCommand cmd = new OleDbCommand(my_querry, conn);
cmd.Parameters.AddWithValue("@userName", userName);
cmd.Parameters.AddWithValue("@Est_id", est_index);
cmd.Parameters.AddWithValue("@saveName", name);
cmd.Parameters.AddWithValue("@timestamp",time);
cmd.ExecuteNonQuery();
我尝试过格式化。我添加了 # 但似乎没有任何作用。这真的很令人沮丧,因为我花了一天多的时间才让它发挥作用。我究竟做错了什么?
OleDB/Access 要求您显式设置日期/时间值的数据类型。
var param = cmd.Parameters.AddWithValue("@timestamp",time);
param.OleDbType = OleDbType.Date;
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
string name = Request.Form["saveName"];
string my_querry = "INSERT INTO TABLENAME (userName, Est_id,saveName,timestamp) VALUES(@userName,@Est_id,@saveName,Now())";
OleDbCommand cmd = new OleDbCommand(my_querry, conn);
cmd.Parameters.AddWithValue("@userName", userName);
cmd.Parameters.AddWithValue("@Est_id", est_index);
cmd.Parameters.AddWithValue("@saveName", name);
cmd.ExecuteNonQuery();
您可能需要检查数据库中的列设置,是否已将时间戳列的格式设置为一般日期,以与 C# 中的 DateTime.Now 匹配。
另外,您需要检查 System.DateTime 的输出以及您的数据库时间格式是 12 小时制还是 24 小时制。
希望这些信息可以帮助到您。
如果您使用 Tortuga Chain:
static AccessDataSource s_DataSource = new AccessDataSource(connectionString); //one per application
DateTime today = DateTime.Today;
DateTime time= DateTime.Now;
string name = Request.Form["saveName"];
s_DataSource.Insert("TABLENAME", new {@username = userName, @Est_id = est_index,@saveName = name,@timestamp = time}).Execute();
这还没有选定的答案。我遇到了类似的问题并已解决,因此我将其发布在这里希望对其他人有所帮助。首先让我们稍微修复一下@user3342812代码
OleDbConnection conn = new OleDbConnection(connectionString);
conn.Open();
DateTime time= DateTime.Today;
string name = Request.Form["saveName"];
string editTableName = "name of table to edit"
string my_querry = $"INSERT INTO {editTableName} ([userName], [Est_id], [saveName],[timestamp]) VALUES(?,?,?,?)";
OleDbCommand cmd = new OleDbCommand(my_querry, conn);
cmd.Parameters.AddWithValue("@userName", userName);
cmd.Parameters.AddWithValue("@Est_id", est_index);
cmd.Parameters.AddWithValue("@saveName", name);
cmd.Parameters.AddWithValue("@timestamp",time);
cmd.ExecuteNonQuery();
注: 您并不总是必须在变量周围使用“[]”,但如果您的 MS Access (MSA) 字段是保留字,您将收到错误消息,所以我一直在使用它们。
虽然OP可以使用
VALUES(@userName,@Est_id,@saveName,@timestamp)
我发现使用起来更简单、更安全VALUES(?,?,?,?)
*最后说明:* 我在这里看到的最后一个问题,以及我一整天都在努力解决的问题是将日期时间输入 MSA。 MSA 具有类似于 8/8/2024 的日期时间格式,但 C# 日期时间可以具有多种格式,其中之一是 DateOnly 这不起作用,因为 MSA 没有数据类型 DateOnly。我构建它并让 MSA 接受的方式是:
public class TestModel
{
public TestModel()
{
_opened = DateTime.Today;
}
private readonly DateTime _opened;
public DateTime Opened
{
get => _opened;
}
}
我知道这篇文章有点旧,但它可以帮助某人。 从今天早上开始我就面临这个问题。我终于找到了解决方案。
DateTime.Now
发送到数据库的值采用{dd / mm / yyyy hh: mm: ss}
的形式,我认为发生的情况是访问无法识别{ }
。
因此,要解决这个问题,只需将日期转换为字符串,然后再将其分配给参数即可:
cmd.Parameters.AddWithvalue("@timestamp", time.ToString());
或者
cmd.Parameters.AddWithvalue("@timestamp", oleDbType.Date).Value=time.ToString());
这对我来说非常有效