将C#win32应用程序连接到Access数据库

时间:2013-05-15 08:25:05

标签: c# ms-access database-connection

我一直在搜索与(MS)Access database (.mdb).

的简单连接无济于事

我在x64(64位)操作系统上使用Office 2007, Visual Studio 2010,它是一个C#Winform应用程序,应用程序以x86(32位)模式运行。

我已经能够轻松访问SQL服务器数据库,但在(MS)Access上我完全陷入困境。 我正在尝试连接到放置在Dropbox中的数据库。

我的连接代码:

//(string SQL = "select * from Quickmem";)

    public static DataTable SelectALL(string SQL)
    {
        var appDataPath = Environment.GetFolderPath(
                               Environment.SpecialFolder.ApplicationData);
        var dbPath = System.IO.Path.Combine(appDataPath, "Dropbox\\host.db");

        var lines = System.IO.File.ReadAllLines(dbPath);
        var dbBase64Text = Convert.FromBase64String(lines[1]);
        string folderPath = System.Text.ASCIIEncoding.ASCII.GetString(dbBase64Text);

// Actual path (which he correctly finds): C:\Users\<username>\Dropbox
        folderPath += "\\Agenda.mdb";

        string strAccessConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + folderPath;

        string strAccessSelect = SQL;

        DataSet myDataSet = new DataSet();
        OleDbConnection myAccessConn = null;

        myAccessConn = new OleDbConnection(strAccessConn);


        OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
        OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);

        myAccessConn.Open();


        myDataAdapter.Fill(myDataSet, "QuickMem");


        myAccessConn.Close();

        DataTableCollection dta = myDataSet.Tables;
        DataTable DT = dta[0];

        return DT;
    }

我得到的当前例外是

  

发生了System.Data.OleDb.OleDbException    消息=条件表达式中的数据类型不匹配。    Source = Microsoft Office Access数据库引擎    错误码= -2147217913    堆栈跟踪:         在System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)    的InnerException:   。”

在我的实验中,我遇到了很多问题都在同一条线上:

myDataAdapter.Fill(myDataSet, "QuickMem");

Quickmem是我数据库中的一个表。

任何帮助或意见都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我使用几乎相同的代码副本制作了以下控制台应用程序(我确实注释了一些我留给你看的行)

using System;
using System.Data;
using System.Data.OleDb;

namespace AccessDb
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = SelectALL("SELECT * FROM QuickMem");
            Console.WriteLine("Done");
            Console.ReadKey();
        }

        public static DataTable SelectALL(string SQL)
        {
            //var appDataPath = Environment.GetFolderPath(
                                   Environment.SpecialFolder.ApplicationData);
            //var dbPath = System.IO.Path.Combine(appDataPath, "Dropbox\\host.db");    
            //var lines = System.IO.File.ReadAllLines(dbPath);
            //var dbBase64Text = Convert.FromBase64String(lines[1]);
            //string folderPath = System.Text.ASCIIEncoding.ASCII.GetString(dbBase64Text);

            string folderPath = "C:\\Users\\drook\\Documents\\Database1.accdb";    
            string strAccessConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + folderPath;    
            string strAccessSelect = SQL;    
            DataSet myDataSet = new DataSet();
            OleDbConnection myAccessConn = null;    
            myAccessConn = new OleDbConnection(strAccessConn);    
            OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
            OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);

            myAccessConn.Open();    
            myDataAdapter.Fill(myDataSet, "QuickMem");    
            myAccessConn.Close();

            DataTableCollection dta = myDataSet.Tables;
            return dta[0];    
        }
    }
}

编译好。它运行正常。没有错误。请注意,我确实评论了一些行,因为我无法复制它们。

因此,在你到达数据库之前(你在创建folderPath的地方),你的代码要么是错误的,要是因为你说你现在已经硬编码,这意味着它不太可能。

故障要么是数据库本身(请注意我使用的是.accdb文件扩展名,而不是.mdb扩展名,而且我只有2个字段,ID和文本字段)或者是您的计算机配置。

对不起,这个答案可能更好,作为评论,但我不能这么详细。

修改

根据您的意见,请创建一个全新的WinForm并使用此代码 - 它将在加载时执行。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        DatabaseCheckTest();
    }

    private void DatabaseCheckTest()
    {
        DataTable dt = SelectALL("SELECT * FROM QuickMem");
        MessageBox.Show("All done");
    }

    public DataTable SelectALL(string SQL)
    {
        string folderPath = "C:\\Users\\drook\\Documents\\Database1.accdb";    
        string strAccessConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + folderPath;    
        string strAccessSelect = SQL;    
        DataSet myDataSet = new DataSet();
        OleDbConnection myAccessConn = null;    
        myAccessConn = new OleDbConnection(strAccessConn);    
        OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn);
        OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);

        myAccessConn.Open();    
        myDataAdapter.Fill(myDataSet, "QuickMem");    
        myAccessConn.Close();

        DataTableCollection dta = myDataSet.Tables;
        return dta[0];    
    }
}