我有以下命令,在使用OleDb连接到Access 2010数据库的C#WinForms应用程序中使用:
oc_payslips = new OleDbCommand("SELECT <fields> FROM Payslips WHERE LicenseID = \"" + IDs[cb_Employees.SelectedIndex] + "\" AND DateOfPayment >= \"" + startDate + "\" AND DateOfPayment <= \"" + endDate + "\"", DB_Connection.con);
这不起作用。我最好的猜测是我无法比较使用SQL的两个字符串。
这个想法是获取两个日期之间的日期记录,所有日期都具有“dd / MM / yyyy”格式。日期作为字符串存储在数据库中。
我在互联网上找不到答案,所以这是我的问题:
有没有办法比较两个字符串使用SQL并确定哪个字母顺序排在第一位?
P.S。:我知道我可以先获取所有日期,比较它们,然后搜索具有正确日期的ID,但我的问题与在单个SQL查询中执行此操作有关。
答案 0 :(得分:2)
你有几个问题
您应该使用参数化命令而不是使用字符串连接。
您在SQL中使用双引号而不是单引号作为字符串分隔符。
您正在将日期比较为字符串。如果类型为Date/Time
的表字段,则必须使用日期litterals(如果您坚持使用字符串连接)。如果日期存储为格式为“dd / MM / yyyy”的字符串,则比较将无效。
与LicenseID
相同。如果是数字类型,则比较LicenseID = 123
而不是LicenseID = "123"
。
如果您使用参数化查询,则最后三个问题会自动消失。
请参阅MSDN上的How to: Execute a Parameterized Query。
oc_payslips = new OleDbCommand(
@"SELECT <fields> FROM Payslips
WHERE LicenseID = @lid AND
DateOfPayment >= @start AND DateOfPayment <= @end", DB_Connection.con);
oc_payslips.Parameters.AddWithValue("@lid", IDs[cb_Employees.SelectedIndex]);
oc_payslips.Parameters.AddWithValue("@start", startDate);
oc_payslips.Parameters.AddWithValue("@end", endDate);
...
将日期作为字符串存储在数据库中是个坏主意。如果你想比较存储为字符串的日期,只有当字符串被格式化为“yyyy / MM / dd”时才会起作用,正如Vlad Schnakovszki在他的评论中指出的那样。但是,您可以尝试使用
"... CDate(DateOfPayment) BETWEEN @start AND @end"
并确保传递DateTime
类型的参数。
答案 1 :(得分:0)
http://www.tutorialspoint.com/sql/sql-string-functions.htm#function_strcmp
afaik如果它返回-1而不是第一个字符串将在第二个字符串之前使用英文字母