问题描述
直接上代码,别一个贴子上有详细说明http://topic.csdn.net/u/20120116/14/4cbcea4c-4b2a-47dd-989c-bb5ebf57ad2a.html?seed=525050463&r=77321509#r_77321509publicDataSetGetRegInfoGameList(DateTimeBeginTime,DateTimeEndTime){//#region用字符串拼接测试结果,这个正常//StringBuilderstrSql=newStringBuilder();//strSql.Append(@"//selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],//sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum(RegInfo.ReturnMoney)as[ReturnMoney]//fromRegInfo");//strSql.Append("wherePostTimebetween'"+BeginTime.ToString()+"'and'"+EndTime.ToString()+"'");//returnDbHelperSQL.Query(strSql.ToString());//#endregion#region用SqlParameter测试测试结果,这个报超时错误,但放在查询分析器里不报超时StringBuilderstrSql=newStringBuilder();strSql.Append(@"selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum(RegInfo.ReturnMoney)as[ReturnMoney]fromRegInfo");strSql.Append("wherePostTimebetween@BeginTimeand@EndTime");SqlParameter[]parameters={newSqlParameter("@BeginTime",SqlDbType.DateTime),newSqlParameter("@EndTime",SqlDbType.DateTime)};parameters[0].Value=BeginTime;parameters[1].Value=EndTime;returnDbHelperSQL.Query(strSql.ToString(),parameters);#endregion}
解决方案
解决方案二:
DbHelperSQL这个类是如何写的?从代码上看,这2种写法完全可行,都不会有问题。你也可以监视SQLSERVER的SQL语句执行情况,看看最终执行的是什么语句。
解决方案三:
引用1楼qldsrx的回复:
DbHelperSQL这个类是如何写的?从代码上看,这2种写法完全可行,都不会有问题。你也可以监视SQLSERVER的SQL语句执行情况,看看最终执行的是什么语句。
监视了Sqlserver的执行情况,语句都是正常的,在查询分析器里两种执行都可以。但第二种通过c#调用的时候报超时。
解决方案四:
直接拼接字符串就是硬编码肯定效率高.第二个程序端会进行数据有效性的验证.直接拼接就相当于直接在数据库执行了.
解决方案五:
我估计可能是因为转换DateTime时引起的,但我传进去的类型也是DateTime类型的值啊。
解决方案六:
引用4楼x2670316290的回复:
我估计可能是因为转换DateTime时引起的,但我传进去的类型也是DateTime类型的值啊。
前面的程序没问题,你用sqlserverprofiler跟一下,把两个执行的最终的sql贴出来
解决方案七:
其实不用贴也能看出问题了第一种方法,也就是直接拼接的最终执行的是between'起始时间'and'结束时间'很显然已经是字符类型了,不是datetime类型第二个执行的结果是...,N'@BeginTimedatetime,@EndTimedatetime',@BeginTime='1996-01-0100:00:00',@EndTime='2010-01-0100:00:00'是日期格式了要确定是不是这一个问题可以在查询分析器里面写两个sql语句就知道了declare@EndTimevarchar(20),@BeginTimevarchar(20)set@BeginTime=''set@EndTime=''sql语句。。。。然后declare@EndTimedatetime,@BeginTimedatetimeset@BeginTime=''set@EndTime=''sql语句。。。。。你比较下这两个有产生的效果是不是和你写的两个程序的一样,或者看执行计划就知道是什么问题了
解决方案八:
监听出来的代码是这样的execsp_executesqlN'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum(RegInfo.ReturnMoney)as[ReturnMoney]fromRegInfogroupbyRegInfo.GameKeyorderbyRegInfo.GameKey',N'@BeginTimedatetime,@EndTimedatetime',@BeginTime='2012-01-0100:00:00',@EndTime='2012-01-1600:00:00'
解决方案九:
引用7楼x2670316290的回复:
监听出来的代码是这样的execsp_executesqlN'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum……
你这个是用参数的,不用参数的呢?
解决方案十:
引用7楼x2670316290的回复:
监听出来的代码是这样的execsp_executesqlN'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum……
这个在查询分析器里执行是正常的。
解决方案十一:
上面这个复制错代码了,这个是测试不加where的时候的跟踪
解决方案十二:
where条件呢?
解决方案十三:
引用8楼jiangshun的回复:
引用7楼x2670316290的回复:监听出来的代码是这样的execsp_executesqlN'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMon……
不用参数的是正常的,不报错误超时。如果是拼接的时候报超时,我直接就改成用参数的了。现在是反起来了。
解决方案十四:
declare@BeginTimevarchar(20),@EndTimevarchar(20)set@BeginTime='2012-01-0100:00:00'set@EndTime='2012-01-1600:00:00'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum(RegInfo.ReturnMoney)as[ReturnMoney]fromRegInfowherePostTimebetween@BeginTimeand@EndTimegroupbyRegInfo.GameKeyorderbyRegInfo.GameKeydeclare@BeginTimedatetime,@EndTimedatetimeset@BeginTime='2012-01-0100:00:00'set@EndTime='2012-01-1600:00:00'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum(RegInfo.ReturnMoney)as[ReturnMoney]fromRegInfowherePostTimebetween@BeginTimeand@EndTimegroupbyRegInfo.GameKeyorderbyRegInfo.GameKey
楼主你看下这两个查询,结果是不是一个快一个慢?
解决方案十五:
引用11楼jiangshun的回复:
where条件呢?
execsp_executesqlN'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)as[TCount],sum(RegInfo.OkMoney)as[TMoney],sum(RegInfo.ClearingMoney)as[ClearingMoney],sum(RegInfo.ReturnMoney)as[ReturnMoney]fromRegInfowhereRegInfo.PostTimebetween@BeginTimeand@EndTimegroupbyRegInfo.GameKeyorderbyRegInfo.GameKey',N'@BeginTimedatetime,@EndTimedatetime',@BeginTime='2012-01-0100:00:00',@EndTime='2012-01-1600:00:00'
解决方案:
能把你DBHelper中DbHelperSQL.Query(stringsql,SqlParameters[]parameters)的方法贴出来看一下么?
解决方案:
引用13楼jiangshun的回复:
SQLcodedeclare@BeginTimevarchar(20),@EndTimevarchar(20)set@BeginTime='2012-01-0100:00:00'set@EndTime='2012-01-1600:00:00'selectGameKeyas[GameKey],max(GameName)as[GameName],COUNT(1)……
在查询分析器里执行时间差不多,都显示是2秒,因为这个表有30多万条数据。
解决方案:
引用15楼hualilihua的回复:
能把你DBHelper中DbHelperSQL.Query(stringsql,SqlParameters[]parameters)的方法贴出来看一下么?
///<summary>///执行查询语句,返回DataSet///</summary>///<paramname="SQLString">查询语句</param>///<returns>DataSet</returns>publicstaticDataSetQuery(stringSQLString,paramsSqlParameter[]cmdParms){using(SqlConnectionconnection=newSqlConnection(connectionString)){SqlCommandcmd=newSqlCommand();PrepareCommand(cmd,connection,null,SQLString,cmdParms);using(SqlDataAdapterda=newSqlDataAdapter(cmd)){DataSetds=newDataSet();try{da.Fill(ds,"ds");cmd.Parameters.Clear();}catch(System.Data.SqlClient.SqlExceptionex){thrownewException(ex.Message);}returnds;}}}privatestaticvoidPrepareCommand(SqlCommandcmd,SqlConnectionconn,SqlTransactiontrans,stringcmdText,SqlParameter[]cmdParms){if(conn.State!=ConnectionState.Open)conn.Open();cmd.Connection=conn;cmd.CommandText=cmdText;if(trans!=null)cmd.Transaction=trans;cmd.CommandType=CommandType.Text;//cmdType;if(cmdParms!=null){foreach(SqlParameterparameterincmdParms){if((parameter.Direction==ParameterDirection.InputOutput||parameter.Direction==ParameterDirection.Input)&&(parameter.Value==null)){parameter.Value=DBNull.Value;}cmd.Parameters.Add(parameter);}}}
解决方案:
引用15楼hualilihua的回复:
能把你DBHelper中DbHelperSQL.Query(stringsql,SqlParameters[]parameters)的方法贴出来看一下么?
这个是用的现成的代码,这个应该没有问题。我在想会不会是外部环境引起的?
解决方案:
引用18楼x2670316290的回复:
引用15楼hualilihua的回复:能把你DBHelper中DbHelperSQL.Query(stringsql,SqlParameters[]parameters)的方法贴出来看一下么?这个是用的现成的代码,这个应该没有问题。我在想会不会是外部环境引起的?
如果类型解释不了,还真找不到合适的解释了
解决方案:
没问题啊我测试了下不过就几条数据而已
解决方案:
楼主你看一下这个SqlParameter的作用就知道了他的用处不在效率上啊。。在安全和数据检测上我是学java的估计你这个也就是在发现原来直接封装SQL字符串在某些情况下可以被注入所以就写了个封装类
解决方案:
检查2种查询给的条件是否一致,查询模拟情况是否一致。应该是其它地方造成的问题,代码本身没语法错误,也不会造成任何超时的可能性。
解决方案:
你先查询前10行看看,加个top10,看看是否超时。
解决方案:
SqlParameter,为了是防止SQL注入,不会提升效率,反而降低一点点效率的。
解决方案:
呵呵参数性我者得永生字符串传入在转换成时间知道为什么吗你的索引出问题了急的话就这样干,破坏索引查询,有时索引就是个大杀器双刃刀可伤人可伤己不急找出涉及索引删除重建
解决方案:
呵呵参数性我者得永生字符串传入在转换成时间知道为什么吗你的索引出问题了急的话就这样干,破坏索引查询,有时索引就是个大杀器双刃刀可伤人可伤己不急找出涉及索引删除重建