获取两个日期时间选择器选择的两天之间的记录,并在 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# 中用它们填充数据网格视图的主要内容,如果未能解决你的问题,请参考以下文章