使用访问数据库更新语句不起作用

时间:2013-04-09 16:26:17

标签: c# oledb

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字段类型是日期/时间,请大家帮忙。

雇用的是该计划: https://www.dropbox.com/s/hx4zduvul8mh2uy/8.4.zip

  Pictre of problem: http://img43.imageshack.us/img43/5189/errorbh.jpg

4 个答案:

答案 0 :(得分: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();
}

当然,存储在“基准”字段中的“日期”值应与参数@ p3中传递的日期完全相同。有时将时间值添加到您的日期

string date= DateTime.Now.ToString("d.M.yyyy 00:00:00", ......);

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

访问只能以这些方式存储日期/时间

  • 有效日期:-657,434(公元100年1月1日)至2,958,455(美国东部时间9999年12月31日)
  • 有效时间:.0(00:00:00)至.99999(23:59:59)

可以按以下方式格式化:

  • 存储值(双号)=默认格式(一般日期)=自定义格式
  • 36296.0 = 5/15/99 = 05/15/1999 12:00:00 AM

因此,您必须牢记Microsoft Access的限制;因为SQL确实以稍微不同的方式读取日期,并且可以稍微不同地存储它背景中最轻微的突破会对结果产生深远的影响。

最简单的方法是基于参数查询。这样你就不会连接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数据库中实现有效语法。 Steve发布了一个很好的例子,所以我不会发布代码示例。但希望这有助于您理解它们之间的区别。