使用 Microsoft 模式与实践在 Microsoft Access 中进行参数发现






4.33/5 (3投票s)
2007年1月2日
4分钟阅读

31045

416
针对 Microsoft Access 的命令参数构建自动化
使用 Microsoft 模式与实践 DataBlock 2006 年 1 月版在 Microsoft Access 中进行参数发现
此项目连接 Microsoft Access Jet 4.0 数据库并收集架构信息,用于为存储过程和 SQL 查询命令构建命令参数。
Microsoft Access 的 Data.dll 使用的类 Generics.cs,如果您尝试发现参数,则会抛出异常,因为这无法完成。
我将我的架构集合类添加到了此方法中,从而使主抽象类得以继续。它将命令参数添加到内部缓存(下次使用此命令时,它将使用缓存版本),并执行一个“NonQuery
”命令到数据库。
背景
我第一次对这个主题产生兴趣是在查看本网站上的一篇文章后:使用 Enterprise Library Application Blocks 在 Microsoft Access 中模拟存储过程。
问题是,它是用库的早期版本设计的。我到处寻找更新,但找不到。
使用代码
此外,还有一个小程序可以修改现有的 XML 文档以添加数据库架构。否则,只需使用此版本的 Data.dll 而不是标准版本。提供了一个数据层。它有详细的注释,可能看起来有点令人生畏,直到您删除注释。
这是我的一个重载示例,并且是 SQL 查询版本。
public int ExecuteQueryCommand(string SqlQuery, Object[] ObjParameters)
{
Database database = DatabaseFactory.CreateDatabase("AccessPhotoAlbum");
DbCommand Command = database.GetStoredProcCommand(CommandType.Text,
SqlQuery, ObjParameters);
int nRowsAffected = database.ExecuteNonQuery(Command);
return nRowsAffected;
}
我大部分时间都使用这个。在这两个示例中,默认数据库都被一个名为“AccessPhotoAlbum”的第二个数据库覆盖。
public int ExecuteQueryCommand(string SqlQuery, Object[] ObjParameters)
{
Database database = DatabaseFactory.CreateDatabase("AccessPhotoAlbum");
DbCommand Command = database.GetStoredProcCommand
(CommandType.StoredProcedure, SqlQuery, ObjParameters);
int nRowsAffected = database.ExecuteNonQuery(Command);
return nRowsAffected;
}
这是自动编号检索的示例。
请注意:此命令使用 out
参数来返回“受影响的行数
”和“新 ID
”。使用存储过程,这里使用了两个新的重载。CommandType
在窗体级别声明并仅传递给此方法,用于 Microsoft Access 上的 InsertCommands
。
public int InsertGetIdentity(string strSpName, CommandType Ctype,
Object[] ObjParameters, out int nReturnValue)
{
Database database = DatabaseFactory.CreateDatabase("AccessPhotoAlbum");
DbCommand Command = database.GetStoredProcCommand(Ctype,
strSpName, ObjParameters);
// new overloaded method.
int nRowsAffected = database.ExecuteNonQuery(Command, out nReturnValue);
Debug.Print("");
Debug.Print("--------------------------");
string DebugMsg = String.Format("Returned Identity: {0} ",
nReturnValue.ToString());
Debug.Print(DebugMsg);
return nRowsAffected;
}
添加的类
- CustomCommandBuilder.cs
- JetCommandBuilder.cs
- SqlQueryCommandBuilder.cs
这些可以在一个名为“CustomMethods”的新目录中找到,位于 Data.dll 内部
关注点
我弄清楚了他们为什么会省略这段代码。如果不小心,它可能会拖累 SQL Server 代码。我现在已经重写这段代码 4 个月了,这非常艰难。我想他们就是看不到它的优点。这总是要留给像我这样的人来做。
由于 SQL Server 有返回参数,所有连接都可以关闭在 data.dll 中,这就是为什么检索自动递增数字很困难。
我意识到有些人会想知道我为什么要费心编写 SqlQuery
选项,因为它违背了编码实践,但我必须承认,如果我开始编写一个项目,我总是使用查询,只有在我喜欢的时候才编写存储过程。我想提及“MyGeneration”,这个免费程序(为所有数据库构建通用存储过程)是我设计数据库时首先使用的。
历史
- 即将推出:我正在测试 Datablock 的新版本(于 2006 年 12 月发布),预计在一两周内上传。
- 27/12/06:经过我与其他程序员(爱好者)的一两次交谈,我决定添加一个选项。如果您将 XML 文件放在可执行目录中,该类将读取它并使用它来构建命令。它以类处理字段名称和值最佳的方式呈现它们。我做了一个小程序,可以修改现有的 XML 文档并添加数据库的架构。问题是,如果您更改数据库结构,就需要更新它,所以要小心。您可能会发现,无缘无故,存储过程将无法构建,现在您知道了原因。如果您要使用它,请及时更新,否则将其从文件夹中删除,类仍会继续运行。
- 04/12/06:为了保持针对 SQL Server 的高度代码优化,我不得不向 data.dll 添加了两个重载。这些是为了与 Microsoft Access 一起使用而添加的,但如果选择使用,也可以由 SQL Server 使用。所有重载都有清晰简洁的注释,指示“针对 Microsoft Access 的自定义方法”。我向 Data.Dll 添加了重载,并在“Generics.cs”上进行了覆盖,以帮助检索“
SELECT @@IDENTITY
”。 - 29/11/06:添加了对
DataSet
参数发现的支持。我对这一点有好有坏,但总的来说,我非常满意。我仍在研究更多关于这一点的内容,其他更新可能会随之而来。 - 23/11/06:添加了对 SQL Server 查询参数发现的支持。我添加此功能纯粹是为了早期设计帮助,并且它使我的数据层对于这两种类型的数据库都保持一致。