本文共 6720 字,大约阅读时间需要 22 分钟。
ADO.NET就是一组类库,这个类库可以让我们通过程序的方式访问数据库。
断开式数据操作
先体验一下如何使用ADO.NET在vs中连接数据库,并操作。
我现在仅仅是为了创建连接,为了简单,首先创建一个“控制台应用程序”的项目:/*连接数据库的基本步骤如下:
1、创建连接字符串——用来表示连接某服务器的某数据库实例,以及用户名和密码 2、创建连接对象 3、打开连接(如果打开数据库连接没有问题,表示连接成功。) 4、关闭连接(释放资源) */
#region 1.创建连接字符串/*连接字符串包括以下几个部分:1、data source:服务器实例(可填:ip,localhost,.(英文的句号),计算机名称等)2、Initial Catalog :初始化连接的数据库实例名称。3、Integrated Security: 如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,也就是使用“windows 身份验证”连接。 如果integrated security=false,或者不写,表示一定要输入正确的数据库登录名和密码。*///string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=true";//string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=SSPI"; //string constr = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456";// string constr = "Data Source=.;Initial Catalog=CRB_TPM;userid=sa;password=123456";string constr = "data source=.;database=CRB_TPM;uid=sa;pwd=123456"; #endregion
因为我们创建完连接使用后,需要释放资源,为了方便,我们使用using ,关于using 的用法详见:补充2
#region 2.创建连接对象//using 类似于使用try finally 方法,最后使用using (SqlConnection con=new SqlConnection(constr))//将鼠标定位到SqlConnection单词上,shift+alt+F10 可以查看需要导入的命名空间{ }#endregion
using (SqlConnection con=new SqlConnection(constr))//将鼠标定位到SqlConnection单词上,shift+alt+F10 可以查看需要导入的命名空间{ //3、测试打开连接: con.Open(); //4、关闭连接,并且释放资源 //con.Close();//可以不写,因为Dispose中调用了close方法。 //con.Dispose();//因为我们使用的是using 的方式,所以不需要使用手动的Dispose }
using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { /*连接数据库的基本步骤如下: 1、创建连接字符串——用来表示连接某服务器的某数据库实例,以及用户名和密码 2、创建连接对象 3、打开连接(如果打开数据库连接没有问题,表示连接成功。) 4、关闭连接(释放资源) */ #region 1.创建连接字符串 /*连接字符串包括以下几个部分: 1、data source:服务器实例(可填:ip,localhost,.(英文的句号),计算机名称等) 2、Initial Catalog :初始化连接的数据库实例名称。 3、Integrated Security: 如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,也就是使用“windows 身份验证”连接。 如果integrated security=false,或者不写,表示一定要输入正确的数据库登录名和密码。 */ //string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=true"; //string constr = "Data Source=.;Initial Catalog=CRB_TPM;integrated security=SSPI"; string constr = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456"; #endregion #region 2.创建连接对象 //using 类似于使用try finally 方法,最后使用 using (SqlConnection con=new SqlConnection(constr))//将鼠标定位到SqlConnection单词上,shift+alt+F10 可以查看需要导入的命名空间 { //3、测试打开连接: con.Open(); Console.WriteLine("成功打开资源。注意:如果con.open() 失败,则无法执行此句打印代码。");//如果con.open() 失败,则无法执行此句代码。 //4、关闭连接,并且释放资源 //con.Close();//可以不写,因为Dispose中调用了close方法。 //con.Dispose();//因为我们使用的是using 的方式,所以不需要使用手动的Dispose } #endregion Console.WriteLine("关闭连接释放资源。"); Console.readkey(); } }}
用过ADO.NET向表中插入一条语句,具体流程代码中均有体现
using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { #region 通过ADO.NET 向表中插入语句 //1、创建连接字符串 string ConStrForInsert = "Data Source=.;Initial Catalog=CRB_TPM;uid=sa;pwd=123456"; //2、创建连接对象 using (SqlConnection con=new SqlConnection(ConStrForInsert)) { //3、打开连接 //con.Open();//不建议在这里打开连接对象(连接对象最晚打开,最早关闭,节省资源) //编写slq语句 string sql = " insert into Log(id,Title,[Type],WriteTime,UserID)values('03B2C499-2BEE-4DAA-83E3-0000DB028819','插入语句','insert测试',GETDATE(),'07B2C499-2BEE-4DAA-83E3-0000DB028819')"; //4、创建一个执行sql语句的对象(命令对象)sqlcommand using (SqlCommand cmd=new SqlCommand(sql,con)) { // 打开连接(连接对象最晚打开,最早关闭,节省资源) con.Open(); //开始执行sql语句 int r = cmd.ExecuteNonQuery(); Console.WriteLine("成功插入{0}行数据",r); Console.WriteLine("点击任何按钮继续执行"); Console.ReadKey(); #region 补充:以下三种方式均可执行sql语句增删改查语句。 //cmd.ExecuteNonQuery();//适用于insert、update、delete语句中,返回受影响的行数。 //cmd.ExecuteScalar();//适用于返回结果集中只有单个结果的时候,即第一行第一列的值,其他的值忽略。 //cmd.ExecuteReader();//适用于查询并返回多行多列的时候。 //ExecuteNonQuery():只有执行insert、update、delete语句的时候,返回int类型的值,表示受影响的行数,执行其他的sql语句成功后返回-1 //ExecuteScalar() :当sql语句执行的时候,如果是聚合函数(例如:select count(1) from T_user),那么ExecuteScalar()返回的不可能是null,因为聚合函数不可能是null。但是如果sql语句不是聚合函数,那么ExecuteScalar()方法有可能返回null,所以在使用ExecuteScalar()的返回值的时候,需要先判断是否为null #endregion } #region 类似SqlCommand cmd=new SqlCommand(sql,con)的写法 //using (SqlCommand cmd = new SqlCommand()) //{ // cmd.CommandText = sql; // cmd.Connection = con; //} #endregion } #endregion } }}
默认情况下,Integrated Security 属性为 False ,这意味着将禁用Windows身份验证。如果没有显式地把这个属性的值设置为True,连接将使用SQL Server身份验证,因此,必须提供SQL Server用户ID和密码。Integrated Security属性还能识别的其他值只有SSPI(Security Support Provider Interface,安全性支持提供者接口).在所有的Windows NT操作系统上,其中包括Windows NT 4.0、2000、XP,都支持值SSPI。它是使用Windows身份验证时可以使用的惟一接口,相当于把Integrated Security 属性值设置为True。
1.using指令。using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到。
例如:using System; 一般都会出现在*.cs中。 2.using别名。using + 别名 = 包括详细命名空间信息的具体的类型。 这种做法有个好处就是当同一个cs引用了两个不同的命名空间,但两个命名空间都包括了一个相同名字的类型的时候。当需要用到这个类型的时候,就每个地方都要用详细命名空间的办法来区分这些相同名字的类型。而用别名的方法会更简洁,用到哪个类就给哪个类做别名声明就可以了。注意:并不是说两个名字重复,给其中一个用了别名,另外一个就不需要用别名了,如果两个都要使用,则两个都需要用using来定义别名的。 例如: using aClass = NameSpace1.MyClass; using bClass = NameSpace2.MyClass; 3.using语句,定义一个范围,在范围结束时处理对象。 场景: 当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。 要达到这样的目的,用try…catch来捕捉异常也是可以的,但用using也很方便。 例如: using (Class1 cls1 = new Class1(), cls2 = new Class1()) { // the code using cls1, cls2 } // call the Dispose on cls1 and cls2