C#連接Access數據庫(詳解)


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

是讀取有多少列字段,這里是返回的一個整數,讀取到的列的個數.

 

 
         


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM