# 1. 前幾代模型
https://my.oschina.net/u/1772925/blog/420054
ODBC位于數據訪問的最底層,OLEDB次之,ADO位于最上層。
我們的應用程序可以通過三種方式訪問數據庫,分別是:
- 應用程序——ODBC——數據庫;
- 應用程序——OLEDB——ODBC——數據庫;
- 應用程序——ADO——OLEDB——ODBC——數據庫。

在用到數據庫跟 Microsoft相關辦公軟件(Excel Word等,或者是access數據庫)對接的時候,需要用到oledb這個對象。
## sqlcommand oledbcommand 區別
如果針對的是sql數據庫,則用sqlcomMand 更好。如果不一定是sql數據庫,比如有可能是access oracle數據庫,則可用oledbcommand.
# 2. ADO.NET對象模型
## 模型
包括:
* Data Table
* 數據集 DataAdapter DataReader
* Command
* 數據鏈接 Connection// 提供與數據庫的連接功能

## 命名空間
使用時需要加載以下命名空間:
```
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;
```

## connection 數據連接對象
> 所有數據庫的訪問都是從數據連接開始的
連接sql數據庫: `"server = 服務器名; database = 數據庫名; uid = 用戶名; pwd = 密碼"`
如果是用 windows 賬號登錄,則可以`"server = 服務器名; database = 數據庫名; integrated = SSPI"`
如果是連接 access 數據庫:`"provide = 提供者; datasource = access文件路徑"`


邏輯是:如果要連接到數據庫,則需要創建一個連接字符串(比如命名為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 內輸入代碼如下:

```
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 未連接";
}
```

> - 關鍵是輸入以下信息(可以在sql sercer 2017配置管理器 中找到)
> - server => 一般是服務器的名字,若有斜杠,則需要多輸入一個反斜杠
> - user id => 一般是 sa
> - 密碼
> - 數據庫名稱 => 比如本例中的 amy
## 關于查找上面信息:
在ssms中打開。user id 一般是后面的“CA9A\zyt”,但我們一般寫 sa。

## 關于 TCP/IP 設置:
[sql server 部分參考](http://www.hmoore.net/amy326/sql_server/667992)
需在sql server 2017配置管理器中將服務器實例(也就是mssqlsercer)中的TCP/IP IP地址設置成啟用。這里的意思是,允許外部通過服務器訪問數據庫。

# 3. Command對象
## 常用屬性
CommandType
CommandText
CommandTimeOut
Connection
Parameters

## 常用方法
ExecuteNonQuery ——常用,執行非 select 命令,比如增、刪、改查等功能;
ExecuteScalar——執行 select 命令中的 count 或 sum 等函數;
ExecuteReader ——執行 select 命令

## command操作數據
> 執行完數據庫操作時一定要關閉數據庫連接。使用`conn.Close()`語句。
幾個常用命令:



```
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();
```
> 注意表達,有單引號,有雙引號,有加號,有括號

## command 調用存儲過程
存儲過程詳見:
[http://www.hmoore.net/amy326/sql_server/675379](http://www.hmoore.net/amy326/sql_server/675379)
比直接用一般的 sql 語句更安全。

這些變量應該要已經在dbo數據庫-存儲過程中添加。

## 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 都是對象

- 幫助文檔 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互相轉化