获取由两个datetimepickers选择的两天之间的记录,并在Visual Studio C中用它们填充datagridview#

时间:2011-10-30 13:42:32

标签: c# sql datagridview dataset datetimepicker

这是我的代码:

这是一个名为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是变量名称及其日期时间格式)

我编辑了这样的编码

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查询的参数传递方法,所以无法找到我遇到的问题

1 个答案:

答案 0 :(得分:4)

看看这个电话:

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

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

public DataSet 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;
        }
    }
}