# 1. 前几代模型
https://my.oschina.net/u/1772925/blog/420054
ODBC位于数据访问的最底层,OLEDB次之,ADO位于最上层。
我们的应用程序可以通过三种方式访问数据库,分别是:
- 应用程序——ODBC——数据库;
- 应用程序——OLEDB——ODBC——数据库;
- 应用程序——ADO——OLEDB——ODBC——数据库。
![](https://box.kancloud.cn/4f5e2aa6c2e143cdb92c32b1a646d094_461x460.png)
在用到数据库跟 Microsoft相关办公软件(Excel Word等,或者是access数据库)对接的时候,需要用到oledb这个对象。
## sqlcommand oledbcommand 区别
如果针对的是sql数据库,则用sqlcomMand 更好。如果不一定是sql数据库,比如有可能是access oracle数据库,则可用oledbcommand.
# 2. ADO.NET对象模型
## 模型
包括:
* Data Table
* 数据集 DataAdapter DataReader
* Command
* 数据链接 Connection// 提供与数据库的连接功能
![](http://ww2.sinaimg.cn/large/006tNc79gy1g431dkrcf5j30q10cudh5.jpg)
## 命名空间
使用时需要加载以下命名空间:
```
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Data.OleDb; //用于跟Microsoft对接的接口协议
using System.Data.SqlClient; //最常用
using System.Data.SqlTypes;
using System.Data.oracleClient;
```
最常用的为:
```
using System.Data;
using System.Data.SqlClient;
```
![](https://box.kancloud.cn/144b60f32e8cad03f5b0cd9b42255e6a_1078x482.png)
## connection 数据连接对象
> 所有数据库的访问都是从数据连接开始的
连接sql数据库: `"server = 服务器名; database = 数据库名; uid = 用户名; pwd = 密码"`
如果是用 windows 账号登录,则可以`"server = 服务器名; database = 数据库名; integrated = SSPI"`
如果是连接 access 数据库:`"provide = 提供者; datasource = access文件路径"`
![](http://ww3.sinaimg.cn/large/006tNc79gy1g431bdgry9j30pm0chwh8.jpg)
![](http://ww4.sinaimg.cn/large/006tNc79gy1g431critrjj30nl0bmq4x.jpg)
逻辑是:如果要连接到数据库,则需要创建一个连接字符串(比如命名为SqlStr),然后通过这个连接字符串的 connection 方法再去连接数据库
```
string SqlStr= "Server = . ; database = 审图表; uid = sa; pwd = Am******23";
SqlConnection con = new SqlConnection(SqlStr);
con.Open();
……
```
也可参看:几种身份认证模式
如果是 sqlserver 用户名密码登录,则用户名一般为 sa,server 可以直接写等于“.”。如果是用 windows 登录,则可以不用写用户名uid 或密码 pwd,但需要写"IntegratedSecurity = SSPI"。
https://blog.csdn.net/sinat_15155817/article/details/58266044
启用connection数据连接对象。比如插入控件label1和label2,如果登录了,则在label1显示“sql 数据库已登录”。如果退出了,需要在label2显示“数据库未登录”。在form1的 load 内输入代码如下:
![](https://ws2.sinaimg.cn/large/006tKfTcgy1fslk0j3vyvj30ba06it8v.jpg)
```
string SqlStr = "Server = CA9A; User Id = sa; Pwd = Am******23; DataBase = amy";
SqlConnection con = new Sqlconnection(SqlStr);
con.open ();
if( con.State == ConnectionState.Open)
{
label1.Text = "sql已连接";
con.Close();
}
if(con.State == ConnectionState.Close)
{
label2.Text = "sql 未连接";
}
```
![](https://ws4.sinaimg.cn/large/006tKfTcgy1fslkk5g96fj30sl08l3zr.jpg)
> - 关键是输入以下信息(可以在sql sercer 2017配置管理器 中找到)
> - server => 一般是服务器的名字,若有斜杠,则需要多输入一个反斜杠
> - user id => 一般是 sa
> - 密码
> - 数据库名称 => 比如本例中的 amy
## 关于查找上面信息:
在ssms中打开。user id 一般是后面的“CA9A\zyt”,但我们一般写 sa。
![](https://ws4.sinaimg.cn/large/006tKfTcgy1fslkhc41edj30pi0ciacb.jpg)
## 关于 TCP/IP 设置:
[sql server 部分参考](https://ihavenolimitations.xyz/amy326/sql_server/667992)
需在sql server 2017配置管理器中将服务器实例(也就是mssqlsercer)中的TCP/IP IP地址设置成启用。这里的意思是,允许外部通过服务器访问数据库。
![](https://ws2.sinaimg.cn/large/006tKfTcgy1fslkbg941fj30jz0ihgnx.jpg)
# 3. Command对象
## 常用属性
CommandType
CommandText
CommandTimeOut
Connection
Parameters
![](https://ws1.sinaimg.cn/large/006tKfTcgy1fsn1f7b6efj30me0ar414.jpg)
## 常用方法
ExecuteNonQuery ——常用,执行非 select 命令,比如增、删、改查等功能;
ExecuteScalar——执行 select 命令中的 count 或 sum 等函数;
ExecuteReader ——执行 select 命令
![](https://ws1.sinaimg.cn/large/006tKfTcgy1fsn1fgoodfj30jl098jt2.jpg)
## command操作数据
> 执行完数据库操作时一定要关闭数据库连接。使用`conn.Close()`语句。
几个常用命令:
![](https://ws1.sinaimg.cn/large/006tKfTcgy1fsn1pz1435j30u50ef777.jpg)
![](http://ww1.sinaimg.cn/large/006tNc79gy1g4329zko5mj30jh09ngno.jpg)
![](https://box.kancloud.cn/a7d5172cb6a82ebfa96f54e71f93447c_639x341.png)
```
sqlconnection conn = new sqlconnection("server = CA9A; database = 审图表; integrate = SSPI");
string strsql = "insert into dbo.审核信息(项目编号, 项目名称) values (' "+convert.toString( textBox1.Text)+" ', ' "+textBox.Text+" ')";
sqlcommand comm= new sqlcommand(strsql, conn);
conn.open();
comm.ExecuteNonQuery(); //执行。也就是说写了上面的 sql 语句以后,再写 executenonquery ,就表示“run!” 开始执行。这个方法用来执行 select 以外的命令。如果 sql 语句是 select,则无法使用这个方法。
conn.close();
```
> 注意表达,有单引号,有双引号,有加号,有括号
![](https://box.kancloud.cn/2ea6c08831daa643dbfc24ad7ee4e7b5_806x286.png)
## command 调用存储过程
存储过程详见:
[https://ihavenolimitations.xyz/amy326/sql_server/675379](https://ihavenolimitations.xyz/amy326/sql_server/675379)
比直接用一般的 sql 语句更安全。
![](https://box.kancloud.cn/e087846e6dfdaf66c2da996c72c976d2_1064x547.png)
这些变量应该要已经在dbo数据库-存储过程中添加。
![](https://ws1.sinaimg.cn/large/006tKfTcgy1fsrosybj6hj30a50hljss.jpg)
## DateReader 对象
没有自己的构造函数,所以要通过sqlCommand对象的ExecuteReader方法使用。比如sqlcommand对象变量命名为 sqlcmd,则需要实例化为:`sqlDateReader sqldr = sqlcmd.ExecuteReader();`
# 3. Data Table、DataSet、DataAdapter、Command Connection的关系
http://blog.sina.com.cn/s/blog_7e540ba10102vc26.html
dataReader 与 dataCommand、dataAdapter 都是对象
![](https://ws4.sinaimg.cn/large/006tNbRwgy1fx2sfbxlrzj31kw1294my.jpg)
- 帮助文档 microsoft helo viewer
- c#开发环境及visual studio安装注意事项
- c#程序基本结构-基本语法
- Q1: public static void main(String[] args) 是什么意思
- Q2: c#命名空间+Main方法
- Q3:注释+命名规则+代码规则
- Q4: c#语句 system => console
- Q5: 数据类型 .net
- Q5: 常用名字、变量、运算符
- Q6: 对话窗输入-属性
- Q7: 递归
- Q8:决策分支、条件判断语句 if 语句
- Q9:数组
- Q10:字符串
- Q11:对象、类、访问权限、静态动态函数
- Q12:方法及参数——继承于类
- Q13:构造函数
- Q14:继承——base 关键字
- Q15:多态、虚方法、接口
- Q16:创建窗体应用、控件
- Q17:Ado数据访问、连接 sqlserver 数据库
- Q18: 读取数据command + DataRead( )、DataSet + DateAdapter
- Q19: Entity Framwork、entity 与 ADO.net的区别
- Q20: 对话框、文件、文件夹
- Q21: 导入excel数据、更新到 dbo 数据库中
- Q26: 获取 excel 中每个 sheet 的表名
- Q22: 两个窗体之间数据+方法传递
- Q23: 数学对象
- Q24: c#网站编写
- Q25: visual studio2017如何查看帮助
- Q27: c# dictionary 字典对象
- Q28: 数组与dataTable互相转化