这是我的代码:
这是一个名为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查询的参数传递方法,所以无法找到我遇到的问题
答案 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;
}
}
}