我一直在搜索与(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是我数据库中的一个表。
任何帮助或意见都将不胜感激。
答案 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];
}
}