在 C# 中使用 Access 数据库?

Posted

技术标签:

【中文标题】在 C# 中使用 Access 数据库?【英文标题】:Using Access databases in C#? 【发布时间】:2012-04-23 01:56:56 【问题描述】:

如何在 C#(控制台应用程序,而不是 web asp.net)中使用 Microsoft Access (.accdb) 数据库?根据我的阅读,我需要使用ADO.NET,但我真的不知道如何在 C# 控制台应用程序中执行此操作。在带有mysqlphp 中,我正在寻找mysqli_construct 任何人都可以为我指出一个可以帮助我的教程或文档吗?我正在尝试使用它来存储和访问我的非 Web、非 ASP.NET 应用程序的数据,如果这有任何改变的话。

谢谢!

【问题讨论】:

ADO.NET 就是 ADO.NET,不管它是否在 ASP.NET 内部。您仍然可以使用 Web 示例,只需忽略与 HTTP 请求和响应相关的任何内容。 谢谢,@R0MANARMY,只是我不确定,我想确保你们有尽可能多的信息;) 【参考方案1】:

看到这个walkthrough for using ADO.NET to edit an Access database。

现在,虽然该示例使用的是 Web 应用程序,但不用担心,所使用的类仍然适用于控制台应用程序。

您需要使用的主要类是:

OleDbConnection OleDbCommand OleDbDataReader

以上类的文档都有控制台应用示例的代码示例。

下面是用于控制台应用的代码 sn-p(记得添加:using System.Data.OleDb;

string connectionString = 
    @"Provider=Microsoft.Jet.OLEDB.4.0;" +
    @"Data Source=C:\path\to\your\database.mdb;" +
    @"User Id=;Password=;";

string queryString = "SELECT Foo FROM Bar";

using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbCommand command = new OleDbCommand(queryString, connection))

    try
    
        connection.Open();
        OleDbDataReader reader = command.ExecuteReader();

        while (reader.Read())
        
            Console.WriteLine(reader[0].ToString());
        
        reader.Close();
    
    catch (Exception ex)
    
        Console.WriteLine(ex.Message);
    

另外,刚刚注意到您明确提到了 .accdb 数据库。为此抓住Microsoft Access Database Engine 2010 Redistributable。然后需要将连接字符串中的提供程序更改为:Microsoft.ACE.OLEDB.12.0(有关更多信息,请参阅该链接中的注释)。

【讨论】:

【参考方案2】:

只需使用System.OleDb。这是我使用的一个小类

首先,将数据库文件放在 App_Data 中

web.config

<connectionStrings>
    <add name="MyConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DatabaseName.accdb" providerName="System.Data.OleDb"/>
</connectionStrings>

App_Code/DataAccess.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;

public class DataAccess



    #region "Public Methods"

    public static DataTable GetTableFromQuery(string query, Dictionary<string, object> parameters, CommandType commandType)
    
        DataTable dataTable = new DataTable();
        using (OleDbConnection conn = GetConnection()) 
            using (OleDbCommand cmd = new OleDbCommand(query, conn)) 
                cmd.CommandType = commandType;
                if (parameters != null) 
                    foreach (KeyValuePair<string, object> parameter in parameters) 
                        cmd.Parameters.AddWithValue(parameter.Key, parameter.Value);
                    
                
                using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) 
                    adapter.Fill(dataTable);
                
            
        
        return dataTable;
    

    public static object GetSingleObjectFromQuery(string query, Dictionary<string, object> parameters, CommandType commandType)
    
        object value = null;
        using (OleDbConnection conn = GetConnection()) 
            using (OleDbCommand cmd = new OleDbCommand(query, conn)) 
                cmd.CommandType = commandType;
                if (parameters != null) 
                    foreach (KeyValuePair<string, object> parameter in parameters) 
                        cmd.Parameters.AddWithValue(parameter.Key, parameter.Value);
                    
                
                conn.Open();
                using (OleDbDataReader reader = cmd.ExecuteReader()) 
                    while (reader.Read()) 
                        value = reader.GetValue(0);
                    
                
            
        
        return value;
    

    public static int ExecuteNonQuery(string query, Dictionary<string, object> parameters, CommandType commandType)
    
        int value = 1;
        using (OleDbConnection conn = GetConnection()) 
            using (OleDbCommand cmd = new OleDbCommand(query, conn)) 
                cmd.CommandType = commandType;
                if (parameters != null) 
                    foreach (KeyValuePair<string, object> parameter in parameters) 
                        cmd.Parameters.AddWithValue(parameter.Key, parameter.Value);
                    
                
                cmd.Connection.Open();
                value = cmd.ExecuteNonQuery();
            
        
        return value;
    

    #endregion

    #region "Private Methods"

    private static OleDbConnection GetConnection()
    
        string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("MyConnectionString").ConnectionString;
        return new OleDbConnection(ConnectionString);
    

    #endregion



现在从页面调用它
var myTable = DataAccess.GetTableFromQuery("SELECT * FROM TableName", null, CommandType.Text);

【讨论】:

仅供参考,您不需要在第一个 using 语句中使用大括号。【参考方案3】:

看看OLEDB Namespace有一些简单的例子here和here。

【讨论】:

以上是关于在 C# 中使用 Access 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用 MS Access 查找字段

使用 Access 数据库在 C# 中更新

如何使用 C# 获取 Access 数据库中的列列表?

在c#中使用access数据库中的数据网格视图删除一行

如何在 C# 中使用 Access 2007 链接表管理器

如何使用 C# 在 access 数据库中实现“右外连接”查询?