gpt4 book ai didi

c# - 获取由两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据 GridView

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:19 24 4
gpt4 key购买 nike

这是我的代码:

这是在一个名为 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窗体类中的Coding

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在预期条件的上下文中指定的非 bool 类型的表达式,靠近“BETWEEN@from”。

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

最佳答案

看看这个调用:

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

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

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

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

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

现在 下一个 问题是您将值直接嵌入到 SQL 中。不要那样做。 永远不要那样做。在某些情况下,它会导致 SQL 注入(inject)攻击,而在其他情况下,它会导致数据转换问题(如您所见)。改用参数化 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;
}
}
}

关于c# - 获取由两个日期时间选择器选择的两天之间的记录,并在 Visual Studio C# 中用它们填充数据 GridView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7945245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com