ado.net提供了對c#連接數據庫的支持,而sql server作為各大數據庫中的其中一員對ado.net最友好。
###起步
一、下載并安裝sql server
本人安裝的是sql server2008r x64 中文版,可自行百度去下載并安裝,無需任何注意事項。
二、導入sql server到實際項目中
1、打開vs,創建一個項目,該實例創建的是控制臺項目


2、在"項目"上單擊右鍵選擇新建項,在彈出的框中選擇“基于服務的數據庫”

3、選擇數據集并點擊下一步

4、點擊完成即可,你會發現解決方案中多了一個.mdf的文件

我們點擊服務器資源管理器會看到整個數據庫的信息

5、下面來創建新表
右鍵單擊“表”文件夾選擇添加新表,在彈出的選項卡內可以進行建表的操作。
在名稱前面一格右鍵可以設置主鍵外鍵等

點擊每一列在右下角都會有該列的詳細信息,按規范來講每個表都應該有id列,我推薦將id設為標識(自增),默認增量是1。為什么這么做?因為id往往作為一個表的主鍵,通常也是其他表的外鍵,將它設為自增后我們在插數據的時候不需要關系id,它自己會隨著數據的增多而自增

6、完成
在這里可以把Table替換成自己需要的表名(這里有個坑,先記一下)

建表完畢后,點擊左上角的更新,更新數據庫,然后刷新一下數據庫,就可以看到表已經新建

三、編寫代碼
1、右鍵單擊“引用”,選擇添加引用,選中System.Configuration,點擊確定
2、將下面三個引用添加到最上面
``using System.Data;
using System.Data.SqlClient;
using System.Configuration;``
3、鏈接數據庫
這里先說一個坑,在連接數據庫之前必須輸入一下代碼,否則在查看數據庫數據的時候會報“sql server版本不兼容”的問題,因為存在控制臺應用中數據庫的鏈接路徑的bug,聽說asp.net web項目不會出現這種問題,不過我還沒試,為了以防萬一還是先寫上吧
~~~
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release"))
{
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
}
~~~
4、創建數據庫實例
~~~
string strConnection = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True";
~~~
上面那一串字符串是哪來的?我們打開App.config配置文件,add name就是我們剛剛導入數據庫的時候自動添加的。name就是這一整串字符串的名字,稍后會用到。connectionString就是記錄了鏈接數據庫的各種信息,我們把connectionString里面的內容復制一下放到一個字符串中,也就是上面的strConnection,記得加上一個@,這樣遇到特殊字符"\"就不必額外轉義了
~~~
<connectionStrings>
<add name="str"
connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
~~~
5、鏈接數據庫,SqlConnection就是數據庫實例,它接收一個字符串
~~~
SqlConnection objConnection = new SqlConnection(strConnection);
~~~
6、打開鏈接
~~~
objConnection.Open();
~~~
7、創建一個數據庫的查詢對象,用于攜帶sql語句
~~~
SqlCommand sqlc = objConnection.CreateCommand();
~~~
8、添加sql語句(注意,如果要插入的是字符串要用單引號括起來,因為整個sql語句本身就是字符串,字符串中的字符串用的是單引號)
~~~
sqlc.CommandText = "Insert into text(name,age) values ('qinchuan',22)";
~~~
9、執行該sql語句(像插入刪除這類不反回結果的操作使用ExecuteNonQuery方法,也就是非查詢語句)
~~~
sqlc.ExecuteNonQuery();
~~~
10、現在來測試一下,點擊運行,運行結束后在“服務器資源管理器”中找到剛剛操作的表,右鍵單擊“顯示表數據”

數據插入成功,你會發現sql語句中并沒有插入id,但是id自動插入了,而且如果有多個數據,id是自增的,這就是我剛剛說的要把id設為標識的好處,我們不必關心id的值是多少了。
附上源代碼
~~~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release"))
{
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
}
string strConnection = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True";
SqlConnection objConnection = new SqlConnection(strConnection);
objConnection.Open();
SqlCommand sqlc = objConnection.CreateCommand();
sqlc.CommandText = "Insert into text(name,age) values ('qinchuan',22)";
sqlc.ExecuteNonQuery();
Console.ReadKey();
}
}
}
~~~
11、如果我的sql語句是例如select的查詢語句呢?也就是說我需要對返回的結果進行操作怎么辦?我們這時候就不能使用ExecuteNonQuery了,舉個例子:
先來接收用戶的輸入
~~~
Console.WriteLine("請輸入用戶名");
string username = Console.ReadLine();
~~~
根據用戶輸入的用戶名來查詢數據庫,注意我sql語句的書寫方式
~~~
sqlc.CommandText = "select * from M_User where username='" + username+"'";
~~~
使用SqlDataReader對象來接收返回的數據
~~~
SqlDataReader sdr = sqlc.ExecuteReader();
~~~
我們假設現在表中有username字段和password字段,我想通過用戶輸入的用戶名找到該用戶名相應的密碼怎么辦?使用GetType(Type根據你數據庫字段類型而定,這里的password數據庫中存入的是字符創varchar,所以用string),GetType的參數是一個整數,代表返回結果集中第幾列的數據,SqlDataReader的GetOriginal的參數是一個字符串,代表結果集中該字符串的位置。比如查找qinchuan這個用戶,他的密碼在第三列,通過GetOriginal("password")可以拿到index為2,然后GetString(2)就可以拿到它的密碼了
~~~
string rpassword = sdr.GetString(sdr.GetOrginal("password"));
~~~
###優化
我們在鏈接數據庫的時候將App.config文件中的那一串字符串拷貝過來保存到一個字符串類型變量中,然后將該字符串作為參數傳入到SqlConnection中
~~~
string strConnection = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True";
SqlConnection objConnection = new SqlConnection(strConnection);
~~~
這種方法乍一看很簡單,但是當文件越來越多的時候,如果數據庫鏈接的字符串有變動,那么要改的地方會非常多,有一種十分漸簡便的方法,我們可以直接使用配置文件中的信息,不必非要把它復制過來,還記得我之前說要引入System.Configuration這個引用了嗎?我們可以使用ConfigurationManager來得到相應的配置文件的信息
~~~
ConfigurationManager.ConnectionStrings["str"].ToString()
~~~
上面的“str”就是我的配置文件的name

對比一下這兩種方法,你會發現下面的方法很簡單,當有變動的時候只需要更改配置文件里面的信息就可以了
~~~
SqlConnection objConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["str"].ToString());
~~~
還記得我之前說過的一個坑嗎?

你可以嘗試在建表的時候把表的名字設為user,你會發現當程序執行的時候會報錯:user附近有非法的標識符。這是因為user默認是sql的關鍵字,你是不能把一個關鍵字作為表名的,有兩種解決方法
1、使用“[表名]”來避免
~~~
sqlc.CommandText = "select * from [user] where username='" + username+"'"; //注意user被[]包了起來
~~~
2、換個表名
- html/css
- 不一樣的css3之Transform
- 不一樣的css3之Transition
- 不一樣的css3之Animation
- Less初學
- Sass初學
- 水平垂直居中那些事
- css優先級
- css基礎教學
- javascript
- 淺談javascript事件處理程序
- cookie,localStorage,sessionStorage的區別
- Ajax
- 說說JSON
- 數組常用的方法
- 字符串常用的方法
- 閉包之我的理解
- 常用DOM操作
- 扒一扒所謂的面向對象
- JS Blob對象
- ES6學習筆記(一)
- ES6學習筆記(二)
- 用ES6書寫React
- React+Redux實戰總結
- 基于Express搭建開發環境
- 其他
- github初學
- 輕松配置Webpack
- asp.net學習筆記
- ado.net
- 如何使用ajax進行前后端交互
- 銀行大廳自助服務系統需求分析
- 西電銀行開發手冊
- 接口
- ajax