1
string date=
DateTime.Now.ToString("d.M.yyyy",System.Globalization.DateTimeFormatInfo.InvariantInfo);

String MyString = @"UPDATE cas SET Odhod= '" + label1.Text + "' 
WHERE sifra = " + textBox1.Text + " and Datum = "+date+"";

当我在没有 Datum 的情况下进行此更新时,它可以工作,但使用 Datum 则不起作用。我已连接到 accesss 数据库,表中的基准字段类型是日期/时间,请大家帮忙。

雇用是程序: https ://www.dropbox.com/s/hx4zduvul8mh2uy/8.4.zip

问题图片: http ://img43.imageshack.us/img43/5189/errorbh.jpg

4

4 回答 4

2

像往常一样,使用字符串连接会带来很多麻烦。
(Sql注入,解析问题)

只需使用参数化查询

string MyString = @"UPDATE cas SET Odhod= ? WHERE sifra = ? and Datum = ?"; 


using(OleDbConnection cn = new OleDbConnection(connectionstring))
using(OleDbCommand cmd = new OleDbCommand(MyString, cn)
{
    cn.Open();
    cmd.Parameters.AddWithValue("@p1", label1.Text);
    cmd.Parameters.AddWithValue("@p2", textbox.Text);
    cmd.Parameters.AddWithValue("@p3", Convert.ToDate(date));
    cmd.ExecuteNonQuery();
}

当然,存储在 Datum 字段中的 Date 值应该与参数@p3 中传递的日期完全相同。有时最好将时间值添加到您的日期

string date= DateTime.Now.ToString("d.M.yyyy 00:00:00", ......);
于 2013-04-09T16:31:03.993 回答
0

您的 Datum 列中的值可能与您的日期值不匹配。您的基准列的值是多少?是否有相关的时间(例如:下午 1:32)?

此更新声明还有一些其他问题。您应该使用 ORM 或参数化查询以避免 SQL 注入。

于 2013-04-09T16:29:01.013 回答
0

您可以使用参数方法。在这种情况下,您将能够在运行查询之前定义字段类型。

于 2013-04-09T16:35:41.090 回答
0

原因是 Microsoft Access 实际读取DateTime特定方式的方式。当您使用串联时,它可能会引入问题。

Access只能以下列方式存储日期/时间

  • 有效日期:-657, 434(公元 100 年 1 月 1 日)至 2,958,465(公元 9999 年 12 月 31 日)
  • 有效时间:0.0 (00:00:00) 至 0.99999 (23:59:59)

它可以通过以下方式格式化:

  • 存储值(双数)= 默认格式(常规日期)= 自定义格式
  • 36296.0 = 5/15/99 = 05/15/1999 上午 12:00:00

因此,您必须牢记 Microsoft Access 的局限性;因为 SQL 读取日期的方式略有不同,并且存储它们的方式也略有不同。上下文中最轻微的中断都会对结果产生深远的影响。

最简单的方法是Query based on Parameters。这样您就不会连接 Access 的无效语法。这将缓解一些问题。

本机访问利用以下功能:

将关联的日期添加到时间比较中:

var1 = #1/1/99 2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? var2 = #1/1/99 2:11:00 PM#

Convert the time values to string data types before you compare them:

var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? CStr(var2) = CStr(#2:11:00 PM#)

使用 DateDiff() 函数比较精确的单位,例如秒:

var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? DateDiff("s", var2, #2:11:00 PM#) = 0 

因此,本机访问查询看起来像这样:

UPDATE [dbo].[Customer]
SET [dbo].[Customer].[InvoiceDate] = #1/1/99 2:11:00 PM#;

如您所见,它尝试像 SQL 一样工作,但它不是 SQL。因此,通过创建基于参数的查询,您可以确保在 Access Database 中实现了有效的语法。史蒂夫发布了一个很好的例子,所以我不会发布代码示例。但希望这可以帮助您了解它们之间的区别。

于 2013-04-09T16:56:06.380 回答