2016-04-21 8 views
2

У меня есть VBScript, который берет некоторые системные ресурсы и сохраняет их в переменных, и я хочу записать их в таблицу MySQL.Несоответствие типа MySQL

Когда я получаю заявление SQL Я получаю сообщение об ошибке

Type mismatch: '[string: "insert into monitor "]'

Я гугле и знаю, что он пытается передать неправильные данные в тип данных.

MySQL Таблица вывода

CREATE TABLE monitor (
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    pcname VARCHAR(30), 
    cpu decimal(4,2), 
    hdd decimal(4,2), 
    mem decimal(4,2), 
    rdate TIMESTAMP 
); 

Пример:

+----+-------------+------+-------+-------+---------------------+ 
| id | pcname  | cpu | hdd | mem | rdate    | 
+----+-------------+------+-------+-------+---------------------+ 
| 1 | HOSTNAME-PC | 4.00 | 39.26 | 74.28 | 2016-04-21 12:16:04 | 
+----+-------------+------+-------+-------+---------------------+

Установить переменные

Dim Connection 
Dim ConnectionString 
Dim Recordset 
Dim SQL 
dim cpu 
dim hdd 
dim mem 
dim host 

Получить имя хоста и хранить в узле:

Set wshShell = CreateObject("WScript.Shell") 
strRegValue = "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname" 
strHostName = wshShell.RegRead(strRegValue) 
host = strHostName 

Получить процессор и хранить в процессоре:

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name = '_Total'") 
For Each objItem In colItems 
    cpu = objItem.PercentProcessorTime 
Next 

Получить место на жестком диске и хранить в НЖМД

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery(_ 
    "SELECT * FROM Win32_LogicalDisk Where Name='C:'",,48) 
For Each objItem In colItems 
    intFreeSpace = objItem.FreeSpace 
    intTotalSpace = objItem.Size 
    pctFreeSpace = Round((intFreeSpace/intTotalSpace)*100, 2) 
    hdd = pctFreeSpace 
Next 

Получить пространство памяти и хранить в тлф:

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem") 
GB = 1024 *1024 * 1024 
For Each objItem In colItems 
    intTotal = Round(objItem.TotalPhysicalMemory/GB, 3) 
Next 
Set colItems1 = objWMIService.ExecQuery("Select * from Win32_PerfFormattedData_PerfOS_Memory",,48) 
For Each objItem1 In colItems1 
    intAvail = Round(objItem1.AvailableBytes/GB, 3) 
Next 
pctFree = Round((intAvail/intTotal)*100, 2) 
mem = pctFree 

SQL Statement получая ошибка:

"Type mismatch: '[string: "insert into monitor "]'"

SQL = "insert into monitor (pcname,cpu,hdd,mem) values ('"+host+"','"+cpu+"','"+hdd+"','"+mem+"')" 

Остальной код:

ConnString = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=servername; DATABASE=dbname; " &_ 
    "UID=username;PASSWORD=password; OPTION=3" 

Set Connection = CreateObject("ADODB.Connection") 
Set Recordset = CreateObject("ADODB.Recordset") 

Connection.Open ConnString 

Recordset.Open SQL,Connection 

If Recordset.EOF Then 
    Wscript.Echo("No records returned.") 
Else 
    Do While NOT Recordset.Eof 
     WScript.Echo Recordset("pcname") 
     WScript.Echo Recordset("cpu") 
     WScript.Echo Recordset("hdd") 
     WScript.Echo Recordset("mem") 
     WScript.Echo "<br>" 
     Recordset.MoveNext  
    Loop 
End If 

Recordset.Close 
Set Recordset = Nothing 
Connection.Close 
Set Connection = Nothing 

ответ

0

Изменить

SQL = "insert into monitor (pcname,cpu,hdd,mem) values ('"+host+"','"+cpu+"','"+hdd+"','"+mem+"')" 

в

SQL = "insert into monitor (pcname,cpu,hdd,mem) values ('" & host & "','" & cpu & "','" & hdd & "','" & mem & "')" 

Должно быть все готово

+1

Десятичные числа не следует указывать. –

+0

В vbs вы можете использовать как & и + для конкатенации строк, см. Https://technet.microsoft.com/en-us/library/ee156813.aspx – Shadow

+0

Это не решит проблему вообще (инструкция все еще пытается для вставки строк в числовые поля). –

1

к веро lem - это то, что вы пытаетесь создать набор записей на основе запроса на вставку. Основной целью Recordset является отображение данных из базы данных, но не отображается, если вы выполняете запрос вставки.

У вас есть 2 варианта:

  1. выполнить запрос вставки с помощью объекта соединения-х Execute method:

    Connection.Execute sql, , 128 --128=0x80=adExecuteNoRecords 
    

Затем откройте записей на столе монитора с помощью выбора или таблицы имя.

  1. Открыть объект recordset на таблице монитора, используя выделение и использовать объект набора записей AddNew method.

    Recordset.Open "SELECT * FROM monitor", Connection, 1 
    Recordset.AddNew 
    Recordset.Fields("pcname").Value = xxx 
    ... 
    Recordset.Update 
    

UPDATE:

Как @ отметило Ekkehard.Horner: значение десятичного столбца не должно быть заключено в одинарных кавычках. Хотя MySQL беззвучно преобразует строку в число (если не включен строгий режим sql), но правильная вещь - не передавать числа в виде строк.

+0

Кроме того: Десятичные числа не следует указывать. –

+0

Не должно, но не вызовет проблем с mysql, если они указаны. – Shadow

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