C# C潜在的日期格式问题-System.Data.SqlClient.SqlException:“x附近的语法不正确。”

C# C潜在的日期格式问题-System.Data.SqlClient.SqlException:“x附近的语法不正确。”,c#,sql,C#,Sql,应用程序的目的是从Sql数据库选择数据到windows窗体数据网格。我实现了日期时间选择器的自定义格式,但仍然收到此错误。下面是应用程序的属性和下面的代码 这个查询在SSMS中成功执行,经过几个小时的调试,我遇到了一堵巨大的墙 这里有两个不同的问题 一种是将DateTimePicker的引用传递到字符串解释中,导致字符串包含从DateTimePicker.ToString返回的值,而不是所需的值 第二个问题是,首先不应该将日期作为字符串传递给数据库。相反,应该使用SQL参数传递DateTime的

应用程序的目的是从Sql数据库选择数据到windows窗体数据网格。我实现了日期时间选择器的自定义格式,但仍然收到此错误。下面是应用程序的属性和下面的代码


这个查询在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) }