2016-11-15 4 views
0

У меня есть таблица SQL, называемая Аудит. В этой таблице есть два поля: UN и CN. Имя моего сервера является аналитическим, а DB - DW_ALL. Я пытаюсь захватить в excel имя пользователя и имя компьютера, которое обращается/открывает мою книгу или лист, а затем записывает эту информацию аудита в мою таблицу SQL.Как написать таблицу SQL с помощью excel VBA

Sub UpdateTable() 

Dim cnn As ADODB.Connection 
Dim uSQL As String 
Dim strText As String 
Dim strDate As Date 

strText = ActiveSheet.Range("b4").Value 
''strDate = Format(ActiveSheet.Range("c4").Value, "dd/mm/yyyy")'' 

Set cnn = New Connection 
cnnstr = "Provider=SQLOLEDB; " & _ 
     "Data Source=icl-analive; " & _ 
     "Initial Catalog=DW_ALL;" & _ 
     "User ID=ccataldo;" & _ 
     "Trusted_Connection=Yes;" 

cnn.Open cnnstr 

''uSQL = "INSERT INTO tbl_ExcelUpdate (CellText,CellDate) VALUES ('" & strText & "', " & strDate & ")"'' 
''uSQL = "INSERT INTO Audit (UN,CN) VALUES (MsgBox Environ("username"), MsgBox   Environ("username""'' 
uSQL = INSERT INTO Audit (UN,CN) VALUES ('MsgBox Environ("username") ', 'MsgBox Environ("username"')) 

Debug.Print uSQL 

cnn.Execute uSQL 
cnn.Close 
Set cnn = Nothing 
Exit Sub 
End Sub 
+0

Повторное чтение вашего сообщения; Я уже не уверен, что правильно понял вашу проблему. Можете ли вы опубликовать код ошибки и сообщить нам, какая строка несет ответственность. –

+0

Какая ошибка? Вам не понадобится жестко кодировать пользователя/пароль, если книга будет доступна другим пользователям? Если да, не забудьте заблокировать макросы, чтобы они не читались - но это не невозможно! https://stackoverflow.com/questions/272503/how-do-imove-the-password-from-a-vba-project – JiggsJedi

+0

Кроме того, ваш лучший выбор - создать учетную запись sql для использования и дать ее НЕТ разрешений, кроме выполнения в хранимой процедуре, которая делает для вас вставку. – JiggsJedi

ответ

0

Строки подключения могут быть сложными вещами. Я очень сильно полагаюсь на ConnectionStrings.com, чтобы обновить свою память.

Trusted_Connection и User ID являются взаимоисключающими. Используйте надежное соединение, если вы хотите войти на SQL Server, используя учетную запись Windows. Имя пользователя и пароль для входа в систему с помощью SQL account.

Предполагая, что вы хотите использовать свой Windows-вход; попробуйте это:

Provider=SQLNCLI11;Server=analive;Database=DW_ALL;Trusted_Connection=yes;

0

Вот пример сценария, который пишет на AccessDB. SQL должен быть аналогичным, а также необходимые операторы vba. Я надеюсь, что это помогает

Также он использует тип соединения DAO, а не Addob.

Private Sub thisbetheshitmane() 
    Dim db As DAO.Database 
    Dim rst As DAO.Recordset 
    Dim tb As DAO.TableDef 
    Dim vAr As String 
    Dim i As Integer 
    Dim y As Integer 
    Dim InCombined As Boolean 
    Dim InOpen As Boolean 
    Dim vbSql As String 

    Application.ScreenUpdating = False 
    Application.DisplayAlerts = False 
    Application.Calculation = xlCalculationManual 

    Dim StartTime As Double 
    Dim SecondsElapsed As Double 

    StartTime = Timer 

    Set db = DBEngine.OpenDatabase("C:\Users\dzcoats\Documents\Microsoft.accdb") 

    For Each tb In db.TableDefs 
     If Len(tb.Connect) > 0 Then 
      tb.RefreshLink 
     End If 
    Next tb  

    Set rst = db.OpenRecordset("SELECT DISTINCT [Table_Name].Defect FROM [Table_Name] WHERE [Table_Name].Defect IS NOT NULL;") 

    Dim QResult() As Variant 
    QResult = rst.GetRows(rst.RecordCount) 
    For a = LBound(QResult, 2) To UBound(QResult, 2) 
     vAr = QResult(0, a) 
    Next a 

    For y = LBound(QResult, 2) To UBound(QResult, 2) 
     If vAr <> "Defect" And vAr <> vbNullString And vAr <> "" Then 

      If InCombined = True And InOpen = True Then 
       vbSql = "UPDATE [Table_Name] SET [Table_Name].Status ='Bad Defect Number' WHERE ((([Table_Name].Defect)='" & vAr & "'));" 
       db.Execute vbSql 
      End If 

      If InCombined = False And InOpen = True Then 
       vbSql = "UPDATE [Table_Name] SET [Table_Name].Status ='Completed' WHERE ((([Table_Name].Defect)='" & vAr & "'));" 
       db.Execute vbSql 
      End If 

     End If 
    Next y 

    rst.Close 
    Set rs = Nothing 
    db.Close 
    Set db = Nothing 

Application.ScreenUpdating = True 
Application.DisplayAlerts = True 
Application.Calculation = xlCalculationAutomatic 

SecondsElapsed = Round(Timer - StartTime, 2) 
MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation 

End Sub