sql连接点滴

关于sql连接语句中的Integrated Security=SSPI(转)
解决方法:
即:Security Support Provider Interface
设置Integrated Security为 True 的时候,连接语句前面的 UserID, PW 是不起作用的,即采用windows身份验证模式。
只有设置为 False 或省略该项的时候,才按照 UserID, PW 来连接。
Integrated Security 可以设置为: True, false, yes, no ,这四个的意思很明白了,还可以设置为:sspi ,相当于 True,建议用这个代替 True。

initial catalog与database的区别是什么
        Initial Catalog:
DataBase:
两者没有任何区别只是名称不一样,就好像是人类的真实姓名与曾用名一样。。都可以叫你。

********************************************

Integrated Security=SSPI 这个表示以当前WINDOWS系统用户身去登录SQL SERVER服务器,如果SQL SERVER服务器不支持这种方式登录时,就会出错。
你可以使用SQL SERVER的用户名和密码进行登录,如:
"Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=数据库名;Data Source=192.168.0.1;User ID=sa;Password=密码"


***************************************************

Integrated   Security     -   或   -    Trusted_Connection   'false'   当为   false   时,将在连接中指定用户   ID   和密码。当为   true   时,将使用当前的   Windows   帐户凭据进行身份验证。   可识别的值为   true、false、yes、no   以及与   true   等效的   sspi(强烈推荐)。  


*************************************************

ADO.net   中数据库连接方式
System.Data.SqlClient.SqlConnection
常用的一些连接字符串(C#代码):

SqlConnection   conn   =   new   SqlConnection(   “Server=(local);Integrated   Security=SSPI;database=Pubs“);

SqlConnection   conn   =   new   SqlConnection(“server=(local)\NetSDK;database=pubs;Integrated   Security=SSPI“);

SqlConnection   conn   =   new   SqlConnection(“Data   Source=localhost;Integrated   Security=SSPI;Initial   Catalog=Northwind;“);

SqlConnection   conn   =   new   SqlConnection(“   data   source=(local);initial   catalog=xr;integrated   security=SSPI;
persist   security   info=False;workstation   id=XURUI;packet   size=4096;   “);

SqlConnection   myConn     =   new   System.Data.SqlClient.SqlConnection(“Persist   Security   Info=False;Integrated
Security=SSPI;database=northwind;server=mySQLServer“);

SqlConnection   conn   =   new   SqlConnection(   “   uid=sa;pwd=passwords;initial   catalog=pubs;data   source=127.0.0.1;Connect   Timeout=900“);

string sqlConnectString1 = "Data Source=(local);" +
                "Integrated security=SSPI;Initial Catalog=Taxi;";

string sqlConnectString2 = "Data Source=(local);" +
                "User Id=sa;Password=123;Initial Catalog=Taxi;";

SqlConnection cn = new SqlConnection("server=localhost;database=testing;user=sa;password=123");

 

 

连接字符串中的一些属性

Connection lifetime 连接生存时间,默认为0,表示无限长,单位为秒.在SQL集群环境中我们才设置为具体的数值.

Connection timeout 连接生成时间,默认为15秒,通俗的讲当你conn.Open等15秒后还没连接成功,那么就会抛出一个连接超时的错误,这也是为什么其他错误来的那么突然,而数据库连接超时错误,非要你等15秒的原因了.

Pooling 是否使用连接池, 默认是起用的,使用Pooling=false来禁止.

Min Pool Size,Max Pool Size 默认情况下最小是0,最大是100.

关于pooling属性在上面所有的连接字符串中多是默认开启的,连接池能有效的提高数据库访问性能,因为创建一个连接需要消耗很多资源,尤其是进行异地访问时(一般指局域网,最好不要进行跨internet的数据库访问)更加如此,因此你在多数情况下不需要显式的禁止(也许你没在意微软一直帮你开通着), 事实上在你使用 conn.open() ,conn.close() 多少数情况下不是真的打开一个连接,而是向连接池中取一条可用连接,跟归还一条连接,conn.open操作只有在池中没有可用连接时才会创建一条连接,当然如果池中可用接数目达到Max Pool Size时,他将不再创建新的连接,而是等待一条可用连接的到来,这个时间是Connection timeout. 当然你的conn.Open操作涉及的连接池,取决于你的连接字符串,比如:
"Data Source=127.0.0.1\SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI"


"Data Source=127.0.0.1\SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI
;" ,注意后面多了";"
会开启两个独立的连接池,ADO.NET 判断字符串是否相同的依据是对字符串进行2进制的比较,所以任何变动(空格,大小写)都会被判断为不同的连接字符串.
有如下代码
-----------------------------------
string strConn="Data Source=127.0.0.1\SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI
;";
for(int i=0;i<10;i++){
SqlConnection conn=new SqlConnection(strConn);
conn.Open();
conn.Close()
}

string strConn="Data Source=127.0.0.1\SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI
;";
for(int i=0;i<10;i++){
strConn +=" "; //空格
SqlConnection conn=new SqlConnection(strConn);
conn.Open();
conn.Close()
}
两段代码分别运行,看企业管理器->管理->进程信息(请刷新先) ,可以看到前面的只启用了一个进程,而后面的则启用了10个进程,每个进程对应一条连接.前一段代码10个open +close()操作使用的是同一个连接池中的同一个连接,而后一个则开启了10个连接池,每个连接池中有一个连接.

再看下面的代码
            for (int i = 0; i <= 10; i++)
            {
                Thread t = new Thread(new ThreadStart(Command));
                t.Start();
            }
---------------------
//Command定义
private void Command(){
string strConn="Data Source=127.0.0.1\SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI
;";
Sqlconnection conn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand("一个运行比较长的查询",conn);
conn.Open();
cmd.ExecuteNonQuery();
  
conn.Close()
}
运行后可以看,企业管理器->管理->进程信息里会开启10个到MyDBA数据库的连接进程,但是需要注意的是,这10个进程是属于同个连接池的,为了证明这一点你可以将上面的连接字符串改为
private void command(){
string strConn="Data Source=127.0.0.1\SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI
;Max pool Size=5;"; //加了Max Pool Size=5;
SqlConnection conn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand("一个运行比较长的查询",conn);
conn.Open();
cmd.ExecuteNonQuery();
  
conn.Close()
}
结果可以看到他只开启了5个到MyDBA数据库的连接,这证明他们是同个连接池的.当然这里能成功演示的前提是,cmd执行的任务时间要在15秒内,不然会出现后5个线程连接超时,另外使用SQL2000 的跟踪工具(SQL2005中是,SQL Server Profiler)是你观察以上实验的一个绝好的工具!

 

posted @ 2010-10-24 20:07  刘 慧  阅读(117)  评论(0编辑  收藏  举报