c语言实现两个字符串连接的几种方法

时间:2019-05-14 23:08:27下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《c语言实现两个字符串连接的几种方法》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《c语言实现两个字符串连接的几种方法》。

第一篇:c语言实现两个字符串连接的几种方法

#define _CRT_SECURE_NO_WARNINGS

#include #include #include void mystrcat(char *p,char *q){ char *pp = p;while(*pp!= ''){

pp++;} *pp = ' ';while(*q!= ''){

*(++pp)= *(q++);} *(++pp)= '';} void main(){ char str[30] = “tracert”;char web[50];char lin[80];scanf(“%s”, web);printf(“%s”, web);//第一种方法

/*sprintf(lin, “%s %s”, str, web);printf(“n%s”, lin);*/ //第二种方法

/*strcat(str, “ ”);strcat(str, web);printf(“n%s”, str);*/ //第三种方法

mystrcat(str, web);system(str);system(“pause”);}

第二篇:。NET 性能优化方法总结与字符串连接优化

.NET 性能优化方法总结

Ver 1.0

2009-1-20

目录

1.C#语言方面...............................................................................................................4

1.1 垃圾回收.......................................................................................................4

1.1.1 避免不必要的对象创建.....................................................................4 1.1.2 不要使用空析构函数 ★...................................................................4 1.1.3 实现 IDisposable 接口.....................................................................4

1.2 String 操作....................................................................................................5

1.2.1 使用 StringBuilder 做字符串连接...................................................5 1.2.2 避免不必要的调用 ToUpper 或 ToLower 方法...........................5 1.2.3 最快的空串比较方法.........................................................................6

1.3 多线程...........................................................................................................6

1.3.1 线程同步.............................................................................................6 1.3.2 使用 ThreadStatic 替代 NameDataSlot ★.....................................7 1.3.3 多线程编程技巧.................................................................................7

1.4 类型系统.......................................................................................................8

1.4.1 避免无意义的变量初始化动作.........................................................8 1.4.2 ValueType 和 ReferenceType...........................................................8 1.4.3 尽可能使用最合适的类型.................................................................9

1.5 异常处理.....................................................................................................10

1.5.1 不要吃掉异常★...............................................................................10 1.5.2 不要吃掉异常信息★.......................................................................10 1.5.3 避免不必要的抛出异常...................................................................10 1.5.4 避免不必要的重新抛出异常...........................................................10 1.5.5 捕获指定的异常,不要使用通用的System.Exception.................10 1.5.6 要在finally里释放占用的资源......................................................11

1.6 反射.............................................................................................................11

1.6.1 反射分类...........................................................................................12 1.6.2 动态创建对象...................................................................................12 1.6.3 动态方法调用...................................................................................12 1.6.4 推荐的使用原则...............................................................................12

1.7 基本代码技巧.............................................................................................13

1.7.1 循环写法...........................................................................................13 1.7.2 拼装字符串.......................................................................................13 1.7.3 避免两次检索集合元素...................................................................13 1.7.4 避免两次类型转换...........................................................................14 1.7.5为字符串容器声明常量,不要直接把字符封装在双引号“ ”里面。.....................................................................................................................14 1.7.6 用StringBuilder代替使用字符串连接符 “+”...............................14 1.7.7 避免在循环体里声明变量,...........................................................15

1.8 Hashtable......................................................................................................15 1.8.1 Hashtable机理...................................................................................15 1.8.2 使用HashTale代替其他字典集合类型的情形:......................16

1.9 避免使用ArrayList。..............................................................................16 1.10从XML对象读取数据.............................................................................17 1.11 避免使用递归调用和嵌套循环,...........................................................17 1.12 使用适当的Caching策略来提高性能...................................................17

2.Ado.Net....................................................................................................................17

2.1 应用Ado.net的一些思考原则..................................................................18 2.2 Connection...................................................................................................18

2.2.1 在方法中打开和关闭连接...............................................................18 2.2.2 显式关闭连接...................................................................................18 2.2.3 确保连接池启用...............................................................................19 2.2.4 不要缓存连接...................................................................................19

2.3 Command.....................................................................................................19

2.3.1 使用ExecuteScalar和ExecuteNonQuery.......................................19 2.3.2 使用Prepare.....................................................................................19 2.3.3 使用绑定变量 ★.............................................................................19

2.4 DataReader...................................................................................................20

2.4.1 显式关闭DataReader.......................................................................20 2.4.2 用索引号访问代替名称索引号访问属性.......................................20 2.4.3 使用类型化方法访问属性...............................................................20 2.4.4 使用多数据集...................................................................................20

2.5 DataSet.........................................................................................................21

2.5.1 利用索引加快查找行的效率...........................................................21 2.使用DataView......................................................................................21

3.ASP.NET..................................................................................................................21

3.1 减少往返行程(Reduce Round Trips)...................................................21 3.2 避免阻塞和长时间的作业.........................................................................22 3.3 使用缓存.....................................................................................................22 3.4 多线程.........................................................................................................22 3.5 系统资源.....................................................................................................23 3.6 页面处理.....................................................................................................23 3.7 ViewState.....................................................................................................23

4.JScript.......................................................................................................................24

4.1 JScript性能优化的基本原则.....................................................................24 4.2 JScript语言本身的优化.............................................................................24 4.3 DOM相关...................................................................................................27 4.4 其他.............................................................................................................28

1.C#语言方面

1.1 垃圾回收

垃圾回收解放了手工管理对象的工作,提高了程序的健壮性,但副作用就是程序代码可能对于对象创建变得随意。1.1.1 避免不必要的对象创建

由于垃圾回收的代价较高,所以C#程序开发要遵循的一个基本原则就是避免不必要的对象创建。以下列举一些常见的情形。

1.1.1.1 避免循环创建对象 ★

如果对象并不会随每次循环而改变状态,那么在循环中反复创建对象将带来性能损耗。高效的做法是将对象提到循环外面创建。

1.1.1.2 在需要逻辑分支中创建对象

如果对象只在某些逻辑分支中才被用到,那么应只在该逻辑分支中创建对象。

1.1.1.3 使用常量避免创建对象

程序中不应出现如 new Decimal(0)之类的代码,这会导致小对象频繁创建及回收,正确的做法是使用Decimal.Zero常量。我们有设计自己的类时,也可以学习这个设计手法,应用到类似的场景中。

1.1.1.4 使用StringBuilder做字符串连接

1.1.2 不要使用空析构函数 ★

如果类包含析构函数,由创建对象时会在 Finalize 队列中添加对象的引用,以保证当对象无法可达时,仍然可以调用到 Finalize 方法。垃圾回收器在运行期间,会启动一个低优先级的线程处理该队列。相比之下,没有析构函数的对象就没有这些消耗。如果析构函数为空,这个消耗就毫无意义,只会导致性能降低!因此,不要使用空的析构函数。

在实际情况中,许多曾在析构函数中包含处理代码,但后来因为种种原因被注释掉或者删除掉了,只留下一个空壳,此时应注意把析构函数本身注释掉或删除掉。1.1.3 实现 IDisposable 接口

垃圾回收事实上只支持托管内在的回收,对于其他的非托管资源,例如

Window GDI 句柄或数据库连接,在析构函数中释放这些资源有很大问题。原因是垃圾回收依赖于内在紧张的情况,虽然数据库连接可能已濒临耗尽,但如果内存还很充足的话,垃圾回收是不会运行的。

C#的 IDisposable 接口是一种显式释放资源的机制。通过提供 using 语句,还简化了使用方式(编译器自动生成 try...finally 块,并在 finally 块中调用 Dispose 方法)。对于申请非托管资源对象,应为其实现 IDisposable 接口,以保证资源一旦超出 using 语句范围,即得到及时释放。这对于构造健壮且性能优良的程序非常有意义!

为防止对象的 Dispose 方法不被调用的情况发生,一般还要提供析构函数,两者调用一个处理资源释放的公共方法。同时,Dispose 方法应调用

System.GC.SuppressFinalize(this),告诉垃圾回收器无需再处理 Finalize 方法了。

1.2 String 操作

1.2.1 使用 StringBuilder 做字符串连接

String 是不变类,使用 + 操作连接字符串将会导致创建一个新的字符串。如果字符串连接次数不是固定的,例如在一个循环中,则应该使用 StringBuilder 类来做字符串连接工作。因为 StringBuilder 内部有一个 StringBuffer,连接操作不会每次分配新的字符串空间。只有当连接后的字符串超出 Buffer 大小时,才会申请新的 Buffer 空间。典型代码如下:

StringBuilder sb = new StringBuilder(256);for(int i = 0;i < Results.Count;i ++){

sb.Append(Results[i]);}

如果连接次数是固定的并且只有几次,此时应该直接用 + 号连接,保持程序简洁易读。实际上,编译器已经做了优化,会依据加号次数调用不同参数个数的 String.Concat 方法。例如:String str = str1 + str2 + str3 + str4;

会被编译为 String.Concat(str1, str2, str3, str4)。该方法内部会计算总的 String 长度,仅分配一次,并不会如通常想象的那样分配三次。作为一个经验值,当字符串连接操作达到 10 次以上时,则应该使用 StringBuilder。

这里有一个细节应注意:StringBuilder 内部 Buffer 的缺省值为 16,这个值实在太小。按 StringBuilder 的使用场景,Buffer 肯定得重新分配。经验值一般用 256 作为 Buffer 的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这个值来设定 Buffer 的初值。使用 new StringBuilder(256)就将 Buffer 的初始长度设为了256。1.2.2 避免不必要的调用 ToUpper 或 ToLower 方法

String是不变类,调用ToUpper或ToLower方法都会导致创建一个新的字符串。如果被频繁调用,将导致频繁创建字符串对象。这违背了前面讲到的“避免频繁创建对象”这一基本原则。例如,bool.Parse方法本身已经是忽略大小写的,调用时不要调用ToLower方法。

另一个非常普遍的场景是字符串比较。高效的做法是使用 Compare 方法,这个方法可以做大小写忽略的比较,并且不会创建新字符串。

例:

const string C_VALUE = “COMPARE”;

if(String.Compare(sVariable, C_VALUE, true)== 0)

{

Console.Write(“SAME”);

}

还有一种情况是使用 HashTable 的时候,有时候无法保证传递 key 的大小写是否符合预期,往往会把 key 强制转换到大写或小写方法。实际上 HashTable 有不同的构造形式,完全支持采用忽略大小写的 key: new HashTable(StringComparer.OrdinalIgnoreCase)。1.2.3 最快的空串比较方法

将String对象的Length属性与0比较是最快的方法:if(str.Length == 0)

其次是与String.Empty常量或空串比较:if(str == String.Empty)或if(str == “")

注:C#在编译时会将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量不会重复分配。

1.3 多线程

1.3.1 线程同步

线程同步是编写多线程程序需要首先考虑问题。C#为同步提供了 Monitor、Mutex、AutoResetEvent 和 ManualResetEvent 对象来分别包装 Win32 的临界区、互斥对象和事件对象这几种基础的同步机制。C#还提供了一个lock语句,方便使用,编译器会自动生成适当的 Monitor.Enter 和 Monitor.Exit 调用。

1.3.1.1 同步粒度

同步粒度可以是整个方法,也可以是方法中某一段代码。为方法指定 MethodImplOptions.Synchronized 属性将标记对整个方法同步。例如:

[MethodImpl(MethodImplOptions.Synchronized)] public static SerialManager GetInstance(){

if(instance == null){

instance = new SerialManager();}

return instance;}

通常情况下,应减小同步的范围,使系统获得更好的性能。简单将整个方法标记为同步不是一个好主意,除非能确定方法中的每个代码都需要受同步保护。

1.3.1.2 同步策略

使用 lock 进行同步,同步对象可以选择 Type、this 或为同步目的专门构造的成员变量。

避免锁定Type★

锁定Type对象会影响同一进程中所有AppDomain该类型的所有实例,这不仅可能导致严重的性能问题,还可能导致一些无法预期的行为。这是一个很不好的习惯。即便对于一个只包含static方法的类型,也应额外构造一个static的成员变量,让此成员变量作为锁定对象。

避免锁定 this

锁定 this 会影响该实例的所有方法。假设对象 obj 有 A 和 B 两个方法,其中 A 方法使用 lock(this)对方法中的某段代码设置同步保护。现在,因为某种原因,B 方法也开始使用 lock(this)来设置同步保护了,并且可能为了完全不同的目的。这样,A 方法就被干扰了,其行为可能无法预知。所以,作为一种良好的习惯,建议避免使用 lock(this)这种方式。

使用为同步目的专门构造的成员变量

这是推荐的做法。方式就是 new 一个 object 对象,该对象仅仅用于同步目的。

如果有多个方法都需要同步,并且有不同的目的,那么就可以为些分别建立几个同步成员变量。

1.3.1.4 集合同步

C#为各种集合类型提供了两种方便的同步机制:Synchronized 包装器和 SyncRoot 属性。

// Creates and initializes a new ArrayList ArrayList myAL = new ArrayList();myAL.Add(” The “);myAL.Add(” quick “);myAL.Add(” brown “);myAL.Add(” fox “);

// Creates a synchronized wrapper around the ArrayList ArrayList mySyncdAL = ArrayList.Synchronized(myAL);

调用 Synchronized 方法会返回一个可保证所有操作都是线程安全的相同集合对象。考虑 mySyncdAL[0] = mySyncdAL[0] + ”test“ 这一语句,读和写一共要用到两个锁。一般讲,效率不高。推荐使用 SyncRoot 属性,可以做比较精细的控制。

1.3.2 使用 ThreadStatic 替代 NameDataSlot ★ 存取 NameDataSlot 的 Thread.GetData 和 Thread.SetData 方法需要线程同步,涉及两个锁:一个是 LocalDataStore.SetData 方法需要在 AppDomain 一级加锁,另一个是 ThreadNative.GetDomainLocalStore 方法需要在 Process 一级加锁。如果一些底层的基础服务使用了 NameDataSlot,将导致系统出现严重的伸缩性问题。

规避这个问题的方法是使用 ThreadStatic 变量。示例如下:

public sealed class InvokeContext {

[ThreadStatic]

private static InvokeContext current;

private Hashtable maps = new Hashtable();}

1.3.3 多线程编程技巧

1.3.3.1 使用 Double Check 技术创建对象

internal IDictionary KeyTable { get {

if(this._keyTable == null){

lock(base._lock){

if(this._keyTable == null){

this._keyTable = new Hashtable();} } }

return this._keyTable;} }

创建单例对象是很常见的一种编程情况。一般在 lock 语句后就会直接创建对象了,但这不够安全。因为在 lock 锁定对象之前,可能已经有多个线程进入到了第一个 if 语句中。如果不加第二个 if 语句,则单例对象会被重复创建,新的实例替代掉旧的实例。如果单例对象中已有数据不允许被破坏或者别的什么原因,则应考虑使用 Double Check 技术。

1.4 类型系统 1.4.1 避免无意义的变量初始化动作

CLR保证所有对象在访问前已初始化,其做法是将分配的内存清零。因此,不需要将变量重新初始化为0、false或null。

需要注意的是:方法中的局部变量不是从堆而是从栈上分配,所以C#不会做清零工作。如果使用了未赋值的局部变量,编译期间即会报警。不要因为有这个印象而对所有类的成员变量也做赋值动作,两者的机理完全不同!1.4.2 ValueType 和 ReferenceType

1.4.2.1 以引用方式传递值类型参数

值类型从调用栈分配,引用类型从托管堆分配。当值类型用作方法参数时,默认会进行参数值复制,这抵消了值类型分配效率上的优势。作为一项基本技巧,以引用方式传递值类型参数可以提高性能。

1.4.2.2 为 ValueType 提供 Equals 方法

.net 默认实现的 ValueType.Equals 方法使用了反射技术,依靠反射来获得所有成员变量值做比较,这个效率极低。如果我们编写的值对象其 Equals 方法要被用到(例如将值对象放到 HashTable 中),那么就应该重载 Equals 方法。

public struct Rectangle {

public double Length;public double Breadth;

public override bool Equals(object ob){

if(ob is Rectangle)

return Equels((Rectangle)ob))else

return false;}

private bool Equals(Rectangle rect){

return this.Length == rect.Length && this.Breadth == rect.Breach;} }

1.4.2.3 避免装箱和拆箱

C#可以在值类型和引用类型之间自动转换,方法是装箱和拆箱。装箱需要从堆上分配对象并拷贝值,有一定性能消耗。如果这一过程发生在循环中或是作为底层方法被频繁调用,则应该警惕累计的效应。

一种经常的情形出现在使用集合类型时。例如:

ArrayList al = new ArrayList();for(int i = 0;i < 1000;i ++){ al.Add(i);// Implicitly boxed because Add()takes an object }

int f =(int)al[ 0 ];// The element is unboxed

但是得当心!如果你像使用引用类型那么频繁的使用一个值类型的话,值类型的优势会很快被耗尽。比如,把一个值类型压到一个含有对象类型的群集。这叫做装箱,很耗用处理器周期,尤其是当你的代码在把它作为值(对它进行数学运算)和把它作为引用之间来回运行时。

1.4.3 尽可能使用最合适的类型

• 尽可能使用最合适的类型来描述数据,从而减少类型转换。

• 使用泛型来创建群集和其它的数据结构,这样,在运行时,它们就可以被实例化来存储刚好合适的类型。这节省了装箱/拆箱和类型转换的时间。

• 在C#中使用as,而不是is。关键字is用来查看引用是否可以被作为某个具体的类型,但是并不返回转换到这个类型的引用。所以,通常当你从is获得一个正的结果时,你首先应该cast——有效地执行两次cast。采用as关键词时,如果可用,则返回cast为新类型的引用;否则返回null。你可以查看null然后做你喜欢做的事情。整体来说,As方法要比is方法快50%。

1.5 异常处理

异常也是现代语言的典型特征。与传统检查错误码的方式相比,异常是强制性的(不依赖于是否忘记了编写检查错误码的代码)、强类型的、并带有丰富的异常信息(例如调用栈)。1.5.1 不要吃掉异常★

关于异常处理的最重要原则就是:不要吃掉异常。这个问题与性能无关,但对于编写健壮和易于排错的程序非常重要。这个原则换一种说法,就是不要捕获那些你不能处理的异常。

吃掉异常是极不好的习惯,因为你消除了解决问题的线索。一旦出现错误,定位问题将非常困难。除了这种完全吃掉异常的方式外,只将异常信息写入日志文件但并不做更多处理的做法也同样不妥。1.5.2 不要吃掉异常信息★

有些代码虽然抛出了异常,但却把异常信息吃掉了。

为异常披露详尽的信息是程序员的职责所在。如果不能在保留原始异常信息含义的前提下附加更丰富和更人性化的内容,那么让原始的异常信息直接展示也要强得多。千万不要吃掉异常。1.5.3 避免不必要的抛出异常 抛出异常和捕获异常属于消耗比较大的操作,在可能的情况下,应通过完善程序逻辑避免抛出不必要不必要的异常。与此相关的一个倾向是利用异常来控制处理逻辑。尽管对于极少数的情况,这可能获得更为优雅的解决方案,但通常而言应该避免。1.5.4 避免不必要的重新抛出异常

如果是为了包装异常的目的(即加入更多信息后包装成新异常),那么是合理的。但是有不少代码,捕获异常没有做任何处理就再次抛出,这将无谓地增加一次捕获异常和抛出异常的消耗,对性能有伤害。

1.5.5 捕获指定的异常,不要使用通用的System.Exception.//避免

try

{

}

catch(Exception exc)

{

}

//推荐

try

{

}

catch(System.NullReferenceException exc)

{

}

catch(System.ArgumentOutOfRangeException exc)

{

}

catch(System.InvalidCastException exc)

{

}

1.5.6 要在finally里释放占用的资源

使用Try...catch...finally时,要在finally里释放占用的资源如连接,文件流等,不然在Catch到错误后占用的资源不能释放。

try

{

...}

catch

{...}

finally

{

conntion.close()

}

1.6 反射

反射是一项很基础的技术,它将编译期间的静态绑定转换为延迟到运行期间的动态绑定。在很多场景下(特别是类框架的设计),可以获得灵活易于扩展的架构。但带来的问题是与静态绑定相比,动态绑定会对性能造成较大的伤害。1.6.1 反射分类

type comparison :类型判断,主要包括 is 和 typeof 两个操作符及对象实例上的 GetType 调用。这是最轻型的消耗,可以无需考虑优化问题。注意 typeof 运算符比对象实例上的 GetType 方法要快,只要可能则优先使用 typeof 运算符。

member enumeration : 成员枚举,用于访问反射相关的元数据信息,例如Assembly.GetModule、Module.GetType、Type对象上的IsInterface、IsPublic、GetMethod、GetMethods、GetProperty、GetProperties、GetConstructor调用等。尽管元数据都会被CLR缓存,但部分方法的调用消耗仍非常大,不过这类方法调用频度不会很高,所以总体看性能损失程度中等。

member invocation:成员调用,包括动态创建对象及动态调用对象方法,主要有Activator.CreateInstance、Type.InvokeMember等。1.6.2 动态创建对象

C#主要支持 5 种动态创建对象的方式:

1.Type.InvokeMember

2.ContructorInfo.Invoke

3.Activator.CreateInstance(Type)

4.Activator.CreateInstance(assemblyName, typeName)

5.Assembly.CreateInstance(typeName)

最快的是方式 3,与 Direct Create 的差异在一个数量级之内,约慢 7 倍的水平。其他方式,至少在 40 倍以上,最慢的是方式 4,要慢三个数量级。1.6.3 动态方法调用

方法调用分为编译期的早期绑定和运行期的动态绑定两种,称为Early-Bound Invocation和Late-Bound Invocation。Early-Bound Invocation可细分为Direct-call、Interface-call和Delegate-call。Late-Bound Invocation主要有Type.InvokeMember和MethodBase.Invoke,还可以通过使用LCG(Lightweight Code Generation)技术生成IL代码来实现动态调用。

从测试结果看,相比Direct Call,Type.InvokeMember要接近慢三个数量级;MethodBase.Invoke虽然比Type.InvokeMember要快三倍,但比Direct Call仍慢270倍左右。可见动态方法调用的性能是非常低下的。我们的建议是:除非要满足特定的需求,否则不要使用!1.6.4 推荐的使用原则

模式

1. 如果可能,则避免使用反射和动态绑定

2. 使用接口调用方式将动态绑定改造为早期绑定

3. 使用Activator.CreateInstance(Type)方式动态创建对象

4. 使用typeof操作符代替GetType调用

反模式

1. 在已获得Type的情况下,却使用Assembly.CreateInstance(type.FullName)

1.7 基本代码技巧

这里描述一些应用场景下,可以提高性能的基本代码技巧。对处于关键路径的代码,进行这类的优化还是很有意义的。普通代码可以不做要求,但养成一种好的习惯也是有意义的。1.7.1 循环写法

可以把循环的判断条件用局部变量记录下来。局部变量往往被编译器优化为直接使用寄存器,相对于普通从堆或栈中分配的变量速度快。如果访问的是复杂计算属性的话,提升效果将更明显。for(int i = 0, j = collection.GetIndexOf(item);i < j;i++)

需要说明的是:这种写法对于CLR集合类的Count属性没有意义,原因是编译器已经按这种方式做了特别的优化。1.7.2 拼装字符串

拼装好之后再删除是很低效的写法。有些方法其循环长度在大部分情况下为1,这种写法的低效就更为明显了:

public static string ToString(MetadataKey entityKey){

string str = ”“;

object [] vals = entityKey.values;for(int i = 0;i < vals.Length;i ++){

str += ” , “ + vals[i].ToString();}

return str == ”“ ? ”“ : str.Remove(0 , 1);}

推荐下面的写法:

if(str.Length == 0)str = vals[i].ToString();else

str += ” , “ + vals[i].ToString();其实这种写法非常自然,而且效率很高,完全不需要用个Remove方法绕来绕去。1.7.3 避免两次检索集合元素

获取集合元素时,有时需要检查元素是否存在。通常的做法是先调用ContainsKey(或Contains)方法,然后再获取集合元素。这种写法非常符合逻辑。

但如果考虑效率,可以先直接获取对象,然后判断对象是否为null来确定元素是否存在。对于Hashtable,这可以节省一次GetHashCode调用和n次Equals比较。

如下面的示例:

public IData GetItemByID(Guid id){

IData data1 = null;

if(this.idTable.ContainsKey(id.ToString()){

data1 = this.idTable[id.ToString()] as IData;}

return data1;}

其实完全可用一行代码完成:return this.idTable[id] as IData;1.7.4 避免两次类型转换

考虑如下示例,其中包含了两处类型转换:

if(obj is SomeType){

SomeType st =(SomeType)obj;st.SomeTypeMethod();}

效率更高的做法如下:

SomeType st = obj as SomeType;if(st!= null){

st.SomeTypeMethod();}

1.7.5为字符串容器声明常量,不要直接把字符封装在双引号” “里面。

//避免

//

MyObject obj = new MyObject();

obj.Status = ”ACTIVE“;

//推荐

const string C_STATUS = ”ACTIVE“;

MyObject obj = new MyObject();

obj.Status = C_STATUS;

1.7.6 用StringBuilder代替使用字符串连接符

//避免

String sXML = ” “;

sXML += ”“;

sXML += ”Data“;

sXML += ”“;

sXML += ”“;

//推荐

StringBuilder sbXML = new StringBuilder();

sbXML.Append(” “);

sbXML.Append(”“);

sbXML.Append(”Data“);

sbXML.Append(”“);

sbXML.Append(”“);

1.7.7 避免在循环体里声明变量,应该在循环体外声明变量,在循环体里初始化。

//避免

for(int i=0;i<10;i++)

+”

{

SomeClass objSC = new SomeClass();} //推荐

SomeClass objSC = null;for(int i=0;i<10;i++){

objSC = new SomeClass();)

1.8 Hashtable 1.8.1 Hashtable机理

Hashtable是一种使用非常频繁的基础集合类型。需要理解影响Hashtable的效率有两个因素:一是散列码(GetHashCode方法),二是等值比较(Equals方法)。Hashtable首先使用键的散列码将对象分布到不同的存储桶中,随后在该特定的存储桶中使用键的Equals方法进行查找。

良好的散列码是第一位的因素,最理想的情况是每个不同的键都有不同的散列码。Equals方法也很重要,因为散列只需要做一次,而存储桶中查找键可能需要做多次。从实际经验看,使用Hashtable时,Equals方法的消耗一般会占到一半以上。

System.Object类提供了默认的GetHashCode实现,使用对象在内存中的地址作为散列码。我们遇到过一个用Hashtable来缓存对象的例子,每次根据传递的OQL表达式构造出一个ExpressionList对象,再调用QueryCompiler的方法编译得到CompiledQuery对象。以ExpressionList对象和CompiledQuery对象作为键值对存储到Hashtable中。ExpressionList对象没有重载GetHashCode实现,其超类ArrayList也没有,这样最后用的就是System.Object类的GetHashCode实现。由于ExpressionList对象会每次构造,因此它的HashCode每次都不同,所以这个CompiledQueryCache根本就没有起到预想的作用。这个小小的疏漏带来了重大的性能问题,由于解析OQL表达式频繁发生,导致CompiledQueryCache不断增长,造成服务器内存泄漏!解决这个问题的最简单方法就是提供一个常量实现,例如让散列码为常量0。虽然这会导致所有对象汇聚到同一个存储桶中,效率不高,但至少可以解决掉内存泄漏问题。当然,最终还是会实现一个高效的GetHashCode方法的。

以上介绍这些Hashtable机理,主要是希望大家理解:如果使用Hashtable,你应该检查一下对象是否提供了适当的GetHashCode和Equals方法实现。否则,有可能出现效率不高或者与预期行为不符的情况。

1.8.2 使用HashTale代替其他字典集合类型的情形:

其他字典集合类型(如StringDictionary,NameValueCollection,HybridCollection),存放少量数据的时候可以使用HashTable。很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:

非泛型集合类 泛型集合类

ArrayList List

HashTable DIctionary Queue Queue Stack Stack

SortedList SortedList

我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类。我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,如果我们操纵的数据类型相对确定的化

用 Dictionary 集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户的购物车信息(商品名,对应的商品个数)时,完全可以用 Dictionary 来存储购物车信息,而不需要任何的类型转化。

1.9 避免使用ArrayList。

因为任何对象添加到ArrayList都要封箱为System.Object类型,从ArrayList取出数据时,要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。.net 2.0提供了一个新的类型,叫泛型,这是一个强类型,使用泛型集合就可以避免了封箱和拆箱的发生,提高了性能。

1.10从XML对象读取数据

如果只是从XML对象读取数据,用只读的XPathDocument代替XMLDocument,可以提高性能

//避免

XmlDocument xmld = new XmlDocument();

xmld.LoadXml(sXML);

txtName.Text = xmld.SelectSingleNode(”/packet/child“).InnerText;

.//推荐

XPathDocument xmldContext = new XPathDocument(new StringReader(oContext.Value));

XPathNavigator xnav = xmldContext.CreateNavigator();

XPathNodeIterator xpNodeIter = xnav.Select(”packet/child“);

iCount = xpNodeIter.Count;

xpNodeIter = xnav.SelectDescendants(XPathNodeType.Element, false);

while(xpNodeIter.MoveNext())

{

sCurrValues += xpNodeIter.Current.Value+”~“;

}

}

1.11 避免使用递归调用和嵌套循环,使用他们会严重影响性能,在不得不用的时候才使用。

1.12 使用适当的Caching策略来提高性能

2.Ado.Net

2.1 应用Ado.net的一些思考原则

1.根据数据使用的方式来设计数据访问层 2.缓存数据,避免不必要的操作 3.使用服务帐户进行连接 4.必要时申请,尽早释放 5.关闭可关闭的资源 6.减少往返

7.仅返回需要的数据 8.选择适当的事务类型 9.使用存储过程

2.2 Connection 数据库连接是一种共享资源,并且打开和关闭的开销较大。Ado.net默认启用了连接池机制,关闭连接不会真的关闭物理连接,而只是把连接放回到连接池中。因为池中共享的连接资源始终是有限的,如果在使用连接后不尽快关闭连接,那么就有可能导致申请连接的线程被阻塞住,影响整个系统的性能表现。2.2.1 在方法中打开和关闭连接

这个原则有几层含义:

1.主要目的是为了做到必要时申请和尽早释放

2.不要在类的构造函数中打开连接、在析构函数中释放连接。因为这将依赖于垃圾回收,而垃圾回收只受内存影响,回收时机不定

3.不要在方法之间传递连接,这往往导致连接保持打开的时间过长

这里强调一下在方法之间传递连接的危害:曾经在压力测试中遇到过一个测试案例,当增大用户数的时候,这个案例要比别的案例早很久就用掉连接池中的所有连接。经分析,就是因为A方法把一个打开的连接传递到了B方法,而B方法又调用了一个自行打开和关闭连接的C方法。在A方法的整个运行期间,它至少需要占用两条连接才能够成功工作,并且其中的一条连接占用时间还特别长,所以造成连接池资源紧张,影响了整个系统的可伸缩性!

2.2.2 显式关闭连接

Connection对象本身在垃圾回收时可以被关闭,而依赖垃圾回收是很不好的策略。推荐使用using语句显式关闭连接,如下例:

using(SqlConnection conn = new SqlConnection(connString)){

conn.Open();

} // Dispose is automatically called on the conn variable here

2.2.3 确保连接池启用

Ado.net是为每个不同的连接串建立连接池,因此应该确保连接串不会出现与具体用户相关的信息。另外,要注意连接串是大小写敏感的。2.2.4 不要缓存连接

例如,把连接缓存到Session或Application中。在启用连接池的情况下,这种做法没有任何意义。

2.3 Command

2.3.1 使用ExecuteScalar和ExecuteNonQuery

如果想返回像Count(*)、Sum(Price)或Avg(Quantity)那样的单值,可以使用ExecuteScalar方法。ExecuteScalar返回第一行第一列的值,将结果集作为标量值返回。因为单独一步就能完成,所以ExecuteScalar不仅简化了代码,还提高了性能。

使用不返回行的SQL语句时,例如修改数据(INSERT、UPDATE或DELETE)或仅返回输出参数或返回值,请使用ExecuteNonQuery。这避免了用于创建空DataReader的任何不必要处理。2.3.2 使用Prepare

当需要重复执行同一SQL语句多次,可考虑使用Prepare方法提升效率。需要注意的是,如果只是执行一次或两次,则完全没有必要。例如:

cmd.CommandText = ”insert into Table1(Col1, Col2)values(@val1, @val2)“;

cmd.Parameters.Add(”@val1“, SqlDbType.Int, 4, ”Col1“);cms.Parameters.Add(”@val2“, SqlDbType.NChar, 50, ”Col2“);

cmd.Parameters[0].Value = 1;

cmd.Parameters[1].Value = ”XXX“;cmd.Prepare();

cmd.ExecuteNonQuery();

cmd.Parameters[0].Value = 2;

cmd.Parameters[1].Value = ”YYY“;cmd.ExecuteNonQuery();

cmd.Parameters[0].Value = 3;

cmd.Parameters[1].Value = ”ZZZ“;cmd.ExecuteNonQuery();

2.3.3 使用绑定变量 ★

SQL语句需要先被编译成执行计划,然后再执行。如果使用绑定变量的方式,那么这个执行计划就可以被后续执行的SQL语句所复用。而如果直接把参数合并到了SQL语句中,由于参数值千变万化,执行计划就难以被复用了。例如上面Prepare一节给出的示例,如果把参数值直接写到insert语句中,那么上面的四次调用将需要编译四次执行计划。

为避免这种情况造成性能损失,要求一律使用绑定变量方式。

2.4 DataReader

DataReader最适合于访问只读的单向数据集。与DataSet不同,数据集并不全部在内存中,而是随不断发出的read请求,一旦发现数据缓冲区中的数据均被读取,则从数据源传输一个数据缓冲区大小的数据块过来。另外,DataReader保持连接,DataSet则与连接断开。2.4.1 显式关闭DataReader

与连接类似,也需要显式关闭DataReader。另外,如果与DataReader关联的Connection仅为DataReader服务的话,可考虑使用Command对象的ExecuteReader(CommandBehavior.CloseConnection)方式。这可以保证当DataReader关闭时,同时自动关闭Connection。2.4.2 用索引号访问代替名称索引号访问属性

从Row中访问某列属性,使用索引号的方式比使用名称方式有细微提高。如果会被频繁调用,例如在循环中,那么可考虑此类优化。示例如下:

cmd.CommandText = ”select Col1, Col2 from Table1“;SqlDataReader dr = cmd.ExecuteReader();

int col1 = dr.GetOrdinal(”Col1“);int col2 = dr.GetOrdinal(”Col2“);

while(dr.Read()){

Console.WriteLine(dr[col1] + ”_“ + dr[col2]);}

2.4.3 使用类型化方法访问属性

从Row中访问某列属性,用GetString、GetInt32这种显式指明类型的方法,其效率较通用的GetValue方法有细微提高,因为不需要做类型转换。2.4.4 使用多数据集

部分场景可以考虑一次返回多数据集来降低网络交互次数,提升效率。示例如下:

cmd.CommandText = ”StoredProcedureName“;// The stored procedure returns multiple result sets.SqlDataReader dr = cmd.ExecuteReader();

while(dr.read())// read first result set

dr.NextResult();

while(dr.read())//

2.5 DataSet

2.5.1 利用索引加快查找行的效率

如果需要反复查找行,建议增加索引。有两种方式:

1.设置DataTable的PrimaryKey

适用于按PrimaryKey查找行的情况。注意此时应调用DataTable.Rows.Find方法,一般惯用的Select方法不能利用索引。2.使用DataView

适用于按Non-PrimaryKey查找行的情况。可为DataTable创建一个DataView,并通过SortOrder参数指示建立索引。此后使用Find或FindRows查找行。

3.ASP.NET

3.1 减少往返行程(Reduce Round Trips)

使用下面的方法可以减少Web服务器和Browser之间的往返行程:

1.为Browser启用缓存

如果呈现的内容是静态的或变化周期较长,应启用Browser缓存,避免发出冗余的http请求。2.缓冲页面输出

如果可能,则尽量缓冲页面输出,处理结束后再一次传送到客户端,这可以避免频繁传递小块内容所造成的多次网络交互。由于这种方式在页面处理结束之前客户端无法看到页面内容,因此如果一个页面的尺寸较大的话,可考虑使用Response.Flush方法。该方法强制输出迄今为止在缓冲区中的内容,你应当采用合理的算法控制调用Response.Flush方法的次数。

3.使用Server.Transfer重定向请求

使用Server.Transfer方法重定向请求优于Response.Redirect方法。原因是Response.Redirect会向Broswer回送一个响应头,在响应头中指出重定向的URL,之后Brower使用新的URL重新发出请求。而Server.Transfer方法直接是一个简单的服务端调用,完全没有这些开销!

需要注意Server.Transfer有局限性:第一,它会跳过安全检查;第二,只适用于在同一Web应用内的页面间跳转。

3.2 避免阻塞和长时间的作业 如果需要运行阻塞或长时间运行的操作,可以考虑使用异步调用的机制,以便Web服务器能够继续处理其它的请求。

1.使用异步方式调用Web服务和远程对象

只要有可能就要避免在请求的处理过程中对Web服务和远程对象的同步调用,因为它占用的是的ASP.NET 线程池中的工作线程,这将直接影响Web服务器响应其它请求的能力。

2.考虑给不需要返回值的Web方法或远程对象的方法添加OneWay属性

这种模式能让Web Server调用之后就立即返回。可根据实际情况决定是否使用这种方法。

3.使用工作队列

将作业提交到服务器上的工作队列中。客户端通过发送请求来轮询作业的执行结果。

3.3 使用缓存

缓存能在很大程度上决定ASP.NET应用的最终性能。Asp.net支持页面输出缓存和页面部分缓存,并提供Cache API,供应用程序缓存自己的数据。是否使用缓存可考虑下面的要点:

1.识别创建与访问代价较大的数据

2.评估需要缓存数据的易变性

3.评估数据的使用频次

4.将要缓存数据中易变数据和不变数据分离,只缓存不变数据

5.选择合适的缓存机制(除Asp.net Cache外,Application state和Session state也可以作为缓存使用)

3.4 多线程

1.避免在请求处理过程中创建线程

在执行请求的过程中创建线程是一种代价较大的操作,会严重影响Web Server的性能。如果后续的操作必须用线程完成,建议通过thread pool来创建/管理线程。

2.不要依赖线程数据槽或线程静态变量

由于执行请求的线程是ASP.NET thread pool中的工作线程,同一个Client的两次请求不一定由相同的线程来处理。

3.避免阻塞处理请求的线程

参考”避免阻塞和长时间的作业“小节。

4.避免异步调用

这和1的情况类似。异步调用会导致创建新的线程,增加服务器的负担。所以,如果没有并发的作业要执行,就不要执行异步调用。

3.5 系统资源

1.考虑实现资源池以提升性能

2.明确地调用Dispose或Close释放系统资源 3.不要缓存或长时间占用资源池中的资源 4.尽可能晚的申请,尽可能早的释放

3.6 页面处理

1.尽量减小Page的尺寸

包括缩短控件的名称、CSS的class的名称、去掉无谓空行和空格、禁用不需要的ViewState

2.启用页面输出的缓冲区(Buffer)

如果Buffer的机制被关闭,可以用下面的方法打开。

使用程序打开页面输出缓存:

Response.BufferOutput = true;

使用@Page开关打开页面输出缓冲机制:

<%@ Page Buffer = ”true“ %>

使用Web.config或Machine.config配置文件的

节点:

3.利用Page.IsPostBack优化页面输出

4.通过分离页面的不同的内容,来提高缓存效率和减少呈现的时间

5.优化复杂和代价较大的循环

6.合理利用客户端的计算资源,将一些操作转移到客户端进行

3.7 ViewState

ViewState是Asp.net为服务端控件在页面回传之间跟踪状态信息而设计的一种机制。

1.关闭ViewState

如果不需要跟踪页面状态,例如页面不会 回传(PostBack)、不需要处理服务端控件事件或者每次页面刷新时都会重新计算控件内容,那么就不需要用ViewState来记录页面状态了。可以对特定的WebControl设置EnableViewState属性,也可以在页面一级设置:

<%@ Page EnableViewState=”false“ %>

2.在恰当的时间点初始化控件属性

ASP.NET的控件在执行构造函数、初始化的期间设置的属性不会被跟踪变化;而在初始化阶段之后对属性的修改都会被跟踪,并最终记录到IE页面的__VIEWSTATE之中。所以,选择合理的初始化控件属性的执行点,能有效的减小页面尺寸。

3.谨慎选择放到ViewState中的内容

放到ViewState中的内容会被序列化/反序列化,Asp.net为String、Integer、Boolean等基本类型的序列化做了优化,如果Array、ArrayList、HashTable存储的是基本类型效率也较高,但其它类型则需要提供类型转换器(Type Converter),否则将使用代价昂贵的二进制序列化程序。

4.JScript

4.1 JScript性能优化的基本原则

1.尽可能少地减少执行次数。毕竟对解释语言来说,每一个执行步骤,都需要和解释引擎做一次交互。

2.尽可能使用语言内置的功能,比如串链接。

3.尽可能使用系统提供的API来进行优化。因为这些API是编译好的二进制代码,执行效率很高。

4.书写最正确的代码。容错功能是要付出性能代价的。

4.2 JScript语言本身的优化

4.2.1 变量

1.尽量使用局部变量。

因为全局变量其实是全局对象的成员,而局部变量在栈上定义,优先查找,性能相对于全局变量要高。

2.尽量在一个语句中做定义变量和赋值。

3.省略不必要的变量定义。

如果变量的定义可以被一个常量替代,就直接使用常量。

4.使用Object语法对对象赋值。Object的赋值语法在操作复杂对象时效率更高。

例如,可以将下面的代码:

car = new Object();car.make = ”Honda“;car.model = ”Civic“;

car.transmission = ”manual“;car.miles = 100000;

car.condition = ”needs work“;替换成:

car = {

make: ”Honda“, model: ”Civic“,transmission: ”manual“, miles: 100000,condition: ”needs work“ }

4.2.2 对象缓存

1.缓存对象查找的中间结果。

因为JavaScript的解释性,所以a.b.c.d.e,需要进行至少4次查询操作,先检查a再检查a中的b,再检查b中的c,如此往下。所以如果这样的表达式重复出现,只要可能,应该尽量少出现这样的表达式,可以利用局部变量,把它放入一个临时的地方进行查询。

2.缓存创建时间较长的对象。

自定义高级对象和Date、RegExp对象在构造时都会消耗大量时间。如果可以复用,应采用缓存的方式。

4.2.3 字符串操作

1.使用”+=“ 追加字符串,使用”+“来连接字符串。

如果是追加字符串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。

如果要连接多个字符串,应该使用”+“,如:

s+=a;

s+=b;

s+=c;

应该写成

s+=a + b + c;

2.连接大量的字符串,应使用Array的join方法。如果是收集字符串,最好使用JavaScript数组缓存,最后使用join方法连接起来,如下:

var buf = new Array();for(var i = 0;i < 100;i++){

buf.push(i.toString());}

var all = buf.join(”“);

4.2.4 类型转换

1.使用Math.floor()或者Math.round()将浮点数转换成整型。

浮点数转换成整型,这个更容易出错,很多人喜欢使用parseInt(),其实parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的转换,我们应该使用Math.floor()或者Math.round()。

对象查找中的问题不一样,Math是内部对象,所以Math.floor()其实并没有多少查询方法和调用的时间,速度是最快的。

2.自定义的对象,推荐定义和使用toString()方法来进行类型转换。

对于自定义的对象,如果定义了toString()方法来进行类型转换的话,推荐显式调用toString()。因为内部的操作在尝试所有可能性之后,会尝试对象的toString()方法尝试能否转化为String,所以直接调用这个方法效率会更高。

4.2.5 循环的优化

1.尽可能少使用for(in)循环。

在JavaScript中,我们可以使用for(;;),while(),for(in)三种循环,事实上,这三种循环中for(in)的效率极差,因为他需要查询散列键,只要可以就应该尽量少用。

2.预先计算collection的length。

如:将for(var i = 0;i < collection.length;i++)

替换成:for(var i = 0, len = collection.length;i < len;i++)

效果会更好,尤其是在大循环中。

3.尽量减少循环内的操作。

循环内的每个操作,都会被放大为循环次数的倍数。所以,大循环内微小的改进,在性能的整体提升上都是可观的。

4.使用循环替代递归。

相比循环,递归的效率更差一些。递归的优点是在形式上更自然一些。所以,在不影响代码的维护性的前提下,用循环替代递归。

4.2.6 其它方面

1.尽量使用语言内置的语法。

”var arr = [„];“和”var arr = new Array(„);“是等效的,但是前者的效能优于后者。同样,”var foo = {};“的方式也比”var foo = new Object();“快;”var reg = /../;“要比”var reg=new RegExp()“快。

2.尽量不要使用eval。

使用eval,相当于在运行时再次调用解释引擎,对传入的内容解释运行,需要消耗大量时间。

3.使用prototype代替closure。

使用closure在性能和内存消耗上都是不利的。如果closure使用量过大,这就会成为一个问题。所以,尽量将:

this.methodFoo = function()

替换成:

MyClass.protoype.methodFoo = function()

和closure存在于对象实例之中不同,prototype存在于类中,被该类的所有的对象实例共享。

4.避免使用with语句。

With语句临时扩展对象查找的范围,节省了文字的录入时间,但付出了更多的执行时间。因为每个给出的名称都要在全局范围查找。所以,可以将下面的代码:

with(document.formname){

field1.value = ”one“;field2.value = ”two“;}

变更为:

var form = document.formname;form.field1.value = ”one“;form.field2.value = ”two“;

4.3 DOM相关

4.3.1 创建DOM节点

相比较通过document.write来给页面生成内容,找一个容器元素(比如指定一个div或者span)并设置他们的innerHTML效率更高。而设置innerHTML的方式比通过createElement方法创建节点的效率更高。事实上,设置元素的innerHTML是创建节点效率最高的一种方式。

如果必须使用createElement方法,而如果文档中存在现成的样板节点,应该是用cloneNode()方法。因为使用createElement()方法之后,你需要设置多次元素的属性,使用cloneNode()则可以减少属性的设置次数。同样,如果需要创建很多元素,应该先准备一个样板节点。

4.3.2 离线操作大型的DOM树

在添加一个复杂的DOM树时,可以先构造,构造结束后再将其添加到DOM数的适当节点。这能够节省界面刷新的时间。

同样,在准备编辑一个复杂的树时,可以先将树从DOM树上删除,等编辑结束后再添加回来。

4.3.3 对象查询

使用[”“]查询要比.item()更快。调用.item()增加了一次查询和函数的调用。

4.3.4 定时器

如果针对的是不断运行的代码,不应该使用setTimeout,而应该用setInterval。setTimeout每次要重新设置一个定时器。

4.4 其他

1.尽量减小文件尺寸。

将JScript文件中无关的空行、空格、注释去掉,有助于减小JS文件的尺寸,提高下载的时间。(可以通过工具来支持代码发布)

2.尽量不要在同一个Page内同时引用JScript和VBScript引擎

3.将Page内的JScript移入到单独的JS文件中。

4.将Page内的JScript放置在Page的最下面,有助于提高页面的响应速度。

5.利用cache,减少JScript文件的下载次数

6.在HTML内书写JScript文件的URL时,注意统一大小写。这样可以利用前面URL缓存的文件。

C# 性能优化——三种字符串拼接效率

2011年04月07日 星期四 17:56 字符串拼接主要包括三类:+,String.Format(),StringBuilder.Append()1)对于少量固定的字符串拼接,如string s= ”a“ + ”b“ + ”c“,系统会优化成s= String.Concat(”a“,”b“,”c“),不会新建多个字符串。

如果写成string s=”a“;s +=”b“;s+=”c“;则会创建三个新的字符串。2)String.Format的源代码: public static String Format(IFormatProvider provider, String format, params Object[] args){ if(format == null || args == null)throw new ArgumentNullException((format==null)?”format“:”args“);StringBuilder sb = new StringBuilder(format.Length + args.Length * 8);sb.AppendFormat(provider,format,args);return sb.ToString();} 可见,它和StringBuilder有着相似的效率,比用“+”的拼接方式高效,并且代码易于阅读。

string s= String.Format(”{0}{1}{2}“,”a“,”b“,”c");3)StringBuilder可以指定内存空间的容量,但可能需要进行数据类型转化。字符串较少时,可以使用String.Format()代替。

4)少量的字符串操作时,可以使用“+”或者String.Format();大量的字符串操作时,比如在循环体内,必须使用StringBuilder.Append()。

第三篇:解析各种SQL连接字符串

解析各种SQL连接字符串

数据库对软件有着重要的作用 我想每个程序员无论是在工作还是学习当中都会跟数据库频

繁的打交道吧 所以一个好的程序员对数据库的操作要足够的熟练 想要跟数据库同心就必

须先跟它建立连接

这就好像你想用QQ跟一个人聊天 首先得确认一下对方有没有在线 有没有时间 对方在线

也有时间 我们才能和他交流 数据库也是如此 我们写的连接字符串就是用来找到我们想要

进行通信的那个数据库 然后确定它可以跟我们进行交互 然后才有我们对数据库一系列的操作 下面一起看看.NET中常用的连接字符串:

?4 1.data source=服务器名;database=数据库名;uid=数据库登录名;pwd=登录密码 2.server=服务器IP;Initial Catalog=数据库名;uid=数据库登录名;pwd=登录密码 3.data source=(local);initial catalog=数据库名;Integrated Security=True 4.data source=localhost;initial catalog=数据库名;Integrated Security=SSPI

.........其实连接字符串有好多种 上面的这几个是我感觉比较常用的方式 其实以上几个字符串互

相对应的字符作用都是一样的 只是名字换了一下 什么意思呢 就是说“data source”和

“server”“database”和“initial catalog” 这些对应的字符是等价的 如果把第一个连接

字符串里的“database”换成“initial catalog”效果是一样的integrated securify=true的意思就是以当前的windows身份登录 此时不需要数据库的账

号跟密码 就算你写上uid=啥:pwd=啥 也不起什么作用 但是当值为false的时候账号密码

就起作用了 integrated security后面的值可以是true yes false no 还可以是sspi(与

true是一个效果)还有一个跟integrated securify等价的字符——trusted_connection

同样它的值也可以是true/flase/yes/no/sspi 就不过多的说了 这种用windows身份登录的方式看起来不错 但是安全性似乎不太好 而且容易出错 所以还是推荐用账号密码的方式

登录数据库

还有值得注意的就是data source 后面的参数 它可以是数据库所在计算机的机器名 IP地

址 如果是本地数据库还可以是(local)或localhost 所以如果数据库是在本地那么写哪个

都可以了(不过还是不推荐使用使用local的写法 因为一般我们开发软件数据库至少要被

一个局域网访问)而如果需要远程访问数据库那就只能用机器名或IP的方式了

第四篇:连接数据库实现图书管理系统

项目构思

使用JDBC技术连接MySQL数据库,实现对图书管理系统中图书信息的浏览,增加,修改,删除功能。项目设计

1,安装并配置数据库,创建数据库,创建表及添加数据 2程序设计 文件名:index.jsp <%@ page language=“java” import=“java.sql.*” pageEncoding=“gb2312”%> <%@page errorPage=“error.jsp”%>

图书管理系统

添加图书信息

<%

Class.forName(“com.mysql.jdbc.Driver”);

Connection con DriverManager.getConnection(“jdbc:mysql://localhost:3307/school”,“root”,“ylx”);

Statement stmt = con.createStatement();

String s = “Select * FROM book”;

ResultSet rs = stmt.executeQuery(s);

while(rs.next())

{

int id=rs.getInt(1);

out.println(“

”);

}

rs.close();

stmt.close();

con.close();

%>

书名作者价格管理
”+rs.getString(2)+“”+rs.getString(3)+“”+rs.getString(4)+“修改 删除

第五篇:MySQL基本语句和连接字符串-JAVA程序员JAVA工程师面试必看

-JAVA程序员JAVA工程师面试必看

MySQL基本语句和连接字符串

资料引用:http://

查询速度慢的原因很多,常见如下几种:

1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)

2、I/O吞吐量小,形成了瓶颈效应。

3、没有创建计算列导致查询不优化。

4、内存不足

5、网络速度慢

6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)

7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)

8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。

9、返回了不必要的行和列

10、查询语句不好,没有优化 可以通过如下方法来优化查询 :

1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)

3、升级硬件

4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最

好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的

几个值的字段建单一索引如性别字段

5、提高网速;

6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大

小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内

存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行

Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的

物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚

拟内存大小设置的一半)。

7、增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是

MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消

耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT,DELETE还不能并行处理。

8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。like 'a%' 使

用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用

CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。

9、DB Server 和application Server 分离;OLTP和OLAP分离

10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协

作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支

持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'

分区视图')

a、在实现分区视图之前,必须先水平分区表 b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这

样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上

都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置

对应用程序是透明的。

11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE.设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。在T-sql的写法

上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:

1、查询语句的词法、语法检查

2、将语句提交给DBMS的查询优化器

3、优化器做代数优化和存取路径的优化

4、由预编译模块生成查询规划

5、然后在合适的时间提交给系统处理执行

6、最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K

(8060)字节,8个页面为一个盘区,按照B树存放。

12、Commit和rollback的区别 Rollback:回滚所有的事物。Commit:提交当前的事物.没有必要在动态

SQL里写事物,如果要写请写在外面如: begin tran exec(@s)commit trans 或者将动态SQL 写成函数

或者存储过程。

13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务

器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访

问表,后果严重。

14、SQL的注释申明对执行没有任何影响

15、尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在 客户端循环,用临时表,Table变量,用子查询,用Case语句等等。游标可以按照它所支持的提取选项进

行分类: 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是

默认方式。可滚动性 可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结

果集的行中没有锁。OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并

发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。

当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改

某一行,则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变,则服务器

就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。选择这个并

发选项 OPTIMISTIC WITH ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其

中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server

中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个

数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL

Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有 timestamp

列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对

没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。

SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应

用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在

事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。

如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行

。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁 的读取。滚动锁根据在游标定义的 SELECT 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。

滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务

器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一

个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项

和游标 SELECT 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定

未锁定 更新 NOLOCK 未锁定 未锁定 未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 错误 更

新 更新 更新 TABLOCKX 错误 未锁定 未锁定 更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提

示将使指定了该提示的表在游标内是只读的。

16、用PRofiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引

17、注意UNion和UNion all 的区别。UNION all好

18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没

有问题的

19、查询时不要返回不需要的行、列

20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消

耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。SET

LOCKTIME设置锁的时间

21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行

22、在SQL2000以前,一般不要用如下的字句: “IS NULL”, “<>”, “!=”, “!>”, “!<”, “NOT”, “NOT

EXISTS”, “NOT IN”, “NOT LIKE”, and “LIKE '%500'”,因为他们不走索引全是表扫描。也不要在WHere

字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代

.还可以变通写法:WHERE SUBSTRING(firstname,1,1)= 'm'改为WHERE firstname like 'm%'(索引扫

描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如

果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,“NOT”,“NOT EXISTS”, “NOT IN”能优化她,而“<>”等还是不能优化,用不到索引。

23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据

了80%的资源,我们优化的重点是这些慢的地方。

24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: SELECT * FROM

PersonMember(INDEX = IX_Title)WHERE processid IN('男','女')

25、将需要查询的结果预先计算好放在表中,查询的时候再SELECT。这在SQL7.0以前是最重要的手段。

例如医院的住院费计算。

26、MIN()和 MAX()能使用到合适的索引。

27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers,Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不

仅维护工作小,编写程序质量高,并且执行的速度快。

28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌INsert来插入(不知java是否)

。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换

成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table

(Fimage)values(@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。

29、Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别

。select * from chineseresume where title in('男','女')Select * from chineseresume where

between '男' and '女' 是一样的。由于in会在比较多次,所以有时会慢些。

30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗

费大量的资源。他的创建同是实际表一样。

31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。

32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有

关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成

UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。

33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特

别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上 的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从

表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。

34、没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行。它们增加了额外的开销。

这同UNION 和UNION ALL一样的道理。

select top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar

(10),ad.postDate,120)as postDate1,workyear,degreedescription FROM

jobcn_query.dbo.COMPANYAD_query ad where referenceID in

('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345', 'JCNAD00333138','JCNAD00303570','JCNAD00303569', 'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933', 'JCNAD00254567','JCNAD00254585','JCNAD00254608', 'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618', 'JCNAD00279196','JCNAD00268613')order by postdate desc

35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。

36、当用SELECT INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创

建临时表时用显示申明语句,而不是select INTO.drop table t_lxh begin tran select * into

t_lxh from chineseresume where name = 'XYZ'--commit 在另一个连接中SELECT * from sysobjects

可以看到 SELECT INTO 会锁住系统表,Create table 也会锁系统表(不管是临时表还是系统表)。所以

千万不要在事物内使用它!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。

37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他

们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组

和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快

38、一次更新多条记录比分多次更新每次一条快,就是说批处理好

39、少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好

40、在SQL2000下,计算字段是可以索引的,需要满足的条件如下:

a、计算字段的表达是确定的

b、不能用在TEXT,Ntext,Image数据类型

c、必须配制如下选项 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….41、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优

化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快

。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支

持UDFs,现在支持复杂的数学计算,函数的返回值不要太大,这样的开销很大。用户自定义函数象光标一

样执行的消耗大量的资源,如果返回大的结果采用存储过程

42、不要在一句话里再三的使用相同的函数,浪费资源,将结果放在变量里再调用更快

43、SELECT COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别: select count

(Field of null)from Table 和 select count(Field of NOT null)from Table 的返回值是不同的!

44、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用 配制

线程数量<最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务

器的性能。

45、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照

这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一

个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现

46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如

果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。

Process:

1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在

运行的为比标准间隔优先权低的间隔)。由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间

百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间

百分比的平均忙时。

2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或

换一个更快的处理器。

3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操

纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它

是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换

成特权模式以访问操作系统服务)。特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率

高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显

示。

4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可

考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。Physical Disk: Curretn

Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。

SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。注意该参数值

是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。

47、分析select emp_name form employee where salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要

等运行时让DBMS进行转化。同样字符和整型数据的转换。

48、查询的关联同写的顺序

select a.personMemberID, * from chineseresume a,personmember b where personMemberID =

b.referenceid and a.personMemberID = 'JCNPRH39681'(A = B ,B = '号码')

select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID =

b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681'(A =

B ,B = '号码',A = '号码')

select a.personMemberID, * from chineseresume a,personmember b where b.referenceid =

'JCNPRH39681' and a.personMemberID = 'JCNPRH39681'(B = '号码',A = '号码')

49、(1)IF 没有输入负责人代码 THEN code1=0 code2=9999 ELSE code1=code2=负责人代码 END IF 执行SQL

语句为: SELECT 负责人名 FROM P2000 WHERE 负责人代码>=:code1 AND负责人代码 <=:code2

(2)IF 没有输入负责人代码 THEN SELECT 负责人名 FROM P2000 ELSE code= 负责人代码 SELECT 负

责人代码 FROM P2000 WHERE 负责人代码=:code END IF 第一种方法只用了一条SQL语句,第二种方法用

了两条SQL语句。在没有输入负责人代码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条

件;在输入了负责人代码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运

算是最快的查询运算。我们写程序不要怕麻烦

50、关于JOBCN现在查询分页的新方法(如下),用性能优化器分析性能的瓶颈,如果在I/O或者网络的

速度上,如下的方法优化切实有效,如果在CPU或者内存上,用现在的方法更好。请区分如下的方法,说

明索引越小越好。

begin

DECLARE @local_variable table(FID int identity(1,1),ReferenceID varchar(20))

insert into @local_variable(ReferenceID)

select top 100000 ReferenceID from chineseresume order by ReferenceID

select * from @local_variable where Fid > 40 and fid <= 60 end 和

begin

DECLARE @local_variable table(FID int identity(1,1),ReferenceID varchar(20))

insert into @local_variable(ReferenceID)

select top 100000 ReferenceID from chineseresume order by updatedate

select * from @local_variable where Fid > 40 and fid <= 60

end 的不同

begin

create table #temp(FID int identity(1,1),ReferenceID varchar(20))

insert into #temp(ReferenceID)

select top 100000 ReferenceID from chineseresume order by updatedate

select * from #temp where Fid > 40 and fid <= 60 drop table #temp end

资料引用:http:// 最近在做MS SQL Server转换成MySQL的工作,总结了点经验,跟大家分享一下。同时这些也会在不断更新。也希望大家补充。

MySQL支持enum,和set类型,SQL Server不支持 MySQL不支持nchar,nvarchar,ntext类型 MySQL的递增语句是AUTO_INCREMENT,而MS SQL是identity(1,1)MS SQL默认到处表创建语句的默认值表示是((0)),而在MySQL里面是不允许带两括号的 MySQL需要为表指定存储类型 MS SQL识别符是[],[type]表示他区别于关键字,但是MySQL却是 `,也就是按键1左边的那个符号 MS SQL支持getdate()方法获取当前时间日期,但是MySQL里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数 MS SQL不支持replace into 语句,但是在最新的sql20008里面,也支持merge语法 MySQL支持insert into table1 set t1 = ‘’, t2 = ‘’ ,但是MS SQL不支持这样写 MySQL支持insert into tabl1 values(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1)MS SQL不支持limit语句,是非常遗憾的,只能用top 取代limt 0,N,row_number()over()函数取代limit N,M MySQL在创建表时要为每个表指定一个存储引擎类型,而MS SQL只支持一种存储引擎 MySQL不支持默认值为当前时间的datetime类型(MS SQL很容易做到),在MySQL里面是用timestamp类型 MS SQL里面检查是否有这个表再删除,需要这样:

if exists(select *

from

dbo.sysobjects

where id = object_id(N'uc_newpm')and OBJECTPROPERTY(id,N'IsUserTable')=1)但是在MySQL里面只需要 DROP TABLE IF EXISTS cdb_forums;

但是在MySQL里面只需要 DROP TABLE IF EXISTS cdb_forums;MySQL支持无符号型的整数,那么比不支持无符号型的MS SQL就能多出一倍的最大数存储 MySQL不支持在MS SQL里面使用非常方便的varchar(max)类型,这个类型在MS SQL里面既可做一般数据存储,也可以做blob数据存储 MySQL创建非聚集索引只需要在创建表的时候指定为key就行,比如:KEY displayorder(fid,displayorder)在MS SQL里面必须要:

create MySQL text字段类型不允许有默认值

19MySQL的一个表的总共字段长度不超过65XXX。

20一个很表面的区别就是MySQL的安装特别简单,而且文件大小才110M(非安装版),相比微软这个庞然大物,安装进度来说简直就是.....21MySQL的管理工具有几个比较好的,MySQL_front,和官方那个套件,不过都没有SSMS的使用方便,这是MySQL很大的一个缺点。

22MySQL的存储过程只是出现在最新的版本中,稳定性和性能可能不如MS SQL。同样的负载压力,MySQL要消耗更少的CPU和内存,MS SQL的确是很耗资源。

24php连接MySQL和MS SQL的方式都差不多,只需要将函数的MySQL替换成MS SQL即可。

25MySQL支持date,time,year类型,MS SQL到2008才支持date和time。unique nonclustered

indexindex_uc_protectedmembers_username_appid

on dbo.uc_protectedmembers(username asc,appid asc)-

资料引用:http:// 经典sql语句,实现了修改,增加,删除,判断表字段

create database test1 use test1 create table admin(id int PRimary key ,name varchar(50),pwd varchar(50),)insert into admin values(1,'aa','aa')alter table

admin

add

tel varchar(50)

NULL select * from admin

select * from admin

if

exists

(select

*

from

syscolumns

where

id=object_id('admin')

and

name='mms')

print

'已经存在该字段' alter table

admin

add

tel varchar(50)

NULL

alter table admin alter column name set bbs varchar(50)null alter table tablename drop column oldfield

EXEC sp_rename 'admin.sss', 'tel', 'COLUMN'

资料引用:http://

查询重复值,显示出不重复的部分

select distinct(employeeid)from orders

------------------

查询两个表之间相同数据

select orders.EmployeeID,Employees.EmployeeID from orders INNER JOIN Employees on Employees.EmployeeID=orders.EmployeeID

实现目的,一个表存放用户编号和用户名,在另一个表中可以根据用户编号,把用户名直接引用过去,节省数据库空间

SQL创建数据库、表、存储过程及调用--如果存在数据库PRogrammerPay 就删除

if exists(select * from sysdatabases where name='programmerPay')drop database programmerPay go

--创建数据库programmerPay create database programmerPay on primary(name ='programmerPay_data', filename='D:programmerPayprogrammerPay_data.mdf', maxsize=3mb, filegrowth=15%)log on(name ='programmerPay_log', filename='D:programmerPayprogrammerPay_log.ldf', maxsize=1mb, filegrowth=15%)go

use programmerPay go--创建表prowage create table prowage(id int identity(1,1)not null,--主键 标识列 Pname char(10)not null,--程序员姓名 wage int not null--程序员工资)go

--为表prowage id 字段添加主键约束 alter table prowage

add constraint PK_id primary key(id)--插入测试数据

insert into prowage(pname,wage)values('张三',5000)insert into prowage(pname,wage)values('李四',1200)insert into prowage(pname,wage)values('二月',1700)insert into prowage(pname,wage)values('蓝天',5700)insert into prowage(pname,wage)values('阳光',8700)insert into prowage(pname,wage)values('神州',1100)insert into prowage(pname,wage)values('曾经藏',1300)insert into prowage(pname,wage)values('ruo',1200)insert into prowage(pname,wage)values('chend',1400)

--如果存在存储过程proc_addWage1 就删除

if exists(select * from sysobjects where name='proc_addWage1')drop procedure proc_addWage1 go

--创建存储过程proc_addWage1 create procedure proc_addWage1 as set nocount on declare @firstwage int

select @firstwage=sum(wage)from prowage while(1=1)

begin

declare @notpass int, @count int--定义两个变量 没达到2200的人数和总人数

select @notpass=count(*)from prowage where wage<2200

select @count =count(*)from prowage

if(@notpass*2>@count)

update prowage set wage=wage+100

else

break

end declare @endwage int

select @endwage=sum(wage)from prowage print'一共加薪'+convert(varchar(5),@endwage-@firstwage)print'加薪后的程序员工资列表:' select ID ,Pname,wage from prowage go

--如果存在存储过程proc_addWage2 就删除

if exists(select * from sysobjects where name='proc_addWage2')drop procedure proc_addWage2 go

--创建存储过程proc_addWage2 create procedure proc_addWage2 as set nocount on while(1=1)

begin

declare @avgwage int--定义变量平均工资

select @avgwage =avg(wage)from prowage

if(@avgwage<4500)

update prowage set wage=wage+200

else

break

end go

exec proc_addWage1--调用存储过程 proc_addWage1 exec proc_addwage2--调用存储过程 proc_addwage2

资料引用:http://

-JAVA程序员JAVA工程师面试必看

下载c语言实现两个字符串连接的几种方法word格式文档
下载c语言实现两个字符串连接的几种方法.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    黑马程序员C语言教程:《C语言常用字符串接口总结》

    《C语言常用字符串接口总结》 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字......

    中班语言活动:两个邮递员

    中班语言活动:两个邮递员 中班语言活动:两个邮递员 活动设计背景 由于本班的幼儿特别喜欢听故事,而《两个邮递员》这个故事里存在着一些反义词。通过本活动的设计,可以让幼儿在......

    努力还原真实 实现两个突破

    努力还原真实 实现两个突破谷国庆(电影《全城高考》出品人)2013-2-6 14:55:51来源:《人民日报》2013年02月05日当下中国的社会现实是,高考不止是一场升学考试,更寄托了一个家庭的......

    搞好“六个深化”,实现“两个提高”

    搞好“六个深化”,实现“两个提高” 不断创新工会工作新局面 2011年建材公司工会在集团公司工会领导下,紧密围绕公司党、政部署,以“六个深化、两个提高”为指导,创新工作思路,突......

    家庭两个路由器连接小攻略(有图解)[大全]

    家庭两个路由器连接小攻略最常见的应用是你家里现在有一个路由器,现在在想接一个无线路由器,如果不通过简单的设置是没有办法上网的,因为二个路由器在一个网段内IP地址都一......

    特种先进连接方法论文[全文5篇]

    焊接是一种将材料永久连接,并成为具有给定功能结构的制造技术。几乎所有的产品,从几十万吨巨轮到不足1克微电子元件,在生产制造中都不同程度地应用了焊接技术。焊接已经渗透到......

    节日小彩灯的连接方法[大全]

    集体备课:节日小彩灯的连接方法 2005年12月21日 节日小彩灯的连接方法 教学目标: 1、学生自主设计改进小彩灯的内部结构,使之更实用、更美观,提高学生的创新能力; 2、从小彩灯连......

    初中几何辅助线的连接方法5篇

    初中几何辅助线的连接方法盐中数学中考冲刺 人说几何很困难,难点就在辅助线。辅助线,如何添?把握定理和概念。还要刻苦加钻研,找出规律凭经验。图中有角平分线,可向两边作垂线。......