用户定义的SQL Select表达式类

因此,我提出一种方便的方法来处理包含SQL Select语句的属性,特别是ComboBox和ListBox的RowSource属性。

通常的方法如下。


Private Sub Combo1_AfterUpdate() 
    Me.Combo2.RowSource = "SELECT ... FROM ... WHERE Table2.keyID=" & Me.Combo1 & ";"
    Combo2.Requery 
End Sub 
到现在为止看起来还不错,但是它具有以下缺点。

1)如果唯一的目的是更改WHERE子句,则不适合将包含SQL Select语句的长字符串包含在具有许多字段的代码中,并使其联接。

2)每次在“设计”视图中更改RowSource属性时,也必须修改代码。

人没有义务这么辛苦地工作,但是计算机必须如此。

我建议的解决方案是编写用户定义的类。

类模块“ SQLSelect”。

 
Option Compare Database 
Dim varClauses(1 To 4) As Variant
Dim strClausesNames(1 To 5) As String
Dim strSQL As String 
Public Property Get SelectString() As String
    SelectString = Me.SelectExpression & ";"
End Property 
Public Property Let SelectString(ByVal strNewValue As String) 
    Dim intCutPosition As Integer
    Dim intCutLength As Integer
    Dim strSubStr As String 
    strSQL = strNewValue 
    For i = 1 To 4
        intCutPosition = InStr(1, strSQL, strClausesNames(i), vbTextCompare)
        If intCutPosition <> 0 Then
            intCutPosition = intCutPosition + Len(strClausesNames(i))
            For j = i + 1 To 5
                intCutLength = InStr(1, strSQL, _
                    strClausesNames(j), vbTextCompare)
                If intCutLength <> 0 Then
                    intCutLength = intCutLength - intCutPosition
                    strSubStr = Mid(strSQL, intCutPosition, intCutLength)
                    varClauses(i) = Trim(strSubStr)
                    Exit For
                End If
            Next j
            'Debug.Print strClausesNames(i) & "   <" & varClauses(i) & ">"
        Else
            varClauses(i) = Null
        End If
    Next i 
End Property 
Public Property Get What() As Variant
    What = varClauses(1)
End Property 
Public Property Let What(ByVal vNewValue As Variant)
    varClauses(1) = vNewValue
End Property 
Public Property Get From() As Variant
    From = varClauses(2)
End Property 
Public Property Let From(ByVal vNewValue As Variant)
    varClauses(2) = vNewValue
End Property 
Public Property Get Where() As Variant
    Where = varClauses(3)
End Property 
Public Property Let Where(ByVal vNewValue As Variant)
    varClauses(3) = vNewValue
End Property 
Public Property Get OrderBy() As Variant
    OrderBy = varClauses(4)
End Property 
Public Property Let OrderBy(ByVal vNewValue As Variant)
    varClauses(4) = vNewValue
End Property 
Private Sub Class_Initialize()
    strClausesNames(1) = "SELECT"
    strClausesNames(2) = "FROM"
    strClausesNames(3) = "WHERE"
    strClausesNames(4) = "ORDER BY"
    strClausesNames(5) = ";"
End Sub 
Public Property Get SelectExpression() As String 
    Dim varClause As Variant 
    SelectExpression = "" 
    For i = 1 To 4
        If Not (IsNull(varClauses(i)) Or IsEmpty(varClauses(i))) Then
            varClause = strClausesNames(i) & " " & varClauses(i)
            SelectExpression = SelectExpression & varClause & " "
        End If
    Next i 
    SelectExpression = RTrim(SelectExpression) 
End Property  

该类具有以下属性:

.What-r / w,SQL Select语句的SELECT子句

.From-r / w,SQL Select语句的FROM子句

.where-r / w,SQL Select语句的WHERE子句

.OrderBy-r / w,SQL Select语句的ORDER子句

.SelectString-r / w,后跟“;”的SQL Select语句

.SelectExpression-r,与不带尾部“;”的.SelectString相同

现在上面的例子看起来像。

表单模块。

 
Private Sub Combo1_AfterUpdate() 
    Dim sqlRowSource As New SQLSelect 
    With Me.Combo2
        sqlRowSource.SelectString = .RowSource
        sqlRowSource.Where = "Table2.keyID=" & Me.Combo1
        .RowSource = sqlRowSource.SelectString
        .Requery
    End With 
    Set sqlRowSource = Nothing 
End Sub  
在我看来,这个简单的解决方案使编程更加灵活,并提供了更具可读性和直观性的代码。

我希望这会有所帮助。

致以最诚挚的问候。

From: https://bytes.com/topic/access/insights/660000-user-defined-class-sql-select-expressions

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy通过SQL表达式语言提供了一种使用Python代码构建SQL查询语句的方式。SQL表达式语言允许开发人员以面向对象的方式构建和执行数据库查询,而无需直接编写SQL语句。 下面是一个使用SQLAlchemy实现SQL表达式语言的示例: ```python from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select # 创建数据库连接 engine = create_engine('sqlite:///example.db') # 创建元数据对象 metadata = MetaData(bind=engine) # 定义表结构 users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('email', String) ) # 构建查询语句 query = select([users]).where(users.c.name == 'John') # 执行查询并获取结果 with engine.connect() as conn: result = conn.execute(query) for row in result: print(row) # 关闭数据库连接 engine.dispose() ``` 在这个示例中,我们首先创建了一个数据库连接,使用SQLite作为示例数据库。然后,我们创建了一个元数据对象,该对象绑定到数据库连接上。 接下来,我们定义了一个名为`users`的表,其中包含`id`、`name`和`email`列。这里使用了`Table`和`Column`类来定义表结构。 然后,我们使用SQLAlchemy的SQL表达式语言构建了一个查询语句。在这个示例中,我们查询了`users`表中名字为'John'的记录。 最后,我们通过数据库连接对象执行查询,并使用`result`迭代结果集并打印每一行。 需要注意的是,这只是一个简单的示例,SQLAlchemy的SQL表达式语言提供了更多复杂的查询和操作方式,包括连接、聚合、排序等。你可以根据具体的需求和数据库类型进一步学习和使用SQLAlchemy的SQL表达式语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值