C#連接Access數據庫(詳解)
做一個用VS2012的C#連接Access數據庫的備忘, SQL數據庫固然強大,有大微軟的強力技術支持,LINQ的方便操作,但是如果寫一個小程序對數據庫方面沒有什么大的要求的話,將來在數據庫方面就可以選擇使用access數據庫,這樣就能省去一定的開支.
首先,我們建一個數據庫,因為大家使用的office版本不同,有用2000的有用2003的還有用 2007或者2010的.我用的是2007,但是無論用哪個版本請把建的數據庫建為.mdb結尾的2003版本的不要建 .accdb結尾的.
建一個表,請先在設計視圖里面設計列名,主鍵以及類型等 我們這里做一個簡單的水果表,如圖
你的數據庫名為fruit.mdb,這個保存完后是一個數據庫文件,里面可以包含各種表,里面的我們建了一個表也叫fruit請區分.建完表后請另存為 2002-2003格式的.mdb文件設置好保存路徑.
_________________________________________________還是那華麗的分割線_____________________________________________________
表建完了,運行VS2012,我們做一個winform的小應用.
拖入個DataGridView和一個Button做個界面
代碼
using System.Data; using System.Data.OleDb; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace winform_access { public partial class Form1 : Form { public Form1() { InitializeComponent(); }private void button1_Click(object sender, EventArgs e) { OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\\fruit.mdb"); //Jet OLEDB:Database Password= OleDbCommand cmd = conn.CreateCommand(); cmd.CommandText = "select * from fruit"; conn.Open(); OleDbDataReader dr = cmd.ExecuteReader(); DataTable dt = new DataTable(); if (dr.HasRows) { for (int i = 0; i < dr.FieldCount; i++) { dt.Columns.Add(dr.GetName(i)); } dt.Rows.Clear(); } while (dr.Read()) { DataRow row = dt.NewRow(); for (int i = 0; i < dr.FieldCount; i++) { row[i] = dr[i]; } dt.Rows.Add(row); } cmd.Dispose(); conn.Close(); dataGridView1.DataSource = dt; } } }
這里面連接語句和SQL很像,就是把SqlConnection換成OleDbConnection,別忘了添加引用using System.Data.OleDb;
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\\fruit.mdb" 拼接字符串,
如果怕有拼寫錯誤也可以運行 視圖--服務器資源管理器--右鍵數據連接
--添加
一個Access數據庫源
並找到文件路徑
,然后生成完后在屬性里面復制字符串連接,如圖
測試鏈接 連接成功后復制粘貼到OledbConnection()里面.
如果遇到轉譯不識別 請把\處改為 \\或者 ""前面加@ 如"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\\fruit.mdb" 或者@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\\fruit.mdb"
_________________________________________________還是那華麗的分割線_____________________________________________________
如果出現 未在本地計算機上注冊“Microsoft.Jet.OLEDB.4.0”提供程序。
在菜單 “項目”的最下面 工程屬性 菜單,選擇“生成”選項卡,將目標平台由“Amy CPU”或者“*64”改成“*86”。
點擊 配置管理器 新建一個x86的
運行
_________________________________________________還是那華麗的分割線_____________________________________________________
番外篇
這里面的 if (dr.HasRows)和 while (dr.Read())
如果用
if (dr.Read()) { for (int i = 0; i < dr.FieldCount; i++) { dt.Columns.Add(dr.GetName(i)); } dt.Rows.Clear(); } while (dr.Read()) { DataRow row = dt.NewRow(); for (int i = 0; i < dr.FieldCount; i++) { row[i] = dr[i]; } dt.Rows.Add(row); }
數據少了第一條!,Read() 讀到數據返回true但是從第二條開始讀
datareader.HasRows 只是檢則庫中是否有記錄,如果有則返回true,還得再用read()讀取. datareader.read()為從數據開頭往后讀,如果庫中已讀到結尾了(可能沒有記錄)則返回false,如果用在if中,則會自動讀出一條,else里則不必再用read(),如果有while(含有read()條件),則自動從第二條開始往下讀 結論:單條可用read()檢測,多條用到while時用HasRows檢測... 聲明:SqlDataReader 提供一種從 SQL Server 數據庫讀取行的只進流的方式。無法繼承此類。 我在編寫一個小程序時遇到一個小問題: 使用SqlDataReader實例reader的HasRows判斷數據流中是否存在數據,進而執行數據的輸出操作,其中用到代碼如下 SqlDataReader reader = Command.ExecuteReader(); while(reader.HasRows) { reader.Read(); qx_Str = reader[0].ToString(); //出錯位置 } reader.Close(); sqlcon.Close(); 運行后在紅色位置報錯:在沒有任何數據時進行無效的讀取嘗試 出現這種情況很明顯是讀取器運行到的位置無數據流,無法執行數據的輸出 這時確定判斷是while處的判斷條件有誤,在MSDN文檔中查詢到: HasRows屬性 // HasRows 獲取一個值,該值指示 System.Data.SqlClient.SqlDataReader 是否包含一行或多行。 原來是出在HasRows的使用上,只要SqlDataReader存在數據流(數據流不為空)則返回的bool值為真,這樣的話,這個循環總執行(難怪使用try ..catch 假死)。數據為空時,read[0]讀取數據時,則會出現錯誤! 那么如何避免出現該錯誤呢,仍然是用HasRows屬性? 可以想到只需利用if語句取消循環狀態!! 那么要用while怎么辦呢?使用SqlDataReader實例的Read()方法,對! 讓我們認識一下Read()方法: // 摘要: 使 System.Data.SqlClient.SqlDataReader 前進到下一條記錄。 // 返回結果: 如果存在多個行,則為 true;否則為 false。 則只需將reader.Read()替換reader.HasRows執行循環,為什么行呢? SqlDataReader的默認位置在[第一條記錄前面]。因此,必須調用 Read 來開始訪問任何數據。 Read()為前進到下一條記錄。當循環執行到Read()無數據時,則循環結束!!不過還要將循環里的Read()去掉,則每循環一次前進了兩行數據。 }
FieldCount
是讀取有多少列字段,這里是返回的一個整數,讀取到的列的個數.