【问题标题】:Updating access db using SQL in C# - DATE issue在 C# 中使用 SQL 更新访问数据库 - 日期问题
【发布时间】:2017-07-29 18:56:51
【问题描述】:

我是一个 c# 的 n00b,已经使用 vba 有一段时间了。

我有这个代码:

OleDbCommand sqlcom = new OleDbCommand("UPDATE tblpack SET packeduser = 1 AND packeddate ='" + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + "' WHERE packid = " + packid, con);

我知道它没有参数化,这将是我的下一步,我现在真的只是在学习基础知识。

我的问题是没有日期部分,更新 sql 工作正常。

使用日期部分,没有错误,但 sql 最终不会触发。

我已停止执行非查询,并且 sql 看起来不错... 我在 Access 中的日期字段设置为空白,但我尝试过“一般日期”也没有运气。

有什么想法吗!?/

更新: 抱歉,你是 100% 正确的,即使是为了学习,我也不应该吝啬安全性。 我已经重写为参数化并且它正在工作。 我相信我在 SQL 中使用 AND 而不是 , 的问题(当时是凌晨 3 点)。 Datetime.now 实际上适用于 Access,而不必转换为字符串。我不知道为什么这会奏效..我已经阅读了很多关于需要转换的内容!

OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);

                        string strpacked = "UPDATE tblpack SET packeduser = 1, packeddate = ? WHERE packid = ?";

                        OleDbDataAdapter dataadapter = new OleDbDataAdapter();

                        OleDbCommand sqlcom = new OleDbCommand(strpacked, con);

                        sqlcom.Parameters.Add("?", OleDbType.Date, 5).Value = DateTime.Now;
                        sqlcom.Parameters.Add("?", OleDbType.Integer, 5).Value = packid;

                        dataadapter.SelectCommand = sqlcom;

                        con.Open();

                        sqlcom.ExecuteNonQuery();
                        row.Cells["clnpackeduser"].Value = "GA";
                        con.Close();

【问题讨论】:

  • 将值作为参数传入,而不是使用字符串参数修改 SQL 字符串。
  • 使用参数应该是your first step
  • “我知道它没有参数化......我现在真的只是在学习基础知识。” - 使用参数化查询基础之一。当您可以继续“做对”时,为什么还要浪费时间解决与“做错”相关的问题?

标签: c# sql ms-access


【解决方案1】:

MS Jet(MS Access 数据库引擎)日期格式为:#MM/DD/YYYY hh:mm:ss#。 因此,您必须像这样更改代码:

OleDbCommand sqlcom = new OleDbCommand("UPDATE tblpack SET packeduser = 1, packeddate =" + DateTime.Now.ToString("#MM/dd/yyyy HH:mm:ss#") + " WHERE packid = " + packid, con);

小心,我已经从示例中删除了'

在您的情况下,MS Jet 无法解析日期字符串并且日期为空白。

更新:

您必须在 SET 子句中使用 , 而不是 AND

【讨论】:

  • 请记住,/: 是日期和时间分隔符,而不是斜线或冒号,小时数必须为 24,并且日期序列应该是 ISO,因此:DateTime.Now.ToString("#yyyy'/'MM'/'dd HH':'mm':'ss#").
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
相关资源
最近更新 更多