【发布时间】:2013-09-04 10:05:14
【问题描述】:
我已经问过一个问题"Timeout expired, optimize query" 有一段时间来响应我的查询的 sql server :
using (SqlConnection sqlConn = new SqlConnection(SqlServerMasterConnection))
{
if (sqlConn.State != ConnectionState.Open) sqlConn.Open();
using (SqlCommand cmd = new SqlCommand("select DT.* from DetailTable DT, BillTable BT, PackageTable PT
where PT.Id= BT.IdPackage and DT.IdBill= BT.Id
and PT.CodeCompany = @codeCompany and PT.Date between @begin and @end",
sqlConn))
{
cmd.Parameters.Add(new SqlParameter(@begin , beginDate));
cmd.Parameters.Add(new SqlParameter("@end", endDate));
cmd.Parameters.Add(new SqlParameter("@codeCompany", codeCompany));
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
//work todo
}
}
}
}
20,000 条记录需要 28 秒,
我写这篇文章的奇怪行为
using (SqlConnection sqlConn = new SqlConnection(SqlServerMasterConnection))
{
if (sqlConn.State != ConnectionState.Open) sqlConn.Open();
using (SqlCommand cmd = new SqlCommand("select DT.* from DetailTable DT, BillTable BT, PackageTable PT where PT.Id= BT.IdPackage and DT.IdBill= BT.Id
and PT.CodeCompany = @codeCompany and PT.Date between '" + beginDate + "' and '" + endDate + "'"
,sqlConn))
{
cmd.Parameters.Add(new SqlParameter("@codeCompany", codeCompany));
using (DbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
//work todo
}
}
}
}
我用没有SqlParameter的发送值更改了@date,我在0秒内得到了结果!!
对此结果的任何建议
PS:
- 我们将数据库中的日期保存为字符串 YYYYMMDD(PT.Date 是一个 varchar(8))
- beginDate 和 enddate 是类似 (20130904) 的字符串
【问题讨论】:
-
beginDate的类型是什么? -
@BrankoDimitrijevic,begindate 和 enddate 是字符串值 YYYYMMDD
-
在
cmd.Parameters.Add(new SqlParameter(@begin , beginDate));这一行上,@begin 周围缺少引号,这是错字吗? -
@Tanner,数据库中的值类型是一个字符串,我发送一个字符串值,然后我必须在sqlParametre中添加一个引号!
-
在您的第一个代码示例中,您有:
@begin应该是"@begin",并在参数名称周围加上引号,只是检查这是否是一个错字?
标签: c# sql-server