获取两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据网格视图

Posted

技术标签:

【中文标题】获取两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据网格视图【英文标题】:Get records between two days which are selected by two datetimepickers and fill a datagridview with them in Visual Studio C# 【发布时间】:2011-12-18 05:12:37 【问题描述】:

这是我的代码:

这是在另一个名为 DBAccess 的类中

public DataSet getRecords(DateTime dtpFloor,DateTime dtpCeiling)


   if (conn.State.ToString() == "Closed")
            
                conn.Open();
            

   SqlCommand newCmd = conn.CreateCommand();

   newCmd.Connection = conn;

   newCmd.CommandType = CommandType.Text;

   newCmd.CommandText = " SELECT * FROM dbo.ClientInvoice  WHERE invDate BETWEEN  '" + dtpCeiling + "' AND  '" + dtpFloor + "'";

            SqlDataAdapter da = new SqlDataAdapter(newCmd);

            DataSet dsIncome = new DataSet();

            da.Fill(dsIncome, "Client");

             conn.Close();

            return dsIncome;


下面的编码是在ProfitLos表单类中

public void btnClickFillGrid()


    DataSet dsIncome =     dba.getRecords(dtpFloor.Value.ToString(),    dtpCeiling.Value.ToString()); //dba is an object of DBAccess class

    dgvproIncome.DataSource = dsIncome.Tables["Client"].DefaultView;


btnClickFillGrid() 将在按钮点击事件中调用。

在数据库中——invdate datetime;(invDate是变量名,它是datetime格式)

我像这样编辑了我的代码

public DataSet getRecords(DateTime dtpFloor,DateTime dtpCeiling)
        
            using (SqlConnection conn = new SqlConnection("Data Source=KOSHITHA-PC;Initial Catalog=ITP;Integrated Security=True"))
            
                 conn.Open();
                 using (SqlCommand command = conn.CreateCommand())
                 
                     string sql = "SELECT * FROM dbo.ClientInvoice WHERE invDate BETWEEN" + "@from AND @to"; 
            command.CommandText = sql;
            command.Parameters.AddWithValue("@from",dtpFloor);
            command.Parameters.AddWithValue("@to", dtpCeiling);

            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet dataSetClient = new DataSet();
            da.Fill(dataSetClient, "Client");
            return dataSetClient;
                
            
        


DataSet dataSetClient = dba.getRecords(dtpFloor.Value, dtpCeiling.Value);
                dgvproIncome.DataSource = dataSetClient.Tables["Client"].DefaultView;

现在我在 "da.Fill(dataSetClient, "Client");" 中遇到异常线说 sqlException 未处理 在预期条件的上下文中指定的非布尔类型表达式,靠近“BETWEEN@from”。

我不熟悉sql查询的参数传递方法,所以找不到我遇到的问题

【问题讨论】:

这段代码不工作(显然)并显示异常.. 实际上,该代码甚至无法编译 - 请参阅我的答案。 那么问题出在哪里? 然后提供异常信息...另外一点:您使用不带参数的 SQL 是非常危险的,因为它容易发生 SQL 注入,这是一个严重的安全问题! 【参考方案1】:

看看这个电话:

dba.getRecords(dtpFloor.Value.ToString(), dtpCeiling.Value.ToString());

这显然是传递 strings 作为参数。现在看看你的方法声明:

公共数据集 getRecords(DateTime dtpFloor,DateTime dtpCeiling)

这些参数的类型是DateTime,而不是字符串。所以首先要解决的就是调用:

dba.getRecords(dtpFloor.Value, dtpCeiling.Value);

现在下一个的问题是您将值直接嵌入到 SQL 中。不要那样做。 永远不要那样做。在某些情况下,它可能会导致 SQL 注入攻击,而在其他情况下,它会导致数据转换问题(如您所见)。改用参数化 SQL - 哦,使用连接池而不是尝试在多个地方使用单个连接:

public DataSet GetRecords(DateTime dtpFloor,DateTime dtpCeiling)

    using (SqlConnection conn = new SqlConnection(connectionString))
    
        conn.Open();
        using (SqlCommand command = conn.CreateCommand())
        
            string sql = "SELECT * FROM dbo.ClientInvoice WHERE invDate BETWEEN "
                       + "@from AND @to";
            command.CommandText = sql;
            command.Parameters.AddWithValue("@from", dtpFloor");
            command.Parameters.AddWithValue("@to", dtpCeiling");

            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet dataSet = new DataSet();
            da.Fill(dataSet, "Client");
            return dataSet;
        
    

【讨论】:

这个编码有一个 sql 异常..我不知道为什么...我按照你上面提到的那样编辑了我的编码.. @koshi18:您需要阅读异常。我刚刚错过了“BETWEEN”和“@from”之间的空格 - 请仔细查看异常。

以上是关于获取两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据网格视图的主要内容,如果未能解决你的问题,请参考以下文章

Layui日期选择器+两个日期之间天数计算

在codeigniter中获取两个日期范围之间的数据

如何使用两个日期选择器从我的数据库中获取数据。代码点火器

SSAS 获取两个日期之间的活动记录数

获取不同记录的总和并在两个日期范围之间进行比较

通过日期选择器日历从选定日期获取数据