我的C#中的sql有问题。所以让我这么简单 这是我的代码:
OleDbConnection mydb;
OleDbCommand cmd;
OleDbCommandBuilder build;
OleDbDataAdapter adapter;
DataTable dt;
DataSet ds;
BindingSource bs;
String query;
public AnnualRateHistory()
{
InitializeComponent();
query = @"SELECT * FROM _Annual_Rate WHERE Date = 02/11/2014";
build = new OleDbCommandBuilder(adapter);
bs = new BindingSource();
adapter = new OleDbDataAdapter(query, mydb);
dt = new DataTable();
adapter.Fill(dt);
}
好的我删除了很多代码以使其变得简单,但基本上我的问题必须在sql。我删除的代码是mydb.Open()
并关闭了连接。
如果我使用该sql语句,则不会显示任何内容,并且它会精确地设置为数据库中的某个数据。如果我将'='
替换为'>'
,那么一切都会显示出来;如果我使用'<'
则没有任何显示。我知道日期应该是这样输入的:'02/11/2014'
但由于某种原因,我得到的数据类型不匹配,而且在我的其他表单中,它的工作时间没有'
。
我无法找到SQL的任何错误。请告诉我我做错了什么。
这是表模式定义:
以下是表格中的数据:
答案 0 :(得分:2)
两个问题 -
您的约会日期并不正确。这通常是最好的 使用ISO8601日期格式(即yyyy-MM-ddTHH:mm:ss)
您要求SQL服务器返回日期所在的行 确实 02/11/2014,这意味着当天的午夜。如果你想要那天的所有记录,那么它应该是:
SELECT * FROM _Annual_Rate WHERE Date_Of_Rate > '2014-11-02' and Date_Of_Rate < '2014-11-03'
修改强>
在看到您对问题的更新后,第2部分不再真正适用,因为看起来您只在Date_Of_Rate日期时间字段中存储日期。
HOWEVER 第1部分仍然适用。在与SQL DB交谈时,日期应始终以ISO8601格式编写。
2/11/2014
意味着11月2日在英国,但在美国意味着2月11日。许多国家/地区使用不同的日期格式,您无法始终保证服务器的设置方式,即使在您自己的国家/地区也是如此。这导致了我们(我工作的公司)过去的主要问题。在切换到ISO8601日期之前,我们指定了要写的日期:
'dd-MMM-yyyy HH:mm:ss' (11-feb-2014 14:19:56)
直到一家法国公司为法国公司提供了一台带有SQL服务器设置的机器,这已经有一段时间了。 2月是Fév法语,因此所有与该机器一起出现的软件遭到轰炸。从那时起,我们吸取了教训。始终使用ISO8601日期格式。他们是获得完全不明确日期的唯一途径。
答案 1 :(得分:1)
查看架构时,问题似乎是您只是使用了错误的列名称 - 您的列名为Date_Of_Rate
,但您要对名为Date
的列进行过滤。
此外,Date
是一个关键字,可能是您收到数据不匹配错误的原因。
所以只需将其改为此即可解决问题:
query = @"SELECT * FROM _Annual_Rate WHERE Date_Of_Rate = '02/11/2014'";
注意:语法适用于MySQL / SQL Server,因为问题最初被错误标记。
答案 2 :(得分:1)
我在这里看到了SQL的两个问题
Date
时,您会在Date_Of_Rate
上进行过滤。如果这样做,您的查询应该起作用:
query = @"SELECT * FROM _Annual_Rate WHERE Date_Of_Rate = #02/11/2014#";