【问题标题】:Connecting C# win32 app to Access Database将 C# win32 应用程序连接到 Access 数据库
【发布时间】:2013-05-15 08:25:04
【问题描述】:

我一直在寻找与(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 Message=标准表达式中的数据类型不匹配。 来源=Microsoft Office Access 数据库引擎 错误代码=-2147217913 堆栈跟踪: 在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult 小时) 内部异常: 。”

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

myDataAdapter.Fill(myDataSet, "QuickMem");

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

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

【问题讨论】:

  • 请提供整个堆栈跟踪,而不仅仅是消息。
  • 请显示您的 sql 命令文本(strAccessSelect 或 SQL 字符串)
  • 好的,刚刚在我的机器上安装完MS Access,现在就可以玩了……另外,为什么你的文件在2007保存为.accdb时保存为.MDB
  • 我使用了 MSDN 中的这个页面:msdn.microsoft.com/en-us/library/aa288452%28v=vs.71%29.aspx,所以我手动将它(使用另存为)保存为 MDB(2002/2003 DB)以避免复杂化,因为无论如何这对于数据库本身。

标签: c# ms-access database-connection


【解决方案1】:

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

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 字段)或您的机器配置。

对不起,这个答案作为评论可能会更好,但我无法提供这么多细节。

编辑

根据您的 cmets,请创建一个全新的 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];    
    }
}

【讨论】:

  • 尝试使用我已经拥有的东西,没有用,我会尝试重新创建您的代码....确认您的代码有效,即使链接到 Dropbox。
  • 当你说它工作时,你的意思是它使用数据库的硬编码位置或动态创建的版本工作
  • 两者,事实上,控制台应用程序运行完美,但完全相同的代码,在我的 win32 应用程序中不起作用。
  • 等一下,会启动一个 WinForm... 它工作正常。对不起,你的问题比较复杂。请创建一个新的 WinForm 并将代码粘贴到我的新编辑中
  • 它确实有效,谢谢,它必须在其他地方。现在已经足够好了,我会找到那个虫子的;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多