2

我正在使用 VBA 处理 SQL 数据库,选择命令分叉很好,问题在于修改 dbase - 插入、删除。如果我使用外部应用程序与 DBase 一起工作,一切都很好,这意味着 - 我的权限还可以。在示例中选择成功完成,休息不...

谢谢你的帮助。

JB

Public LinkID As ADODB.Connection
Public QueryID As ADODB.Recordset
Private Record() As String
Public Row As Long
Public NumRows As Long
Public Function connect(Optional server As String = "", Optional uid As String = "", Optional pwd As String = "", _
    Optional dbname As String = "") As Boolean
    Dim connStr As String
    If (server = "") Then server = "DBServer"
    If (uid = "") Then uid = "User1"
    If (pwd = "") Then pwd = "1234"
    If (dbname = "") Then dbname = "Database1"
    If (uid = "") Then
        connStr = "DRIVER={SQL Server};SERVER=" & server & ";Trusted_Connection=Yes;APP=Office 2007 App;DATABASE=" & dbname
    Else
        'connStr = "DRIVER={SQL Server};SERVER=" & server & ";UID=" & uid & ";PWD=" & pwd & ";APP=Office 2007 App;DATABASE=" & dbname
        connStr = "Provider=SqlOleDb;Data Source=DBServer;Initial Catalog = Database1;UID=" & uid & ";PWD=" & pwd & ";Options=-1;"
    End If
    If (LinkID Is Nothing) Then
        Set LinkID = New ADODB.Connection
        On Error Resume Next
        LinkID.Open connStr
        On Error GoTo 0
        If (LinkID.State = 0) Then
            ErrorNo = Err.Number
            ErrorTxt = Err.Description
        End If
    End If
    connect = LinkID.State
End Function
Public Function query(Optional queryStr As String = "") As Boolean
    If (queryStr = "") Then Exit Function
    If Not (connect) Then Exit Function
    If (QueryID Is Nothing) Then
        Set QueryID = New ADODB.Recordset
    ElseIf (QueryID.State) Then
        free_result
    End If
    On Error Resume Next
    QueryID.Open queryStr, LinkID, adOpenForwardOnly, adLockOptimistic, -1 ', adLockBatchOptimistic
    On Error GoTo 0
    Row = 0
    If (QueryID.State = 0) Then
        ErrorNo = Err.Number
        ErrorTxt = Err.Description
    End If
    NumRows = count_records
    query = QueryID.State
End Function
Public Sub free_result()
    If Not (QueryID Is Nothing) Then
        QueryID.Close
    End If
End Sub
Public Function count_records() As Integer
    count_records = 0
    If Not (QueryID Is Nothing) Then
        If (QueryID.State) Then
            While (Not QueryID.EOF)
                count_records = count_records + 1
                QueryID.MoveNext
            Wend
            If (count_records) Then
                QueryID.Requery
            End If
        End If
    End If
End Function
Sub Test()
    query "SELECT * FROM Table1 WHERE Empl = 'Tom'"
    query "INSERT INTO Table1 (EMPL)Values ('Tod')"
    query "DELETE FROM Table1 WHERE Empl = 'Tod'"
End Sub
4

1 回答 1

2

RecordSet.Open is only used to open a cursor (select) not execute some DML. For this you can use Connection.Execute. The last can also be used to create a RecordSet.

See for example [http://msdn.microsoft.com/en-us/library/ms807027.aspx]

于 2012-06-14T09:15:39.637 回答