0

我一直在寻找一个所谓的简单连接到一个无济于事(MS)Access database (.mdb).

我使用Office 2007, Visual Studio 2010,它是一个 C# Winform 应用程序,在 x64(64 位)操作系统上,应用程序在 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 数据库引擎 ErrorCode=-2147217913 StackTrace: at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) InnerException: 。”</p>

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

myDataAdapter.Fill(myDataSet, "QuickMem");

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

任何帮助或输入将不胜感激。

4

1 回答 1

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];    
        }
    }
}

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

因此,问题出在您的代码甚至在您到达数据库(您正在创建文件夹路径的位置)之前,但由于您已经说过您现在已经硬编码,这意味着它不太可能。

问题出在数据库本身(请注意,我使用的是 .accdb 文件扩展名,而不是 .mdb 扩展名,而且我只有 2 个字段,ID 和 Text 字段)或您的机器配置。

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

编辑

根据您的意见,请创建一个全新的 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];    
    }
}
于 2013-05-15T09:33:42.387 回答