標籤:
做一個用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"); 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
是讀取有多少欄欄位,這裡是返回的一個整數,讀取到的列的個數.
C#串連Access資料庫(詳解)