C# C潜在的日期格式问题-System.Data.SqlClient.SqlException:“x附近的语法不正确。”
应用程序的目的是从Sql数据库选择数据到windows窗体数据网格。我实现了日期时间选择器的自定义格式,但仍然收到此错误。下面是应用程序的属性和下面的代码C# C潜在的日期格式问题-System.Data.SqlClient.SqlException:“x附近的语法不正确。”,c#,sql,C#,Sql,应用程序的目的是从Sql数据库选择数据到windows窗体数据网格。我实现了日期时间选择器的自定义格式,但仍然收到此错误。下面是应用程序的属性和下面的代码 这个查询在SSMS中成功执行,经过几个小时的调试,我遇到了一堵巨大的墙 这里有两个不同的问题 一种是将DateTimePicker的引用传递到字符串解释中,导致字符串包含从DateTimePicker.ToString返回的值,而不是所需的值 第二个问题是,首先不应该将日期作为字符串传递给数据库。相反,应该使用SQL参数传递DateTime的
这个查询在SSMS中成功执行,经过几个小时的调试,我遇到了一堵巨大的墙 这里有两个不同的问题 一种是将DateTimePicker的引用传递到字符串解释中,导致字符串包含从DateTimePicker.ToString返回的值,而不是所需的值 第二个问题是,首先不应该将日期作为字符串传递给数据库。相反,应该使用SQL参数传递DateTime的实例。我不确定你使用的是什么ORM,所以我不能给你一个代码示例 此外,正如fubo在对问题的评论中所写,Where关键字前缺少空格
作为第二个参数。使用SQL变量时,不要将日期字符串化。z.Dept_ID=d.Dept_ID上缺少空格的可能重复项,其中x.CreateDate和'System.Windows.Forms.DateTimePicker,Value:7/18/2018 2:44:00 AM'不是有效的SQL日期。您还可以删除if测试。通过调用IDbConnection db=new SqlConnection,您将收到除关闭连接以外的其他内容的可能性。。。是0。看起来很整洁,但你是对的,在OP澄清之前,不可能给出具体的更正。他们还需要修复fubo在评论中指出的缺少空间的问题。@Damien_,我也这么认为,但我已经了解到,假设关于问题的事情通常会导致错误的答案。以前我甚至没有看到那个空白,我也会把它编辑到我的答案中,谢谢!。我用的是整洁的。以下是我声明的属性,公共类{public string ItemName{get;set;}公共decimal ItemNum{get;set;}公共日期时间CreateDate{get;set;}}在这种情况下,使用Marc的答案。在同一列上使用它们并不重要,它们是不同的参数。。。我个人喜欢存储过程。我一直在使用它们——但对于这样一个查询来说,这不会有太大的区别。如果你想赌它是整洁的,就赌它是WinForms.:-控件属性的屏幕截图看起来很匹配,其他事件处理程序也建议使用WinForms。谢谢Marc!这解决了我遇到的问题
private void startTimePicker1_MouseDown(object sender, MouseEventArgs e)
{
startTimePicker1.CustomFormat = "yyyy-MM-dd hh:mm:ss";
startTimePicker1.Format = DateTimePickerFormat.Custom;
}
private void endTimePicker1_MouseDown(object sender, MouseEventArgs e)
{
endTimePicker1.CustomFormat = "yyyy-MM-dd hh:mm:ss";
endTimePicker1.Format = DateTimePickerFormat.Custom;
}
private void loadBtn_Click(object sender, EventArgs e)
{
startTimePicker1.CustomFormat = "yyyy-MM-dd hh:mm:ss";
startTimePicker1.Format = DateTimePickerFormat.Custom;
endTimePicker1.CustomFormat = "yyyy-MM-dd hh:mm:ss";
endTimePicker1.Format = DateTimePickerFormat.Custom;
using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["DBName"].ConnectionString))
{
if(db.State==ConnectionState.Closed)
{
db.Open();
string query = "select z.ItemName, x.Quantity, x.CreateDate" +
" from Invoice_Itemized x inner join Inventory z on x.ItemNum = z.ItemNum inner join Departments d on z.Dept_ID = d.Dept_ID" +
$"where x.CreateDate BETWEEN '{ startTimePicker1 }' and '{ endTimePicker1 }' and d.SubType = 'TYPE'";
liquorBindingSource.DataSource = db.Query<Liquor>(query, commandType: CommandType.Text);
}
}
select z.ItemName, x.Quantity, x.CreateDate from Invoice_Itemized x inner join Inventory z on x.ItemNum = z.ItemNum inner join Departments d on z.Dept_ID = d.Dept_IDwhere x.CreateDate BETWEEN 'System.Windows.Forms.DateTimePicker, Value: 7/18/2018 2:44:00 AM' and 'System.Windows.Forms.DateTimePicker, Value: 7/18/2018 4:19:01 AM' and d.SubType = 'TYPE'
string query = "select z.ItemName, x.Quantity, x.CreateDate" +
" from Invoice_Itemized x inner join Inventory z on x.ItemNum = z.ItemNum inner join Departments d on z.Dept_ID = d.Dept_ID" +
$"where x.CreateDate BETWEEN '{ startTimePicker1 }' and '{ endTimePicker1 }' and d.SubType = 'TYPE'";
liquorBindingSource.DataSource = db.Query<Liquor>(query, commandType: CommandType.Text);
liquorBindingSource.DataSource = db.Query<Liquor>(@"
select z.ItemName, x.Quantity, x.CreateDate
from Invoice_Itemized x
inner join Inventory z on x.ItemNum = z.ItemNum
inner join Departments d on z.Dept_ID = d.Dept_ID
where x.CreateDate BETWEEN @start and @end and d.SubType = 'TYPE'",
new { start = startTimePicker1.Value, end = endTimePicker1.Value });
new { start = DateTime.Parse(startTimePicker1.Value),
end = DateTime.Parse(endTimePicker1.Value) }