实例:在一个电脑上可以装多个Sqlserver’服务器(不严谨) 区分同一个电脑上的不通婚的数据库
ADO.net:1.SYSTEM.DATA 命名空间下类的集合的统称,用于操作 连接数据库的 它提供了统一的编程接口,可以操作不同的数据库
数据库实例:默认实例(MSSQLSEVER)和命名实例(MYSQLSERVER)如果不写实例名称就会去连接默认实例,如果要连接命名实例,就必须写上命名实例的名称 用于区分同一台电脑上的不同数据库软件
端口:每一种对外提供的服务都提供端口web:80 sqlserver:1433
Server=127.0.0.1 本机
Connection 连接通道
a.目的
b.账户密码
c.门牌号
1 string connSTR = "Server=127.0.0.1;DaTaBaSe=ItCast;Uid=sa;Pwd=12345"; 2 3 string connSTR2 = "Server=.;DaTaBaSe=ItCast;Uid=sa;Pwd=12345"; 4 5 SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();//连接字符串生成器 6 7 scsb.DataSource = ".";//指定服务器地址 8 9 scsb.IntegratedSecurity = true;//使用windows身份验证 10 11 scsb.InitialCatalog = "Itcast";//指定要连接的数据库 12 13 SqlConnection connn = new SqlConnection(scsb.ToString()); 14 15 string connStrr = "Data Source=.;Initial catalog=数据库名;integrated Security=true"; 16 17 18 19 //1、创建连接通道 20 21 SqlConnection conn = new SqlConnection(); 22 23 //2、为连接字符串指定连向哪去 以及什么数据库 以及权限信息 24 25 string connStr = @"Server=.;Database=GzItCast;Uid=sa;Pwd=Chenjin064239"; 26 27 conn.ConnectionString = connStr; 28 29 //3、准备执行sql命令 这个命令就是在数据库服务器执行的sql语句 所以要符合sql语法 30 31 //命令是一个字符串 32 33 string strCmd = "insert into Classes values('广州三期',50,NUll,default)"; 34 35 //创建命令对象 必须要为这个对象指定要执行什么命令 以及走哪条通道 36 37 //通过连接通道来创建命令对象,这时候就不用为命令对象指定连接通道 38 39 //SqlCommand mysqlcmds = mysqlconn.CreateCommand(); 40 41 SqlCommand cmd = new SqlCommand(); 42 43 cmd.CommandText = strCmd;//指定命令 44 45 cmd.Connection = conn;//走哪条通道 46 47 //打开连接通道 48 49 conn.Open(); 50 51 int res = cmd.ExecuteNonQuery();//执行非查询的命令 返回的时执行时受影响的行 52 53 //(不管是什么语句此处也可以使用cmd.ExecuteScalar()也是可以在数据库执行的,ExecuteNonQuery()方法可以返回执行完命令后受影响的行数,ExecuteScalar()返回的是结果集的首行首页,如果是空的结果集返回的是null) 54 55 //判断返回的行数用来判断执行是否成功 56 57 conn.Close(); 58 59 if (res >= 1) 60 61 { 62 63 Console.WriteLine("OK"); 64 65 } 66 67 else 68 69 { 70 71 Console.WriteLine("Fail"); 72 73 } 74 75 Console.ReadKey();
在本机访问 会使用ShareMemor(共享内存) TCP/ip反而不用
ADO.NET组成
- 第一部分:数据提供程序(常用类)
– Connection(连接通道),用来连接数据库
– Command(命令对象),用来执行SQL语句(增删改,查询单个值)
– DataReader(数据读取器)只读、只进的结果集,一条一条读取数据(StreamReader微软的类库中这些Reader的使用方式都差不多)
– DataAdapter(数据适配器),一个封装了上面3个对象的对象。
- 第二部分:数据集(DataSet),临时数据库。
– 断开式数据操作
ADO.NET中的其他常见类
- ConnectionStringBuilder//自动生成连接字符串
- Parameter//带参数的SQL语句
- Transaction//在ADO.NET中使用事务
- 与DataSet相关的类:
– *DataView//视图类,DataTable中的数据以不同的视角查看
– *DataRowView//DataView中的行。
– DataTable //DataSet中的数据表
– DataRow//DataTable中的行
– DataColumn//DataTable中的列
– *DataRealation//DataTable与DataTable的关系
– *Constraint//DataTable中建立的约束
Connection:
1、Connection应用程序与数据库之间的连接通道
2、SqlConnection连接通道会默认情况下使用连接池,连接池的作用就是当需要创建1个连接通道的时候会去这个连接池里面根据连接字符串找是不是有相同的连接对象,如果有则直接返回不会再去重新创建对象 如果没有则创建对象返回 当使用完这个对象后 会放回连接池
3、默认是使用连接池的
4、//以下是使用不连接池的 效率很低
string connStr = @"Server=.;Database=GzItCast;Uid=sa;Pwd=Chenjin064239;pooling= false";
5、清空连接池: SqlConnection.ClearAllPools();清空连接池里的所有的连接对象
6、SqlConnection.ClearPool(conn);清空指定的连接对象
7、一般情况下读建议使用连接池
8、conn.State State 用来表示连接通道的状态
9、State.Close 相当于设置1个路障
10、conn.Dispose() 不是真正的释放资源,内部调用了close(),并清空了连ConnectionString(连接字符串),其实是将对象放到连接池中,等到再次调用时就不用另外新建一个对象
11、连接其他服务器:1.关闭防火墙 2.TCP,IP协议要开启 3.代理服务要开启
连接字符串的语法如果错误,则在创建连接通道的时候就会报错,若语法没错而属性值错误,则在open时报异常,连接数据库是在Open()时打开,如果连接字符串的关键字写错 在给通道的ConnectionString属性赋值的时候报错
12、conn.StateChange事件,在连接通道的状态发生改变的时候被触发
//conn.StateChange += conn_StateChange; +=号再加两次tab键可以
13、使用Using 来管理
14、//执行多条Sql语句 可以用分号隔开
mysqlcmd.CommandText = "insert into Classes values('广州三期',50,NUll,default);Update Classes set [Name]='广州ee期' where Id=8;Delete from Classes where Id=10";
Command
- 操作Sql Server数据库使用SqlCommand对象,SqlCommand表示向服务器提交的一个命令(SQL语句等) , CommandText属性为要执行的SQL语句.
- 创建SqlCommand对象:
– 1.通过new关键字创建
– 2.通过IDbConnection.CreateCommand()方法创建(编写通用代码的时候使用(多态))
- 常用的三个方法
– ExecuteNonQuery() 执行对数据库的增删改,返回受影响的行数,适合:insert、delete、update(对于其他语句返回-1)
– ExecuteScalar() 执行查询,返回结果集的首行首列
– ExecuteReader() 执行查询,返回DataReader对象
- StatementCompleted事件
– 每条SQL语句执行完毕之后触发。
– 多条语句同时执行(用分号隔开),如何获取每条语句所影响的行数?//实际返回值为每条语句所影响的行数的和。
– StatementCompleted事件是每执行完1条语句就触发一次 e.RecordCount 用来返回完成的语句受影响的行数
ExecuteScalar
- SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型。//ExecuteScalar()方法内部也是调用ExecuteReader()实现的。
– cmd.CommandText = "select count(*) from student";int i = Convert.ToInt32(cmd.ExecuteScalar())
– cmd.CommandText = "select getdate()"; DateTime dt = Convert.ToDateTime(cmd.ExecuteScalar());
- 得到自动增长字段的主键值,在values关键词前加上output inserted.Id,其中Id为主键字段名。执行结果就试插入的主键值,用ExecuteScalar执行最方便。(output语句使用的是inserted、deleted两个临时表)
– cmd.CommandText =“insert into class(cName,cDescription) output inserted.classId values(‘高三一班’,‘描述’)”;
– int i = Convert.ToInt32(cmd.ExecuteScalar());
ExectueReader方法:
由cmd调用 返回1个SqlDataReader对象 摩托车
SqlDataReader reader=cmd.ExecuteReader();//cmd.ExecuteReader()执行了查询语句,只不过这个查询语句返回的结果集是存在数据库服务端的
while(reader.Read()) //reader.Read()返回布尔类型
{
Console.WriteLine(reader[这里可以传入int类型或者列名别名])
//reader[]索引器里面的int string都是针对结果集,如果结果集没有则报错,每调用一次方法指针向后移一位,然后尝试读取数据,如果有数据就返回TRUE,并将当前行的数据封装在reader对象中,通过索引器的方式访问,如果没有读取到数据则返回false
int i=reader.GetOrdinal("id")可以取得id列的下标针对结果集的比较少用
DateTime dt= Convert.ToDateTime(reader["AddTime"]);将结果集的结果转换为指定类型
reader.GetInt32() 更快捷的将指定列转换为指定类型各种Get方法
}
SqlDataReader 是一个在线读取的功能,读完前不能关闭通道,是1个只进的读取器,逐行只进读取,如果遇到null(数据库中的null为不知道)那么打印空字符串
BindingSource bs=new BindingSource (); 声明BindingSource 对象
bs.DataSource=reader; 设置bs对象的数据源属性
dgvData.DataSource=bs;再将BS对象赋给dgvData的DataSource属性
reader.Close();//读取器也是要关闭的,而且是在连接通道关闭之前关闭
conn.close();
多个reader的方法
reader.NextResult();//读取下个结果集
while(reader.Read())
{
cw("reader["列名"]");
}
SqlDataReader使用注意事项
- 返回reader后数据在哪里?
– 数据库服务器缓存 是在服务器缓存中读取数据
– SqlDataReader是只进的在线读取器
- 当使用DataReader的时候必须保证Connection为Open状态。
- reader只读(不能通过reader修改数据。)、只进
– reader每次读取一条就释放一条所以只能向前不能后退
– 由于功能有限,所以读取速度很快,适合从数据库中读取大量数据
- 使用reader根据列索引读取列数据而不是列名(即使是使用了列名索引区读取数据,内部也是通过列名找到对应列的下标,再返回)
- 使用强类型的GetString()、GetInt32、GetFloat(1)、GetDouble()….
- 数据库中的类型与C#的不太一样,数据库中的float,得用c#的GetDouble()来获取。
- IsDbNull()
- 如果返回多个结果集则用NextResult()方法。