2012-06-14 3 views
2

Я использую VBA для работы с базой данных SQL, выберите команды forking fine, проблема заключается в модификации dbase - insert, delete. Если я использую внешнее приложение для работы с DBase, все в порядке, это значит - мои привилегии в порядке. Например, выбор сделан успешно, остальное не ...Невозможно записать на SQL из VBA/Excel с помощью ADO

Благодарим за помощь.

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 
+0

Я думаю, вы будете использовать параметры, когда вы получаете это законченный? – Fionnuala

ответ

2

RecordSet.Open используется только для открытия курсора (выбор) не выполнить некоторые DML. Для этого вы можете использовать Connection.Execute. Последнее также можно использовать для создания RecordSet.

см, например, [http://msdn.microsoft.com/en-us/library/ms807027.aspx]

+0

Я новичок == идиот ... Большое спасибо! – jerry

+1

Я бы назвал это обучением. Если он ответил на ваш вопрос, вы должны соответствующим образом пометить ответ. – Stefan

Смежные вопросы