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

Visual Basic 2005 手动编码查询生成器类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (15投票s)

2008年11月14日

CPOL

2分钟阅读

viewsIcon

58618

downloadIcon

851

大多数程序员更喜欢手动编写数据库查询。这是一个自动化查询构建的类,代码的可读性与程序逻辑一样高。

引言

这是一个 Visual Basic 类,可以半自动化 SQL 查询构建。它对于包含大量列的数据库查询非常有用,这些查询的每个逗号、引号或字段名都很难手动编写。

背景

我主要熟悉经典的 ASP 和 PHP 编程方法。我通常不使用设计器来创建业务逻辑和代码实现。虽然 ADO.NET 的类易于理解和实现,但我希望有更多的编码乐趣。这个类起源于经典的 ASP (VBScript),然后转移到 VB6 类,再到 PHP 类,最后到 Visual Studio 2005 (Visual Basic) 类。

使用代码

下载上面的类文件 (QueryBuilder.zip) 并将其添加到你的 Visual Basic 项目中。这个类的一个典型用法是针对数据库的 SELECT 查询。我们将使用一个名为 company 的表。

Dim m_Qry As QueryBuilder
        
'/* Create the builder object */
m_Qry = New QueryBuilder
m_Qry.TableName = "company"
'/* Set the command type, 
'the default setting is QueryBuilder.CommandQuery.cqSELECT */
m_Qry.CommandType = QueryBuilder.CommandQuery.cqSELECT
'/* Add a filter. Each new filter will be 
'  considered as AND. To execute an OR or LIKE, create a string that looks
'  like this: m_Qry.AddFilter("Company_Id LIKE 'My%'")
'*/
m_Qry.AddFilter("Company_Id=1")
'/* Add Columns */
m_Qry.AddField("Company_Number")
m_Qry.AddField("Short_Name")
m_Qry.AddField("Full_Name")
m_Qry.AddField("Address1")
m_Qry.AddField("Address2")
m_Qry.AddField("City_Name")
m_Qry.AddField("Phone_Number")
m_Qry.AddField("Fax_Number")

'/* if you want to sort, just add: */
m_Qry.AddOrder("Full_Name")
'/* Generate the SQL */
Dim m_SQL As String = m_Qry.GetQuery()

'/* Try to display the output */
Debug.Print m_SQL

注意:要创建连接查询,TableName 属性应包含所有 JOIN 语法(例如,Company INNER JOIN Department ON Company.Company_Id=Department.Company_Id)。列应包括表名或别名,例如 company.Company_NumberA.Company_Number

这个类在具有许多列需要添加和设置值的查询中非常有用。请查看下面的 UPDATE 示例。

Dim m_Qry As QueryBuilder

'/* Create the builder object */
m_Qry = New QueryBuilder
m_Qry.TableName = "company"
'/* Set the command type, the default setting is QueryBuilder.CommandQuery.cqSELECT */
m_Qry.CommandType = QueryBuilder.CommandQuery.cqUPDATE
'/* Add a filter. Each new filter will be 
'  considered as AND. To execute an OR or LIKE, create a string that looks
'  like this: m_Qry.AddFilter("Company_Id LIKE 'My%'")
'*/
m_Qry.AddFilter("Company_Id=1")
'/* Add Columns and Values */
m_Qry.AddFieldValuePair("Company_Number", ."MyCompanyNumber001", True)
m_Qry.AddFieldValuePair("Short_Name", "EGBC", True)
m_Qry.AddFieldValuePair("Full_Name", "EagleBush Software", True)
m_Qry.AddFieldValuePair("Address1", "Some Address in the Philippines", True)
m_Qry.AddFieldValuePair("Address2", "My Other Address in the Philippines", True)
m_Qry.AddFieldValuePair("City_Name", "Mandaluyong City", True)
m_Qry.AddFieldValuePair("Phone_Number", "+639174169922", True)
m_Qry.AddFieldValuePair("Fax_Number", "1800-FAXME", True)

'/* Generate the SQL */
Dim m_SQL As String = m_Qry.GetQuery()

'/* Try to display the output */
Debug.Print m_SQL

对于 INSERT 命令,我们只需删除 AddFilter() 函数,并修改命令类型即可。

Dim m_Qry As QueryBuilder

'/* Create the builder object */
m_Qry = New QueryBuilder
m_Qry.TableName = "company"
'/* Set the command type, the default setting is QueryBuilder.CommandQuery.cqSELECT */
m_Qry.CommandType = QueryBuilder.CommandQuery.cqINSERT
'/* Add Columns and Values */
m_Qry.AddFieldValuePair("Company_Number", ."MyCompanyNumber001", True)
m_Qry.AddFieldValuePair("Short_Name", "EGBC", True)
m_Qry.AddFieldValuePair("Full_Name", "EagleBush Software", True)
m_Qry.AddFieldValuePair("Address1", "Some Address in the Philippines", True)
m_Qry.AddFieldValuePair("Address2", "My Other Address in the Philippines", True)
m_Qry.AddFieldValuePair("City_Name", "Mandaluyong City", True)
m_Qry.AddFieldValuePair("Phone_Number", "+639174169922", True)
m_Qry.AddFieldValuePair("Fax_Number", "1800-FAXME", True)

'/* Generate the SQL */
Dim m_SQL As String = m_Qry.GetQuery()

'/* Try to display the output */
Debug.Print m_SQL

DELETE 命令只需要过滤器。请务必不要省略 AddFilter() 函数,否则所有数据将被删除。该类应警告你没有过滤器的 DELETE 查询。

关注点

我仍然在大多数项目中,当需要数据操作时使用这个类。这种做法使我能够无缝地从一种编程语言转移到另一种编程语言。此外,这种创建可读代码的做法使得从一种脚本语言移植到另一种脚本语言变得容易,而程序设计器通常会失败。

历史

该代码并不完整,因为它应该适用于通用用途。我会随着时间的推移或根据我正在进行的应用的要求添加方法和属性。如果你已经实现了一个比我更健壮和优雅的代码,请给我一份副本。

© . All rights reserved.