65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (3投票s)

2007年1月2日

4分钟阅读

viewsIcon

31045

downloadIcon

416

针对 Microsoft Access 的命令参数构建自动化

Sample Image - ParametersDiscoveryXML.jpg

使用 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 查询参数发现的支持。我添加此功能纯粹是为了早期设计帮助,并且它使我的数据层对于这两种类型的数据库都保持一致。
© . All rights reserved.