我在32位Windows 2008服务器中创建了一个在.NET 3.5中开发的Windows应用程序.在64位服务器中部署应用程序时,它显示错误"Microsoft.Jet.OLEDB.4.0'提供程序未在本地计算机上注册".
因此,作为此问题的解决方案,我已将项目的构建属性更改为X86,以便它将以32位模式构建,并在32位机器中重建项目.但是,同一个项目使用其他数据库驱动程序(DB2,SQL等)连接到其他数据库.因此,当我在64位操作系统中再次部署我的应用程序时,它会抛出异常"尝试在32位平台上加载64位程序集".
我使用Microsoft.Jet.OLEDB.4.0驱动程序读取和写入Excel(.xls)
我有一个JET以自动编号为主键的表,我想知道如何在插入一行后检索此数字.我曾想过MAX()用来检索具有最高值的行,但我不确定它有多可靠.一些示例代码:
Dim query As String
Dim newRow As Integer
query = "INSERT INTO InvoiceNumbers (date) VALUES (" & NOW() & ");"
newRow = CurrentDb.Execute(query)
Run Code Online (Sandbox Code Playgroud)
现在我知道这不起作用,因为Execute()不会返回主键的值,但这基本上是我正在寻找的那种代码.我将需要使用新行的主键来更新另一个表中的多个行.
这样做最简单/最易读的方法是什么?
这按预期工作:
SELECT "Mike" AS FName
Run Code Online (Sandbox Code Playgroud)
这失败,错误"查询输入必须包含至少一个表或查询":
SELECT "Mike" AS FName
UNION ALL
SELECT "John" AS FName
Run Code Online (Sandbox Code Playgroud)
这只是Jet/ACE数据库引擎的怪癖/限制还是我遗漏了什么?
前几天有人问过我,我想不出一个好的答案.平台可移植性与项目完全无关.
事实上,Jet有一些SQLite没有的功能,即外键.
那么有谁能想到为什么应该使用SQLite而不是Jet数据库呢?
我在古老的留言板上找到了一些代码,可以很好地从类,模块和表单中导出所有VBA代码(见下文):
Option Explicit
Option Compare Database
Function SaveToFile() 'Save the code for all modules to files in currentDatabaseDir\Code
Dim Name As String
Dim WasOpen As Boolean
Dim Last As Integer
Dim I As Integer
Dim TopDir As String, Path As String, FileName As String
Dim F As Long 'File for saving code
Dim LineCount As Long 'Line count of current module
I = InStrRev(CurrentDb.Name, "\")
TopDir = VBA.Left(CurrentDb.Name, I - 1)
Path = TopDir & "\" & "Code" 'Path where …Run Code Online (Sandbox Code Playgroud) 我们知道MS Access数据库引擎被"限制"以允许最大文件大小为2GB(或者可能内部连线被限制为少于2KB的4KB数据页的某些功率).但这在实践中意味着什么呢?
为了帮助我衡量这一点,您能告诉我可插入MS Access数据库引擎表的最大行数吗?
为了满足表的定义,所有的行必须是唯一的,因此唯一约束(例如PRIMARY KEY,UNIQUE,CHECK,数据宏等)是必需的.
编辑:我意识到有一个理论上的限制,但我感兴趣的是实际(并不一定是可行的)现实生活限制.
目前我正在考虑通过SQlite数据库替换单用户.NET C#Windows窗体应用程序上的Microsoft Jet MDB数据库的使用.
我的目标是降低Jet驱动程序的安装要求以及Jet安装损坏时的一些令人讨厌的错误(我们现在有客户报告这些错误).
我对性能的质疑是:
是否有任何性能基准测试比较MDB和SQLite对相当小的数据集?
或者是否有任何开发人员已经采取了这一步骤,并可以根据自己的经验讲述一些故事?
(我现在谷歌搜索几个小时没有成功)
更新
虽然数据库不包含那么多记录和表,但我认为性能仍然是一个问题,因为数据经常被访问.
该应用程序是一个所谓的"桌面CMS系统",它呈现HTML页面; 在渲染过程中,正在访问大量数据并且正在执行大量SQL查询.
更新2
刚刚发现这个文档表明了一些速度比较,遗憾的是没有MDB,据我所知.
更新3
根据要求,一些数字:
更新4
换句话说:我当前的MDB实现没有任何性能问题.我问这个问题是为了感觉在使用SQLite而不是MDB时性能是否相等(或更好).
我需要一个函数,它在数据库上执行INSERT语句并返回Auto_Increment主键.我有以下C#代码但是,虽然INSERT语句工作正常(我可以看到数据库中的记录,PK是正确生成的,行== 1),但id值始终为0.任何关于可能会发生什么的想法错误?
public int ExecuteInsertStatement(string statement)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement;
int rows = cmdInsert.ExecuteNonQuery();
if (rows == 1)
{
IDbCommand cmdId = connection.CreateCommand();
cmdId.CommandText = "SELECT @@Identity;";
id = (int)cmdId.ExecuteScalar();
}
return id;
}
private void InitializeAndOpenConnection()
{
if (connection == null)
connection = OleDbProviderFactory.Instance.CreateConnection(connectString);
if(connection.State != ConnectionState.Open)
connection.Open();
}
Run Code Online (Sandbox Code Playgroud)
为了回答答案,我试过:
public int ExecuteInsertStatement(string statement, string tableName)
{
InitializeAndOpenConnection();
int id = -1;
IDbCommand cmdInsert = connection.CreateCommand();
cmdInsert.CommandText = statement + …Run Code Online (Sandbox Code Playgroud) 有没有办法从Python访问JET数据库?我在Linux上.我发现的只是存储库中的.mdb查看器,但它非常错误.谢谢
在本次论坛在这里,有人提到,实体框架不能使用Access(Jet数据库- .mdb)中.然而,它似乎有A如对Jet数据库供应商在这里
这让我觉得Entity Framework唯一需要的就是在定义模型之前定义以下内容:
<connectionStrings>
<add name="ProductContext"
providerName="Microsoft.Jet.OLEDB.4.0"
connectionString="Source=C:\mydatabase.mdb;Jet OLEDB:Database
Password=MyDbPassword;"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
有没有人知道实体框架是否适用于Jet DB,我想在开始之前确保它确实如此,因为我的设计文档依赖于这个事实.
谢谢
jet ×10
ms-access ×8
.net ×2
database ×2
sql ×2
sqlite ×2
vba ×2
32bit-64bit ×1
ado ×1
c# ×1
dao ×1
ms-jet-ace ×1
oledb ×1
primary-key ×1
python ×1