ADO.NET连接字符串的思考

1.首先启动mssql$sqlexpress实例,winkey+R运行net start mssql$sqlexpress

2.在vs2008中建一个控制台应用程序项目,名字随便,这里演示用"第一个mdf",然后在项目里添加一个基于服务的数据库,名字默认

3.项目大体为:

打开Program.cs文件,在其中添加如下代码:

View Code
 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data.SqlClient;
6 namespace 第一个mdf
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 string dataDir = AppDomain.CurrentDomain.BaseDirectory;
13 if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\"))
14 {
15 dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
16 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
17 }
18 //连接到本机的SQLEXPRESS实例(vs2008安装时自带的免费版本的SQLServer)
19 /*
20 * ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理,连接资源作用域在using(){}的
21 * 花括号里面,出了花括号即会被垃圾回收器回收,所以使用起来很方便,比用try catch finally代码更加简洁。
22 */
23 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
24 AttachDBFilename=|DataDirectory|\Database1.mdf;
25 Integrated Security=True;User Instance=True"))
26 {
27 conn.Open();
28 Console.WriteLine("连接成功!");
29 }
30 Console.ReadKey();
31 }
32 }
33 }

上面用using比用try{}catch{}finally{}更加简洁,当然也可以用try{}catch{}finally{},,代码如下:

View Code
 1  SqlConnection con = null;
2 try
3 {
4 con = new SqlConnection(@"Data Source=.\SQLEXPRESS;
5 AttachDBFilename=|DataDirectory|\Database1.mdf;
6 Integrated Security=True;User Instance=True");
7 con.Open();
8 Console.WriteLine("连接成功!");
9 }
10 catch (Exception ex)
11 {
12 Console.WriteLine(ex.Message);
13 }
14 finally
15 {
16 con.Close();
17                 con.Dispose();
18 }
19 Console.ReadKey();

从上面的例子可以看了SqlConnection 对象的使用步骤:

1.定义连接字符串

2.创建SqlConnection 对象

3.打开与数据库的连接

4.关闭数据库连接

关于上面的文件路径"dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")"的问题请参考杨中科老师在如鹏网上的文章:

url地址http://www.rupeng.com/forum/thread-11988-1-1.html

连接字符串:程序通过连接字符串 指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等。

项目内嵌mdf文件形式的连接字符串"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;

User Instance=True"。“.\SQLEXPRESS”表示“本机上的SQLEXPRESS实例”,如果数据库实例名不是SQLEXPRESS,则需要修改。

“Database1.mdf”为mdf的文件名,"AttachDBFilename"是附加本地数据库文件"Database1.mdf",

"Integrated Security=True;"代表使用windows身份验证;User Instance 就是用户实例,为 True,表示使用用户实例。关于用户实例还比较复杂,从网上找来一篇文章作为参考:

那什么是用户实例呢?
先看看实例

SQL Server 实例是一个在服务器上运行的 SQL Server 可执行程序。每个实例都有一个名称,内存中的一个 sqlservr.exe 进程、缓冲区内存、它自己的系统数据库副本,以及它自己的一组用户数据库。例如,默认情况下,SQL Server Express 作为一个名为“SQLEXPRESS”的实例安装。通过在连接字符串中指定带有服务器名称的实例名,可以连接到已命名的实例。这就是在连接到本地 SQL Server Express 数据库时通常将“.\SQLEXPRESS”指定为服务器名的原因。点(.)意味着本地服务器,\SQLEXPRESS 指定了 SQLEXPRESS 命名实例。
再看用户实例
用户实例是对实例的扩展。用户实例与普通实例类似,但它是在需要的时候创建,而普通实例是在安装期间创建的。

用户实例必须由父实例创建,所以使用用户实例时,我们也不能省略 Data Source。
谁打开了数据库连接,谁就是这个用户实例的运行帐户,比如 IUSR_Cftea 运行着网站,它打开了带用户实例的数据库连接,那么这个用户实例就是以 IUSR_Cftea 运行的。
用户实例限制

仅允许本地连接。
不能复制用户实例。
分布式查询对远程数据库不起作用。
用户实例仅在 SQL Server 的 Express Edition 内运行。
更详细
以下来自 MSDN:
当打开一个 User Instance 选项为 True 的连接时会发生什么?下列步骤描述用户第一次打开一个用户实例连接时发生的情况。

SQLClient 逻辑打开一个到 SQL Server Express 父实例(默认情况下是 .\SQLEXPRESS)的连接。
SQL Server Express 检测到已经设置了 User Instance 选项且该用户没有用户实例。
将 master 和 msdb 系统数据库文件复制到用户的目录下。在 Sally 的示例中,该目录为: C:\Documents and Settings\Sally\Local Settings\Application
Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS
这些文件是从一个在安装父实例时创建的模板目录复制的。用户实例启动后,tempdb、日志和跟踪文件被写入这个相同的用户目录。
父实例模拟正在打开该连接的 Windows 用户,并且启动一个以该用户身份运行的 sqlservr.exe 副本。系统数据库的位置作为参数传递。生成实例的名称。例如: 69651E0A-5550-46。
为新实例创建一个命名管道数据库连接。该名称基于实例名。例如:
\\.\pipe\69651E0A-5550-46\tsql\query.
将 AttachDBFilename 参数中指定的数据库文件附加到新实例,并用该文件的完整路径命名该文件:
[C:\MYDBPROJECTS\TESTVB1\TESTVB1\DATABASE1.MDF]
命名管道的名称传回到正在打开连接的 SqlClient。
SqlClient 接收到该连接的名称后,关闭到父实例的连接。它使用返回的命名管道名打开一个到该用户实例的新连接。
一旦为特定用户创建了用户实例,就会保留系统数据库和命名管道。因此,在第一次连接后,后续连接就只需执行后两步操作了。
关闭到该实例的最后一个连接后,启动的 sqlservr.exe 进程还会继续运行一段时间。因此,如果打开其他连接,则不需要重新启动该进程。继续运行的时间长度是由 sp_configure 选项“用户实例超时”设置的。默认情况下,时间长度设为 60 分钟,但是您可以用 sp_configure 命令更改它。
此版本的 SQL Server 不支持用户实例登录标志
运行时可能会遇到错误“此版本的 SQL Server 不支持用户实例登录标志”,前面说了用户实例仅在 SQL Server 的 Express Edition 内运行,如果不是 Express 版本,就不能将 User Instance 设置为 True,或将其去掉。

看了上面的文章感觉这个实例还挺复杂呵呵,

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

ok,我们再来看一下本机mssqlserver实例的情况:

首先启动本机mssqlserver实例,这里为了避免sqlexpress与mssqlserver的端口号1433冲突,先运行net stop mssql$sqlexpress关闭免费版本的实例后再启动mssqlserver:

在数据库中按如下步骤建库建表,代码:

View Code
 1 use master 
2 go
3 if exists(select * from sys.databases where name='test')
4 drop database test
5 go
6 create database test
7 go
8 use test
9 go
10 drop table employee
11 create table employee(
12 empId int identity(1,1) primary key,
13 empName varchar(20) not null,
14 empAge int null,
15 empTel varchar(20) null
16 )
17 go
18 insert into employee(empName,empAge,empTel) values('admin',20,'13500002458')
19 insert into employee(empName,empAge,empTel) values('scott',28,'13800002458')
20 insert into employee(empName,empAge,empTel) values('peter',36,'15900002458')
21 insert into employee(empName,empAge,empTel) values('jim',32,'15800002458')
22 insert into employee(empName,empAge,empTel) values('tom',25,'13600002458')
23 insert into employee(empName,empAge,empTel) values('lily',18,'13900002458')
24 select * from employee

然后修改Program.cs代码,来看一下连接字符串的四种写法:

View Code
 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data.SqlClient;
6
7 namespace AdoNetTempl
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 TestSqlConnectionString();
14 Console.ReadKey();
15
16 }
17 public static void TestSqlConnectionString()
18 {
19 //本例中使用本机服务器(Data Source=localhost;),本机可以写"."或"localhost"或"local",它们的效果是一样的。
20 //数据库实例为mssqlserver,不是mssql$sqlexpress
21 //1.使用windows身份验证(Integrated Security=true;),数据库(Initial Catalog=test;)
22 string strCon1 = "Data Source=LocalHost;Initial Catalog=test;Integrated Security=true;";
23
24 //2.使用sa管理员身份登录,需要写用户名和密码(uid=sa;pwd=123),数据库(Initial Catalog=test;)
25 string strCon2 = "Data Source=.;Initial Catalog=test;uid=sa;pwd=123";
26
27 //3.使用SqlConnectionStringBuilder这个类来生成连接字符串
28 SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
29 scsb.DataSource = ".";
30 scsb.InitialCatalog = "test";
31 scsb.IntegratedSecurity = true;
32 string strCon3 = scsb.ConnectionString;//strCon3和strCon4是一样的
33
34 //4.使用工具->连接到数据库向导生成连接字符串
35 string strCon4 = "Data Source=.;Initial Catalog=test;Integrated Security=True";
36
37 SqlConnection con = null;
38 SqlCommand cmd = null;
39 SqlDataReader sdr = null;
40 try
41 {
42 con = new SqlConnection(strCon1);
43 cmd = con.CreateCommand();
44 cmd.CommandText = "select empName from employee";
45 con.Open();
46 sdr = cmd.ExecuteReader();
47 while (sdr.Read())
48 {
49 Console.WriteLine(sdr[0]);
50 }
51 }
52 catch (Exception ex)
53 {
54 Console.WriteLine(ex.Message);
55 }
56 finally
57 {
58 sdr.Dispose();
59 cmd.Dispose();
60 con.Dispose();
61 }
62 }
63 }
64 }


关于第四种使用字符串生成向导工具步骤如图:

下一步在服务器名处输入:"."代表本机,使用windows身份验证,如果使用SQL Server身份验证需要输入用户名和密码,然后选择要连接的数据库,这里为test。

 接着点击测试连接,如果成功则提示:

 

 点击高级按钮,就可得到连接字符串了:

将其拷贝到程序代码中即可。运行程序:

 补充下连接字符串的说明:

Data Source=服务器名(如果连接到本地数据库实例,服务器名可以写成.或者localhost或者local)

Initial Catalog=数据库名

使用特定的用户名密码连接:User ID=用户名;Password=密码(User ID可以简写为uid Password可以简写为pwd)

最终结果:Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Pwd=密码;

连接SQLServer需要引用 System.Data.SqlClient命名空间

连接Oracle 需要引用System.Data.OracleClient命名空间

 

 

 

 

 

 

 

 

 



 

 

 

 

 

 

 

 

 

---------------------- ASP.Net+WindowsPhone移动开发.net培训、期待与您交流! ----------------------

---------------------- ASP.Net+WindowsPhone移动开发.net培训、期待与您交流! ----------------------
今天学习了ado.net中怎样连接数据库,

1.首先启动mssql$sqlexpress实例,winkey+R运行net start mssql$sqlexpress

2.在vs2008中建一个控制台应用程序项目,名字随便,这里演示用"第一个mdf",然后在项目里添加一个基于服务的数据库,名字默认

3.项目大体为:

打开Program.cs文件,在其中添加如下代码:

View Code
 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data.SqlClient;
6 namespace 第一个mdf
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 string dataDir = AppDomain.CurrentDomain.BaseDirectory;
13 if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\"))
14 {
15 dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
16 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
17 }
18 //连接到本机的SQLEXPRESS实例(vs2008安装时自带的免费版本的SQLServer)
19 /*
20 * ADO.Net中的连接等资源都实现了IDisposable接口,可以使用using进行资源管理,连接资源作用域在using(){}的
21 * 花括号里面,出了花括号即会被垃圾回收器回收,所以使用起来很方便,比用try catch finally代码更加简洁。
22 */
23 using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
24 AttachDBFilename=|DataDirectory|\Database1.mdf;
25 Integrated Security=True;User Instance=True"))
26 {
27 conn.Open();
28 Console.WriteLine("连接成功!");
29 }
30 Console.ReadKey();
31 }
32 }
33 }

上面用using比用try{}catch{}finally{}更加简洁,当然也可以用try{}catch{}finally{},,代码如下:

View Code
 1  SqlConnection con = null;
2 try
3 {
4 con = new SqlConnection(@"Data Source=.\SQLEXPRESS;
5 AttachDBFilename=|DataDirectory|\Database1.mdf;
6 Integrated Security=True;User Instance=True");
7 con.Open();
8 Console.WriteLine("连接成功!");
9 }
10 catch (Exception ex)
11 {
12 Console.WriteLine(ex.Message);
13 }
14 finally
15 {
16 con.Close();
17                 con.Dispose();
18 }
19 Console.ReadKey();

从上面的例子可以看了SqlConnection 对象的使用步骤:

1.定义连接字符串

2.创建SqlConnection 对象

3.打开与数据库的连接

4.关闭数据库连接

关于上面的文件路径"dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")"的问题请参考杨中科老师在如鹏网上的文章:

url地址http://www.rupeng.com/forum/thread-11988-1-1.html

连接字符串:程序通过连接字符串 指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等。

项目内嵌mdf文件形式的连接字符串"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;

User Instance=True"。“.\SQLEXPRESS”表示“本机上的SQLEXPRESS实例”,如果数据库实例名不是SQLEXPRESS,则需要修改。

“Database1.mdf”为mdf的文件名,"AttachDBFilename"是附加本地数据库文件"Database1.mdf",

"Integrated Security=True;"代表使用windows身份验证;User Instance 就是用户实例,为 True,表示使用用户实例。关于用户实例还比较复杂,从网上找来一篇文章作为参考:

那什么是用户实例呢?
先看看实例

SQL Server 实例是一个在服务器上运行的 SQL Server 可执行程序。每个实例都有一个名称,内存中的一个 sqlservr.exe 进程、缓冲区内存、它自己的系统数据库副本,以及它自己的一组用户数据库。例如,默认情况下,SQL Server Express 作为一个名为“SQLEXPRESS”的实例安装。通过在连接字符串中指定带有服务器名称的实例名,可以连接到已命名的实例。这就是在连接到本地 SQL Server Express 数据库时通常将“.\SQLEXPRESS”指定为服务器名的原因。点(.)意味着本地服务器,\SQLEXPRESS 指定了 SQLEXPRESS 命名实例。
再看用户实例
用户实例是对实例的扩展。用户实例与普通实例类似,但它是在需要的时候创建,而普通实例是在安装期间创建的。

用户实例必须由父实例创建,所以使用用户实例时,我们也不能省略 Data Source。
谁打开了数据库连接,谁就是这个用户实例的运行帐户,比如 IUSR_Cftea 运行着网站,它打开了带用户实例的数据库连接,那么这个用户实例就是以 IUSR_Cftea 运行的。
用户实例限制

仅允许本地连接。
不能复制用户实例。
分布式查询对远程数据库不起作用。
用户实例仅在 SQL Server 的 Express Edition 内运行。
更详细
以下来自 MSDN:
当打开一个 User Instance 选项为 True 的连接时会发生什么?下列步骤描述用户第一次打开一个用户实例连接时发生的情况。

SQLClient 逻辑打开一个到 SQL Server Express 父实例(默认情况下是 .\SQLEXPRESS)的连接。
SQL Server Express 检测到已经设置了 User Instance 选项且该用户没有用户实例。
将 master 和 msdb 系统数据库文件复制到用户的目录下。在 Sally 的示例中,该目录为: C:\Documents and Settings\Sally\Local Settings\Application
Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS
这些文件是从一个在安装父实例时创建的模板目录复制的。用户实例启动后,tempdb、日志和跟踪文件被写入这个相同的用户目录。
父实例模拟正在打开该连接的 Windows 用户,并且启动一个以该用户身份运行的 sqlservr.exe 副本。系统数据库的位置作为参数传递。生成实例的名称。例如: 69651E0A-5550-46。
为新实例创建一个命名管道数据库连接。该名称基于实例名。例如:
\\.\pipe\69651E0A-5550-46\tsql\query.
将 AttachDBFilename 参数中指定的数据库文件附加到新实例,并用该文件的完整路径命名该文件:
[C:\MYDBPROJECTS\TESTVB1\TESTVB1\DATABASE1.MDF]
命名管道的名称传回到正在打开连接的 SqlClient。
SqlClient 接收到该连接的名称后,关闭到父实例的连接。它使用返回的命名管道名打开一个到该用户实例的新连接。
一旦为特定用户创建了用户实例,就会保留系统数据库和命名管道。因此,在第一次连接后,后续连接就只需执行后两步操作了。
关闭到该实例的最后一个连接后,启动的 sqlservr.exe 进程还会继续运行一段时间。因此,如果打开其他连接,则不需要重新启动该进程。继续运行的时间长度是由 sp_configure 选项“用户实例超时”设置的。默认情况下,时间长度设为 60 分钟,但是您可以用 sp_configure 命令更改它。
此版本的 SQL Server 不支持用户实例登录标志
运行时可能会遇到错误“此版本的 SQL Server 不支持用户实例登录标志”,前面说了用户实例仅在 SQL Server 的 Express Edition 内运行,如果不是 Express 版本,就不能将 User Instance 设置为 True,或将其去掉。

看了上面的文章感觉这个实例还挺复杂呵呵,

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

ok,我们再来看一下本机mssqlserver实例的情况:

首先启动本机mssqlserver实例,这里为了避免sqlexpress与mssqlserver的端口号1433冲突,先运行net stop mssql$sqlexpress关闭免费版本的实例后再启动mssqlserver:

在数据库中按如下步骤建库建表,代码:

View Code
 1 use master 
2 go
3 if exists(select * from sys.databases where name='test')
4 drop database test
5 go
6 create database test
7 go
8 use test
9 go
10 drop table employee
11 create table employee(
12 empId int identity(1,1) primary key,
13 empName varchar(20) not null,
14 empAge int null,
15 empTel varchar(20) null
16 )
17 go
18 insert into employee(empName,empAge,empTel) values('admin',20,'13500002458')
19 insert into employee(empName,empAge,empTel) values('scott',28,'13800002458')
20 insert into employee(empName,empAge,empTel) values('peter',36,'15900002458')
21 insert into employee(empName,empAge,empTel) values('jim',32,'15800002458')
22 insert into employee(empName,empAge,empTel) values('tom',25,'13600002458')
23 insert into employee(empName,empAge,empTel) values('lily',18,'13900002458')
24 select * from employee

然后修改Program.cs代码,来看一下连接字符串的四种写法:

View Code
 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data.SqlClient;
6
7 namespace AdoNetTempl
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 TestSqlConnectionString();
14 Console.ReadKey();
15
16 }
17 public static void TestSqlConnectionString()
18 {
19 //本例中使用本机服务器(Data Source=localhost;),本机可以写"."或"localhost"或"local",它们的效果是一样的。
20 //数据库实例为mssqlserver,不是mssql$sqlexpress
21 //1.使用windows身份验证(Integrated Security=true;),数据库(Initial Catalog=test;)
22 string strCon1 = "Data Source=LocalHost;Initial Catalog=test;Integrated Security=true;";
23
24 //2.使用sa管理员身份登录,需要写用户名和密码(uid=sa;pwd=123),数据库(Initial Catalog=test;)
25 string strCon2 = "Data Source=.;Initial Catalog=test;uid=sa;pwd=123";
26
27 //3.使用SqlConnectionStringBuilder这个类来生成连接字符串
28 SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
29 scsb.DataSource = ".";
30 scsb.InitialCatalog = "test";
31 scsb.IntegratedSecurity = true;
32 string strCon3 = scsb.ConnectionString;//strCon3和strCon4是一样的
33
34 //4.使用工具->连接到数据库向导生成连接字符串
35 string strCon4 = "Data Source=.;Initial Catalog=test;Integrated Security=True";
36
37 SqlConnection con = null;
38 SqlCommand cmd = null;
39 SqlDataReader sdr = null;
40 try
41 {
42 con = new SqlConnection(strCon1);
43 cmd = con.CreateCommand();
44 cmd.CommandText = "select empName from employee";
45 con.Open();
46 sdr = cmd.ExecuteReader();
47 while (sdr.Read())
48 {
49 Console.WriteLine(sdr[0]);
50 }
51 }
52 catch (Exception ex)
53 {
54 Console.WriteLine(ex.Message);
55 }
56 finally
57 {
58 sdr.Dispose();
59 cmd.Dispose();
60 con.Dispose();
61 }
62 }
63 }
64 }


关于第四种使用字符串生成向导工具步骤如图:

下一步在服务器名处输入:"."代表本机,使用windows身份验证,如果使用SQL Server身份验证需要输入用户名和密码,然后选择要连接的数据库,这里为test。

 接着点击测试连接,如果成功则提示:

 

 点击高级按钮,就可得到连接字符串了:

将其拷贝到程序代码中即可。运行程序:

 补充下连接字符串的说明:

Data Source=服务器名(如果连接到本地数据库实例,服务器名可以写成.或者localhost或者local)

Initial Catalog=数据库名

使用特定的用户名密码连接:User ID=用户名;Password=密码(User ID可以简写为uid Password可以简写为pwd)

最终结果:Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Pwd=密码;

连接SQLServer需要引用 System.Data.SqlClient命名空间

连接Oracle 需要引用System.Data.OracleClient命名空间

posted @ 2011-12-16 08:31  keepLearning...  阅读(325)  评论(3编辑  收藏  举报