SqlParameter居然不如字符串拼接效率高,很怪的问题。

问题描述

直接上代码,别一个贴子上有详细说明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注入,不会提升效率,反而降低一点点效率的。
解决方案:
呵呵参数性我者得永生字符串传入在转换成时间知道为什么吗你的索引出问题了急的话就这样干,破坏索引查询,有时索引就是个大杀器双刃刀可伤人可伤己不急找出涉及索引删除重建
解决方案:
呵呵参数性我者得永生字符串传入在转换成时间知道为什么吗你的索引出问题了急的话就这样干,破坏索引查询,有时索引就是个大杀器双刃刀可伤人可伤己不急找出涉及索引删除重建

时间: 2024-11-02 10:22:30

SqlParameter居然不如字符串拼接效率高,很怪的问题。的相关文章

Java字符串拼接效率分析及最佳实践

本文来源于问题 Java字符串连接最佳实践? java连接字符串有多种方式,比如+操作符,StringBuilder.append方法,这些方法各有什么优劣(可以适当说明各种方式的实现细节)? 按照高效的原则,那么java中字符串连接的最佳实践是什么? 有关字符串处理,都有哪些其他的最佳实践? 废话不多说,直接开始, 环境如下: JDK版本: 1.8.0_65 CPU: i7 4790 内存: 16G 直接使用+拼接 看下面的代码: @Test      public void test() {

javascript中字符串拼接详解_javascript技巧

最近在研究<javascript高级程序设计>中,有一段关于字符串特点的描述,原文大概如下:ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就不能改变.要改变某个变量的保存的的字符串,首先要销毁原来的字符串,然后再用另外一个包含新值的字符串填充该变量,例如: 复制代码 代码如下: var lang = "Java"; lang = lang + "Script";  实现这个操作的过程如下:首先创建一个能容纳10个字符的新字符

&amp;#106avascript极速狂飙:组合拼接字符串的效率

字符串     在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出.比如写脚本控件时控制整个控件的外观的HTML标签输出,比如AJAX里得到服务器端的回传值后动态分析创建HTML标签时,不过这里我就不讨论拼接字符串的具体应用了,我只是想在这里讨论一下拼接的效率.     字符串的拼接在我们写代码的时候都是用"+="这个运算符,s += String; 这是我们最为熟知的写法,不知道大家有没有注意过没有,在组合的字符串容量有几十K甚至几百K的时候,脚本执行起来很慢,CP

JavaScript极速狂飙:组合拼接字符串的效率

javascript|字符串     在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出.比如写脚本控件时控制整个控件的外观的HTML标签输出,比如AJAX里得到服务器端的回传值后动态分析创建HTML标签时,不过这里我就不讨论拼接字符串的具体应用了,我只是想在这里讨论一下拼接的效率.    字符串的拼接在我们写代码的时候都是用"+="这个运算符,s += String; 这是我们最为熟知的写法,不知道大家有没有注意过没有,在组合的字符串容量有几十K甚至几百K的时候,脚

JavaScript组合拼接字符串的效率对比测试

 在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出.比如写脚本控件时控制整个控件的外观的HTML标签输出,比如AJAX里得到服务器端的回传值后动态分析创建HTML标签时,不过这里我就不讨论拼接字符串的具体应用了,我只是想在这里讨论一下拼接的效率. 字符串的拼接在我们写代码的时候都是用"+="这个运算符,s += String; 这是我们最为熟知的写法,不知道大家有没有注意过没有,在组合的字符串容量有几十K甚至几百K的时候,脚本执行起来很慢,CPU使用率狂高,例如:

JavaScript组合拼接字符串的效率对比测试_javascript技巧

在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出.比如写脚本控件时控制整个控件的外观的HTML标签输出,比如AJAX里得到服务器端的回传值后动态分析创建HTML标签时,不过这里我就不讨论拼接字符串的具体应用了,我只是想在这里讨论一下拼接的效率. 字符串的拼接在我们写代码的时候都是用"+="这个运算符,s += String; 这是我们最为熟知的写法,不知道大家有没有注意过没有,在组合的字符串容量有几十K甚至几百K的时候,脚本执行起来很慢,CPU使用率狂高,例如: 复

一条很复杂的sql语句与n条简单的sql语句比,哪个效率高?

问题描述 都是在连接open以后提交语句,一条复杂语句就是操作全由数据库完成,多条简单点的语句是一部分工作由数据库完成,一部分由C#程序完成 解决方案 解决方案二:自己顶下,大神快来解决方案三:肯定是一条啊解决方案四:引用2楼lstcyzj的回复: 肯定是一条啊 如果是操作很复杂不会影响性能么解决方案五:多条简单点的语句其实就是把一些计算放在程序里做了,查询和更新用的sql语句解决方案六:自己顶下,,,,解决方案七:引用3楼newlovedew的回复: 如果是操作很复杂不会影响性能么 这真不能一

C++字符串的处理-----全部用库函数,效率高

string定义: a) string s; //生成一个空字符串s string a="eholldfs";     a="dfgdfg";     cin>>a; b) string s(str)  //拷贝构造函数 生成str的复制品 c) string s(str,stridx)  //将字符串str内"始于位置stridx"的部分当作字符串的初值 d) string s(str,stridx,strlen) //将字符串st

javascript字符串拼接的效率问题_javascript技巧

复制代码 代码如下: function xntest(){ var d1=new Date(); var str=""; for(var i=0;i<10000;i++){ str+="stext"; } var d2=new Date(); document.write(" 字符串拼接方式耗时:"+(d2.getTime()- d1.getTime())+"毫秒:"); d1=new Date(); var sb=ne