2013-07-31 3 views
0

У меня есть простая задача с сложной процедурой. Я создаю программу отслеживания, которая отслеживает использование приложений, а также другую соответствующую информацию. Сначала я записываю данные из приложения во временный текстовый файл, который будет удален после получения данных. Данные разделяются запятыми, чтобы их можно было сохранить в CSV-файле. Этот файл CSV будет использоваться для быстрого получения отдельных фрагментов информации для просмотра. Данные также будут храниться постоянно в базе данных Access 2010. Я смог сохранить данные в текстовом файле. Я смог создать VBScript для чтения данных из текстового файла и скопировать его в файл CSV. Мне нужно выяснить, почему, когда я поставил над сценарием сообщение, в которое вставляются данные в базу данных, я могу видеть информацию в окне сообщения, но он не будет печатать в базе данных, а я 'm не получает сообщений об ошибках.vbscript массив вставок в базу данных доступа

Вот код VBScript:

' Set constants for reading, writing, and appending files 
Const ForReading = 1, ForWriting = 2, ForAppending = 8 

' Sets up the object variables. 
Dim objExcel, objFSO, objTextFile, objCSVFile, objTrackingFolder 

' Sets up the integer variables. 
Dim intPathYPos 

' Sets up the all the string variables for the program. 
Dim Desktop, todaysDate, usageDate, myDay, myMonth, myYear, UserIDPath, myMessage 
Dim strTextFile, strHeadLine, strTextLine, strCSVFile, UserID, strTrackingFolder, strConnect, strSQL, strSplitData, testDisplay 
Dim message 

'This creates the required Objects 
Set objExcel = CreateObject("Excel.application") 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set conn = CreateObject("ADODB.Connection") 
Set WshShell = WScript.CreateObject("WScript.Shell") 
Desktop = WshShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\" & "Desktop" 
UserIDPath = WshShell.ExpandEnvironmentStrings("%USERPROFILE%") 

'------------------Calls up the Process Tracking Submission sub------------------- 

call ProcessTrackingSubmission 

sub ProcessTrackingSubmission() 

intPathYPos = InStr(4,UserIDPath,"\") 
intPathYPos = intPathYPos + 1 
UserID = Mid(UserIDPath, intPathYPos, 10) 

'msgbox(RTrim(UserID)) 
'exit sub 

' Set date for date stamp in file name and sheet name 
todaysDate = Date() 

myMonth = Month(todaysDate) 
If Len(myMonth)=1 Then myMonth="0" & myMonth 

myDay = Day(todaysDate) 
If Len(myDay)=1 Then myDay="0" & myDay 

myYear = Right(Year(todaysDate), 2) 

usageDate = myMonth & myDay & myYear 

' Set up the origin and destination files 
strTextFile = Desktop & "\MacroTracker.txt" 
strTrackingFolder = "E:\My Storage Files\" & UserID 
strCSVFile = strTrackingFolder & "\TrackingTesting" & usageDate & ".csv" 
strHeadLine = "App Name,User ID,Ran At,Data 1,Data 2,Data 3,Data 4,Data 5,Data 6,Data 7,Data 8" 

Set objTextFile = objFSO.OpenTextFile(strTextFile) 

Wscript.Sleep 600 

' Read the entire origin file 
Do Until objTextFile.AtEndOfStream 
    strTextLine = objTextFile.ReadLine 
Loop 

Wscript.Sleep 600 

objTextFile.Close 

If (objFSO.FolderExists(strTrackingFolder)) Then 
    If (objFSO.FileExists(strCSVFile)) Then 
     ' Create object for appending current TXT file to CSV file 
     Set objCSVFile = objFSO.OpenTextFile(strCSVFile, ForAppending, True) 
    Else 
     ' Create CSV file to write to with today's date 
     Set objCSVFile = objFSO.CreateTextFile(strCSVFile, True) 
     Wscript.Sleep 1000 
     ' Write initial header for the CSV file 
     objCSVFile.WriteLine strHeadLine 
    End If 
Else 
    Set objTrackingFolder = objFSO.CreateFolder(strTrackingFolder) 
    If (objFSO.FileExists(strCSVFile)) Then 
     ' Create object for appending current TXT file to CSV file 
     Set objCSVFile = objFSO.OpenTextFile(strCSVFile, ForAppending, True) 
    Else 
     ' Create CSV file to write to with today's date 
     Set objCSVFile = objFSO.CreateTextFile(strCSVFile, True) 
     Wscript.Sleep 1000 
     ' Write initial header for the CSV file 
     objCSVFile.WriteLine strHeadLine 
    End If 
End If 

' Write an append line of data to the CSV file 
objCSVFile.WriteLine strTextLine 

Wscript.Sleep 600 

strDataLine = Split(strTextLine, ",") 
strAppName = strDataLine(0) 
strUserID = strDataLine(1) 
strRanAt = strDataLine(2) 
strData1 = strDataLine(3) 
strData2 = strDataLine(4) 
strData3 = strDataLine(5) 
strData4 = strDataLine(6) 
strData5 = strDataLine(7) 
strData6 = strDataLine(8) 
strData7 = strDataLine(9) 
strData8 = strDataLine(10) 

' Connect to the database 
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\My Storage Files\Tracking Apps.mdb" 
conn.Open strConnect 

Wscript.Sleep 600 

' Write data to table 
    if strAppName = "Hello Application - version 1" Then 
strSQL = "INSERT INTO [Macro Tracking] ([App Name], [User ID], [Ran At], [Data 2], [Data 6]) VALUES ([" & strAppName & "], [" & strUserID & "], [" & strRanAt & "], [" & strData2 & "], [" & strData6 & "])" 
    end if 

Wscript.Sleep 600 

objCSVFile.Close 
conn.Close 

' Wait for file to be written to 
Wscript.Sleep 600 

' Delete origin file to prevent user tampering 
objFSO.DeleteFile(strTextFile) 

end sub 

Любая помощь будет принята с благодарностью. Я работал с базами данных HTML, поэтому у меня есть представление о том, как должен выглядеть SQL, но я никогда не писал его в VBScript, и все, что я нашел в Интернете, не работает.

ответ

1

В дополнение к тому, что roland уже отмечалось, VBScript не расширяется переменные внутри строки. strSplitData(0) в "... VALUES (strSplitData(0), ...)" - это буквальная строка "strSplitData(0)", а не значение первого поля массива strSplitData. Вы могли бы построить строку запроса с помощью конкатенации, как это:

strSQL = "INSERT INTO [Macro Tracking] " & _ 
     "([App Name], [User ID], [Ran At], [Data 1], [Data 2], " & _ 
     "[Data 3], [Data 4], [Data 5], [Data 6], [Data 7], [Data 8]) " & _ 
     "VALUES (" & _ 
     strSplitData(0) & ", " & _ 
     strSplitData(1) & ", " & _ 
     strSplitData(2) & ", " & _ 
     strSplitData(3) & ", " & _ 
     strSplitData(4) & ", " & _ 
     strSplitData(5) & ", " & _ 
     strSplitData(6) & ", " & _ 
     strSplitData(7) & ", " & _ 
     strSplitData(8) & ", " & _ 
     strSplitData(9) & ", " & _ 
     strSplitData(10) & ")" 

Однако, делая это not a good idea, так что просто забыл, что я упомянул об этом. Лучше использовать parameterized query (AKA подготовленное заявление) вместо:

db = "E:\My Storage Files\TrackingApps.mdb" 
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & db & _ 
      ";User Id=admin;Password=;" 

Set conn = CreateObject("ADODB.Connection") 
conn.Open strConnect 

Set cmd = CreateObject("ADODB.Command") 
Set cmd.ActiveConnection = conn 
cmd.CommandText = "INSERT INTO [Macro Tracking] ([App Name], [User ID], " & _ 
    "[Ran At], [Data 1], [Data 2], [Data 3], [Data 4], [Data 5], [Data 6], " & _ 
    "[Data 7], [Data 8]) VALUES (?,?,?,?,?,?,?,?,?,?,?)" 

Set p1 = cmd.CreateParameter("@p1", 3, 1, 0, 0) 
cmd.Parameters("@p1") = strSplitData(0) 
cmd.Parameters.Append p1 

Set p2 = cmd.CreateParameter("@p2", 3, 1, 0, 0) 
cmd.Parameters("@p2") = strSplitData(1) 
cmd.Parameters.Append p2 

... 

Set p11 = cmd.CreateParameter("@p11", 3, 1, 0, 0) 
cmd.Parameters("@p11") = strSplitData(10) 
cmd.Parameters.Append p11 

cmd.Execute 

Adjust аргументы CreateParameter() вызовов по мере необходимости.

+0

Ансгар, я попробовал то, что вы сказали, и говорит, что я не могу использовать это из-за поставщика, которого я использую. Я использую 'Microsoft.Jet.OLEDB.4.0' ... Мне нужно использовать' Microsoft.Office.12.0.Access.Database.Engine', а затем воссоздать базу данных, так как Access 2010 не позволяет вам изменять файл когда вы создаете базу данных (если это так, я не понял это и уже уничтожил базу данных .accdb только для создания .mdb) – Lou

+0

Я протестировал ее с помощью Access 97 DB и Microsoft.Jet.OLEDB. 4.0 (используя строку подключения из [здесь] (http://www.connectionstrings.com/access/)), и она работала нормально. Пожалуйста, обновите свой вопрос с точным сообщением об ошибке, которое вы получаете, и линией, которая вызывает ошибку. –

+0

Ошибка WSH, которую я получаю, находится в строке 24: 'Set cmd.ActiveConnection = conn'. Код ошибки - «800A0E7D», источником является «ADODB.Command», а ошибка «Требуется требуемая операция и объект сеанса OLE DB, который не поддерживается текущим провайдером». Я добавил все, что вы отправили выше. Строкой для 'conn' является' Set conn = CreateObject ("ADODB.Connection") '. Я даже убедился, что все было Dimdd. – Lou

2

Вы определяете strSQL, но не выполняет оператор SQL, добавьте

conn.Execute strSQL 

после strSQL = ... линии

+0

Ок ... просто попытался это, но теперь я получаю следующее сообщение об ошибке WScript хоста: сценария: C: \ слежения App.vbs ' 'Line: 114' 'Char: 2' ' Ошибка: командный текст не был задан для объекта команды. ' 'Код: 80040E0C' 'Источник: Microsoft JET Database Engine' Любые идеи, как исправить это? – Lou

+1

Добавьте квадратные скобки к имени таблицы и столбца, содержащему пробелы: '[Макро-отслеживание]' '[Имя приложения]' '[Идентификатор пользователя]' ... –

+0

По-прежнему получает то же сообщение об ошибке. Нужно ли мне удалять запятые и скобки? Строка 114 - это 'strSQL = ...', поэтому с этой линией что-то не так. – Lou

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