1 (изменено: uniken1, 2009-04-23 07:44:48)

Тема: VBScript: Добавление записей БД Access

Использую при логоне скрипт сбора информации, которая пишется в Access.

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3

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

strSelect = "SELECT Count(*) as cnt FROM InfoTable where CompName='"&CompName&"'"
strUpdate = "update InfoTable set ... where ..."
strInsert = "insert into InfoTable ... values ..."

oCN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Info.mdb;"

oRS.Open strSelect,oCN,adOpenStatic,adLockOptimistic

If oRS.Fields("cnt")=0 Then
  oCN.Execute strInsert
Else
  oCN.Execute strUpdate
End If

Паралельно с этим веду логи ошибок (здесь код вырезал для наглядности). Так как с утра много народу включает компу почти одновременно то в базу не вносится много изменений, а в логах всплывают ошибки:
error (-2147467259)   Error source: Microsoft JET Database Engine   Erorr description: Невозможно использовать ''; файл уже используется.
или
error (-2147467259)   Error source: Microsoft JET Database Engine   Erorr description: Открытие базы данных '' невозможно.  Вероятно, это не база данных приложения пользователя, или ее файл поврежден.

С чем связана проблема редактирования базы многими пользователями одновременно? Или это проблемы Access?
Можно ли это как то решить?

2

Re: VBScript: Добавление записей БД Access

Не увидел в коде закрытия соединения .

oCN.close
oRS.close

Походу слишком много соединений к базе остаются открытыми . У меня Access " чихает " если больше 30 соединений (при отладке).
Можно попытаться отслеживать ошибку и  если ошибка, то небольшая задержка и заново (повторить пару раз) и выйти.
Ещё бывает, что БД лежит где ни будь в папке на ОС Win XP , а как известно к такой папке одновременно  могут подключиться <=10 человек.

3

Re: VBScript: Добавление записей БД Access

krikerer пишет:

Не увидел в коде закрытия соединения .

oCN.close
oRS.close

Походу слишком много соединений к базе остаются открытыми . У меня Access " чихает " если больше 30 соединений (при отладке).
Можно попытаться отслеживать ошибку и  если ошибка, то небольшая задержка и заново (повторить пару раз) и выйти.
Ещё бывает, что БД лежит где ни будь в папке на ОС Win XP , а как известно к такой папке одновременно  могут подключиться <=10 человек.

Закрытие есть, я просто не весь код привожу.
Соединений действительно может быть достаточно много.  Я не знаю как проверить, но "на глаз" по логам там врятли больше 5 одновременно.
Подключений к папке не должно мешать так как лежит на Win2003.

4

Re: VBScript: Добавление записей БД Access

Вообще я бы посоветовал перейти на MS SQL 2005 Express. Код поменяется не сильно, а надёжность и масштабируемость возрастут.

5

Re: VBScript: Добавление записей БД Access

Сейчас занимаюсь решением подобной задачи, хотел делать на MS SQL 2005 Express, но выбрал Access из-за того, что сервер - не мой, сопровождается и обслуживается конторой и устанавливать на него MS SQL Server мне не дадут, тем более, что ему еще и Framework нужен. А положить в шару один файлик позволят..
Я предполагал, что возможно будут проблемы с одновременным подключением большого количества человек, но ведь один сеанс <Подключение - Вставка в таблицу - Закрытие соединения> занимает доли секунды (судя по выводимым значениям времени до Open и сразу после Close) и мне подумалось, что вероятность того, что за такой малый промежуток времени произойдет несколько подключений, очень мала, даже если 2-3, то база должна принять эти запросы.
Теперь вот, после прочтения этой темы, пришлось призадуматься..
У меня на этом сервере крутится Firebird, и у меня есть возможность создать там базу - она мала, каждый день будет чистится (выгрузка данных в 1С с последующей очисткой таблиц), так что чужой сервер не будет грузить.
Но почему еще я выбрал Access - для подключения к нему мне не нужно никаких дополнительных средств - ни на клиенте, ни на сервере, а для подключения к FB все же нужен драйвер..
А можно маленькую личную просьбу - скажите, в Вашем коде сколько по времени длится сеанс связи с базой?
И мне кажется, для открытия соединения в ConnectionString лучше использовать файл .udl

6 (изменено: uniken1, 2009-04-24 10:22:07)

Re: VBScript: Добавление записей БД Access

Централизованная БД(SQL, firebird) действительно практически не имеет смысла для моей(подобной) простой задачи + необходимость установки субд и драйверов, делает ее использование практически не возможным.

Насчет того что к базе поисходят обращения доли секунды, это не совсем верно, это зависит и от сети и от клиента. Вот кусок логов
24.04.2009 10:41:55 Comp001 Database connected.
24.04.2009 10:41:57 Comp001 Connection Opened
24.04.2009 10:41:58 Comp001 Database Update record
3-5 секунд, это не самый медленный комп и включен в один комутатор с сервером.

Насчет драйверов, для access используются драйвера клиента, т.е. там где Office не установлен всплывает ошибка(например сервера):
22-Apr-09 11:18:33 Server01 Open Connection error (3706)   Error source: ADODB.Connection   Erorr description: Provider cannot be found. It may not be properly installed.
Из-за локальности драйверов и следуют тормоза так как база открывается на клиете.

И видимо единственный вариант который остается  это цикличные попытки подключения с рандомной задержкой

7

Re: VBScript: Добавление записей БД Access

uniken1 пишет:

Централизованная БД(SQL, firebird) действительно практически не имеет смысла для моей(подобной) простой задачи + необходимость установки субд и драйверов, делает ее использование практически не возможным.

Согласен, поэтому я и отказывался от подобных советов, остановившись на тормозном, по сравнению с SQL Express, Access'е

uniken1 пишет:

Насчет того что к базе поисходят обращения доли секунды, это не совсем верно, это зависит и от сети и от клиента.
3-5 секунд, это не самый медленный комп и включен в один комутатор с сервером.

я проверял локально, и прикинул, что по сетке это произойдет - ну пусть 3 секунды. По сети основное время уходит на установление соединения,  а инсерты просходят мгновенно, коммит - тоже, и думаю, что 2 секунды для одного простого, без условий, Insert - это нереально много.
Может попробовать убрать все промежуточные операции между Open и Close?

uniken1 пишет:

Насчет драйверов, для access используются драйвера клиента, т.е. там где Office не установлен всплывает ошибка

Ну это-то понятно. По стандартам, в нашей компании, офис 2003 установлен на каждом компьютере

uniken1 пишет:

И видимо единственный вариант который остается  это цикличные попытки подключения с рандомной задержкой

Надо будет и мне так сделать.
А как лучше отследить ошибку добавления записи?
Просто у меня на тестирование по сети со многих компов времени не будет, надо срочно ставить и чтобы все работало, а локальный вариант будет сильно отличаться от многопользовательского, сетевого... Вот  и не знаю, что меня ждет
Если всем установлю, и начнутся такие косяки, то злые языки сразу начнут поднимать пыль до небес (есть такие, к сожалению)..

8

Re: VBScript: Добавление записей БД Access

OFF:

uniken1 пишет:

т.е. там где Office не установлен…

Microsoft Data Access Components 2.8 SP1

9 (изменено: uniken1, 2009-04-24 12:38:56)

Re: VBScript: Добавление записей БД Access

alexii пишет:

OFF:

uniken1 пишет:

т.е. там где Office не установлен…

Microsoft Data Access Components 2.8 SP1

Office 2003 корпоративный стандарт, поэтому везде и так работает.

Отслеживание ошибки я сделал так

Randomize

For i = 0 To 20
  oCN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Info.mdb;"
  If Err.Number<>0 Then        
    If Err.Number=3706 Then ' Нет драйвера
      Exit For 
    Else
      Wait
    End If 
    Err.Number = 0 
  Else
  Exit For 
  End If 
Next

Sub Wait
  WScript.Sleep Int((30000 * Rnd()) + 5000)  'задержка от 5 до 35 сек
End Sub

10

Re: VBScript: Добавление записей БД Access

То есть, обе ошибки из поста #1 происходят на строке?

oCN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Info.mdb;"

Какой-либо регулярности и повторяемости (время, машина) не наблюдается?

uniken1, для того, чтобы можно было просто хотя бы опробовать, нужен полный скрипт и более подробные данные.

11 (изменено: uniken1, 2009-04-24 14:53:24)

Re: VBScript: Добавление записей БД Access

alexii пишет:

То есть, обе ошибки из поста #1 происходят на строке?

oCN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Info.mdb;"

Какой-либо регулярности и повторяемости (время, машина) не наблюдается?

uniken1, для того, чтобы можно было просто хотя бы опробовать, нужен полный скрипт и более подробные данные.

Что значит регулярности? этот вопрос он к чему относится?

Если интересно посмотреть на полный скрипт, то вот:

On Error Resume   Next

'====== Prepare
Randomize
Const HKEY_LOCAL_MACHINE = &H80000002
Dim oFSO
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")

'====== Get Current Path
sCurPath = WScript.ScriptFullName 
iPos = InStrRev(sCurPath,"\")
sCurPath = Left(sCurPath,iPos)&"collect\"


'====== Get Computer Name, Domain Name and UserName
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
    oTS.WriteLine Now&" "& Err.Number & ": " & Err.Description
    'WScript.Quit
End If
For Each objOS In objService.ExecQuery("SELECT * FROM Win32_ComputerSystem")
    Exit For
Next
CompName =  objOS.Caption
DomName = objOS.Domain
UserName = objOS.UserName


Set oTS = oFSO.OpenTextFile(sCurPath&"Logs\"&CompName&".log", 8, true, 0)
oTS.WriteLine Now&" Start Collect..."
oTS.WriteLine Now&" "&CompName&" "&UserName

Set oTS_GeneralLog = oFSO.OpenTextFile(sCurPath&"CollectInfo2.log", 8, true, 0)
oTS_GeneralLog.WriteLine Now&" Start Collect. "&CompName&" "&UserName
If Err.Number<>0 Then
  oTS.WriteLine Now&" "&CompName&" "&"CollectInfo.log error ("&Err.Number&")   "&"Error source: "&Err.Source&"   "&"Erorr description: "&Err.Description
  Err.Number = 0
End If 
oTS_GeneralLog.Close



'====== Comp Description
Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")
strKeyPath = "System\CurrentControlSet\Services\lanmanserver\parameters"
strValueName = "srvcomment"
Dim strDescription

objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strDescription
oTS.WriteLine Now&" "&CompName&" "&strDescription

'====== Get IP, GW, DNS, WINS, DHCP Addresses
Dim sIPAddress
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colAdapters = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objAdapter in colAdapters
   'ip adresses
   If Not IsNull(objAdapter.IPAddress) Then
      For i = 0 To UBound(objAdapter.IPAddress)
        If i = 0 Then
          sIPAddress = objAdapter.IPAddress(i)
        Else
          sIPAddress = sIPAddress &", "& objAdapter.IPAddress(i)
        End If
      Next
   End If
   'Gateway
   If Not IsNull(objAdapter.DefaultIPGateway) Then 
     For i=LBound(objAdapter.DefaultIPGateway) to UBound(objAdapter.DefaultIPGateway)
       If i = 0 Then
          sGateway = objAdapter.DefaultIPGateway(i)
        Else
          sGateway = sGateway &", "& objAdapter.DefaultIPGateway(i)
        End If
     Next
    End If
   'DNS
   If Not IsNull(objAdapter.DNSServerSearchOrder) Then 
     For i=LBound(objAdapter.DNSServerSearchOrder) to UBound(objAdapter.DNSServerSearchOrder)
       If i = 0 Then
          sDNS = objAdapter.DNSServerSearchOrder(i)
        Else
          sDNS = sDNS &", "& objAdapter.DNSServerSearchOrder(i)
        End If
      Next
    End If
   'WINS
   If Not IsNull(objAdapter.WINSPrimaryServer) Then 
     If Not IsNull(objAdapter.WINSSecondaryServer) Then 
       sWins = objAdapter.WINSPrimaryServer&", "&objAdapter.WINSSecondaryServer
     Else
       sWins = objAdapter.WINSPrimaryServer
     End If 
   End If  
   'DHCP
   bDHCP = objAdapter.DHCPEnabled 
Next
oTS.WriteLine Now&" "&CompName&" "&bDHCP&" "&sIPAddress&" "&sGateway&" "&sDNS&" "&sWins

'====== Test For Symantec
Dim Sym1Present ,SymVer
Set objShell = CreateObject("WScript.Shell")
SymVer = objShell.RegRead("HKLM\SOFTWARE\Symantec\Symantec Endpoint Protection\AV\ProductVersion")
Sym1Present = False
if SymVer = "922614" Then
  Sym1Present = True
End If 

'====== Time Zone
TZone = objShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\StandardName")


'====== SystemInfo
sWinName = objShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
sWinName = sWinName&" "&objShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion")
sWinName = sWinName&" ("&objShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\BuildLab")&")"
oTS.WriteLine Now&" "&CompName&" "&sWinName



'====== Write Info
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3

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

oTS.WriteLine Now&" "&CompName&" "&"Database connected."
Dim strSelect,strUpdate,strInsert
strSelect = "SELECT Count(*) as cnt FROM InfoTable where CompName='"&CompName&"'"
strUpdate = "update InfoTable set DomainName = '"&DomName&"', LastLogon='"&Now&"', LoggedUser='"&UserName&"', Description='"&strDescription&"', IPAddr='"&sIPAddress&"', nDNS='"&sDNS&"', nWINS='"&sWins&"', nGateway='"&sGateway&"', nDHCP='"&bDHCP&"', SymantecPresent='"&Sym1Present&"', nTimeZone='"&TZone&"', nSystem='"&sWinName&"' where CompName='"&CompName&"'"
strInsert = "insert into InfoTable (CompName,DomainName,LastLogon,LoggedUser,Description,IPAddr,nGateway,nDNS,nWINS,nDHCP,SymantecPresent, nTimeZone, nSystem) values ('"&CompName&"', '"&DomName&"', '"&Now&"', '"&UserName&"', '"&strDescription&"', '"&sIPAddress&"', '"&sGateway&"', '"&sDNS&"', '"&sWins&"', '"&bDHCP&"', '"&Sym1Present&"', '"&TZone&"', '"&sWinName& "')"

Err.Number = 0
For i = 0 To 20
  oCN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&sCurPath&"Info.mdb;"
  If Err.Number<>0 Then    
    If Err.Number=3706 Then
      oTS.WriteLine Now&" "&CompName&" "&"Provider cannot be found."
      Exit For 
    Else
      Wait
    End If
    oTS.WriteLine Now&" "&CompName&" "&"Open Connection("&i&") error ("&Err.Number&")   "&"Error source: "&Err.Source&"   "&"Erorr description: "&Err.Description          
    Err.Number = 0
  Else
    oTS.WriteLine Now&" "&CompName&" "&"Connection Opened"
    Exit For 
  End If 
Next

oRS.Open strSelect,oCN,adOpenStatic,adLockOptimistic
If Err.Number<>0 Then
  oTS.WriteLine Now&" "&CompName&" "&"Open Recordset error ("&Err.Number&")   "&"Error source: "&Err.Source&"   "&"Erorr description: "&Err.Description
  Err.Number = 0
End If 


If oRS.Fields("cnt")=0 Then
  oCN.Execute strInsert
  If Err.Number<>0 Then
    oTS.WriteLine Now&" "&CompName&" "&"Insert error ("&Err.Number&")   "&"Error source: "&Err.Source&"   "&"Erorr description: "&Err.Description
    Err.Number = 0
  Else
    oTS.WriteLine Now&" "&CompName&" "&"Database Insert record"
  End If
Else
  oCN.Execute strUpdate
  If Err.Number<>0 Then
    oTS.WriteLine Now&" "&CompName&" "&"Update error ("&Err.Number&")   "&"Error source: "&Err.Source&"   "&"Erorr description: "&Err.Description
    Err.Number = 0
  Else
    oTS.WriteLine Now&" "&CompName&" "&"Database Update record"
  End If
End If


oRS.Close
oCN.Close
oTS.WriteLine Now&" "&CompName&" "&"Database Close"
oTS.Close
WScript.Quit

Sub Wait
  WScript.Sleep Int((30000 * Rnd()) + 5000)
End Sub

В политике указан этот скрипт.
В папке с политикой лежит скрипт и папка Collect, в папке Logs, CollectInfo2.log и Info.mdb

12

Re: VBScript: Добавление записей БД Access

Как вариант:
Скрипты клиентов нужную информацию записывают в текстовый файл, складывают свои файлики в общую папку, а серверный скрипт (работающий на сервере как вы догадываетесь) периодически считывает данные из этих файлов и записывает данные в базу.

Йоды магистра речи тайна раскрыта: оказывается, на форте программист старый есть он просто!

13

Re: VBScript: Добавление записей БД Access

null пишет:

Как вариант:
Скрипты клиентов нужную информацию записывают в текстовый файл, складывают свои файлики в общую папку, а серверный скрипт (работающий на сервере как вы догадываетесь) периодически считывает данные из этих файлов и записывает данные в базу.

Если ты внимательно посмотришь скрипт то там и так инфа складывается по логам для каждого компа отдельно.
Писать программу(это уже не скриптовый уровень) которая будет непрерывно работать, обрабатывая логи(иначе инфа из базы будет не достоверной), я думаю будет неправильно.
Да и такой подход(складываия файлов в кучу с последующей обработкой), сейчас может использоваться разве что только школьниками и студентами для изучения паскаля или асма

14 (изменено: Altred, 2009-04-24 18:28:54)

Re: VBScript: Добавление записей БД Access

Можно же не программу, а тот же скрипт-обработчик на сервере по таймеру запускать раз в 10 минут, скажем. На самом деле вполне нормальный и часто используемый подход. Зато сбоев из-за работы клиентов с БД не будет.

15

Re: VBScript: Добавление записей БД Access

uniken1 пишет:

Писать программу(это уже не скриптовый уровень) которая будет непрерывно работать, обрабатывая логи(иначе инфа из базы будет не достоверной), я думаю будет неправильно.
Да и такой подход(складываия файлов в кучу с последующей обработкой), сейчас может использоваться разве что только школьниками и студентами для изучения паскаля или асма

uniken1, вы напрасно так неадекватно реагируете на достаточно дельный совет от null. Это и невежливо, а, в сочетании с допущенным вами в этом комментарии кучи смысловых, логических и прочих огрех, ещё и нелепо.

16

Re: VBScript: Добавление записей БД Access

[offtopic]
[#12],[#14],[#15] - Не собираюсь обсуждать этот бесполезный флейм.
[/offtopic]

В Access случайно заметил еще одну непонятно неприятную вещь: по логам прописано что все прошло успешно "подключение-отрытие-обновление", но реально в базе записи нет. С чем это может быть связано пока не понял...

17

Re: VBScript: Добавление записей БД Access

uniken1, а Вы не пробовали (это не к последнему сообщению, а по более раннему вопросу) использовать не запросы insert/update…values, а непосредственно методы RecordSet .AddNew/.Delete?

18

Re: VBScript: Добавление записей БД Access

Переделал скрипт на использование Recordset.AddNew/.Update, ничего не поменялось.
Создано 262 файла логов (т.е. на стольких компах отработала политика)
В базе 160 обновленных записей (смотря по дате)
Из 262 реально с ошибками 27, причем с какой-то странной ошибкой "Обновление невозможно. База данных или объект доступны только для чтения.", притом что 235 обновились нормально.
т.е. в среднем происходит 30% потерь причину которых выяснить так и не получается.

19

Re: VBScript: Добавление записей БД Access

А галочка: "Блокировка записей при открытии БД" в настройках случайно не стоит?

Йоды магистра речи тайна раскрыта: оказывается, на форте программист старый есть он просто!

20

Re: VBScript: Добавление записей БД Access

А где эта галочка?

21

Re: VBScript: Добавление записей БД Access

Открываешь в  аккессе свою базу, выбираешь:  сервис - параметры - другие(как ты понимаешь, это нужно проделать на серваке гда база лежит).

Йоды магистра речи тайна раскрыта: оказывается, на форте программист старый есть он просто!

22

Re: VBScript: Добавление записей БД Access

1. На сервере Access'a нет. к базе все обращаются через свой локальный Access с путем \\...\*.mdb
2. Как должна помочь блокировка на уровне страниц вместо записей?
3. Там есть подпись что эта галочка не влияет на запросы SQL, а на сколько я понимаю все функции выполняются через него

23

Re: VBScript: Добавление записей БД Access

Эта галочка к акксессу относятся, так что не заморачивайся.

Йоды магистра речи тайна раскрыта: оказывается, на форте программист старый есть он просто!

24

Re: VBScript: Добавление записей БД Access

dsb пишет:
uniken1 пишет:

Писать программу(это уже не скриптовый уровень) которая будет непрерывно работать, обрабатывая логи(иначе инфа из базы будет не достоверной), я думаю будет неправильно.
Да и такой подход(складываия файлов в кучу с последующей обработкой), сейчас может использоваться разве что только школьниками и студентами для изучения паскаля или асма

uniken1, вы напрасно так неадекватно реагируете на достаточно дельный совет от null. Это и невежливо, а, в сочетании с допущенным вами в этом комментарии кучи смысловых, логических и прочих огрех, ещё и нелепо.

У нас в сети всё складывается по файлам  и прогой eXponent обрабатывается  когда нужно. Очень удобно. А ещё  скрипт по расписанию срабатывает (в 2 часа ночи ), лопатит файлы и шлёт письма, по изменениям. БД Access вообще не расшаренная.

25 (изменено: Loveц, 2009-12-14 13:09:36)

Re: VBScript: Добавление записей БД Access

Прочита всю ветку. Меня сейчас тоже интересует данная тема. А именно: хочу писать некоторые события (ошибки) в БД, которая не требует установки на клиенте отдельных драйверов. Пока что пишется тупо в текстовый файл. Хочется улучшений Вот смотрю в сторону аксеса. Событий-ошибок у меня немного, поэтому проблемы с большим количеством соединений быть не должно.

Вопросы:
1) тут писали, что для коннекта к файлу access нужны компоненты определенные скачанные с мелкософта или установленный офис... есть ли способ соединиться с базой без установки чего-бы то нибыло на чистую WinXP? через Win API может ...
2) а формат dbf хуже формата mdb? может в него можно писать без доп. софта?
3) какие еще есть форматы БД. позволяющие писать в них без установки самих БД? например, чтобы писать в файл dbf, xls, mdb мне не надо ставить на сервере какой то софт, эти файлы можно просто положить на общий ресурс...

P.S. Почитал по ссылке http://www.microsoft.com/downloads/details.aspx?familyid=78cac895-efc2-4f8e-a9e0-3a1afbd5922e&displaylang=ru
Правильно я понял что для связи с access в WinXP не надо ничего дополнительного? Это только для систем до WinXP?

26

Re: VBScript: Добавление записей БД Access

1. В любом случае, тот или иной драйвер нужен, без него никак (ну, разве что кроме самопальной обработки CSV, Tab Delimited и т.п.). Могу лишь сказать, что действительно, для интегрированного набора Windows XP Professional SP3 пакет MDAC 2.8 SP1 не нужен — он уже наличествует в данном наборе.
2. Хуже. Нет.
3. Для перечисленных форматов отдельно на сервере ничего устанавливать не надо, только на клиенте, поскольку всё перечисленное не является файлами клиент-серверных БД (а xls — вообще не БД, как и csv, Tab Delimited, — просто есть драйвер, позволяющий рассматривать такие файлы как плоскую БД, и использовать команды для работы с БД).

Лучший вариант из перечисленного — mdb в качестве хранилища и, соответственно, Jet — для доступа. В качестве технологии пользовать ADO (а не DAO).

27 (изменено: Loveц, 2009-12-16 14:03:40)

Re: VBScript: Добавление записей БД Access

Спасибо.

Еще вопрос. Я сейчас для записи в MySQL использую следующую схему:

$objADOConnect = ObjCreate ("ADODB.Connection")
$objADORecordset = ObjCreate ("ADODB.Recordset"

; подключаемся к БД
With $objADOConnect
        .ConnectionString = "Provider=MSDASQL.1;Driver=MySQL ODBC 5.1 Driver;Server=" & $strServer & ";UID=" & $strLogin & ";PWD=" & $strPassword & ";Database=" & $strBase
        .Open
EndWith

; записываем в БД
With $objADORecordset
        .ActiveConnection = $objADOConnect
        .CursorLocation = 3        ; adUseClient
        .CursorType = 1            ; adOpenKeyset
        .LockType = 3            ; adLockOptimistic
        .Open
EndWith

Опытным путем я выяснил что такой способ работает быстрее чем через метод Execute (по крайней мере у меня).
А в Access я щас пишу так:

; устанавливаем соединение с БД
$objConnection = ObjCreate("ADODB.Connection")
$objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & $strErrorDatabasePath
$objConnection.Open

; выбираем нужный набор записей
$objRecordset = ObjCreate("ADODB.Recordset")
$objRecordset.Open ("SELECT * FROM Таблица1", $objConnection, $adOpenKeyset, $adLockOptimistic)

; модифицируем этот набор записей
With $objRecordset
    .AddNew
    .Fields("дата") = @YEAR & "." & @MON & "." & @MDAY
    .Update    ; сохраняем изменения
EndWith

Нет ли второго, возможного более быстрого способа записи (а так же поиска) в БД Access?

28

Re: VBScript: Добавление записей БД Access

Можно вместо «select …» попробовать сразу «insert into … values …».

Насчёт поиска: других вариантов, кроме как «select … where …» (или Вы про что?!), для извлечения нет; естественно, подразумевается, что Вы заранее создали и построили индексы не только по ключевым полям, но и по всем полям, по которым осуществляется поиск.

29 (изменено: Loveц, 2009-12-16 20:53:10)

Re: VBScript: Добавление записей БД Access

Можно вместо «select …» попробовать сразу «insert into … values …».

Это пробовал - не прокатило....

Я просто про то, что допустим с MySQL, что добавление, что поиск по базе делаются по одинаковому шаблону:
- подключаемся к базе
- устанавливаем свойства для объекта "Рекордсэт" и в конце вызываем его метод Open.
В Access же такое не прокатиро... Поиск да, а вот добавоение только как я указал выше. Я вот и хотел уточнить действительно так или я что упустил...

Ну наверно все же так

P.S. Думал что ADO оно и в Африке ADO, но наверно у Access оно какое-то свое....

30

Re: VBScript: Добавление записей БД Access

Что не прокатило? Обычная база с одной таблицей с двумя текстовыми полями. 1-й метод — Ваш, добавляем «ручками»; 2-й — пользуем запрос «INSERT INTO…VALUES» через RecordSet; 3-й — тот же запрос «INSERT INTO…VALUES», только работаем непосредственно с объектом «ADODB.Connection»:

AutoItSetOption("MustDeclareVars", 1)

Local Const $adOpenDynamic    = 2
Local Const $adLockOptimistic = 3

Local $oConnection = ObjCreate("ADODB.Connection")
Local $oRecordSet = ObjCreate("ADODB.RecordSet")

$oConnection.Open("Provider = Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source = 'C:\bla-bla-bla\db1.mdb'")

; 1-й метод
With $oRecordSet
    .Open("SELECT * FROM Table1", $oConnection, $adOpenDynamic, $adLockOptimistic)

    .AddNew
    .Fields.Item("Field1") = "Value1"
    .Fields.Item("Field2") = "Value2"
    .Update

    .Close
EndWith

; 2-й метод
With $oRecordSet
    .Open("INSERT INTO Table1 (Field1, Field2) VALUES ('Value3', 'Value4')")
EndWith

; 3-й метод
$oConnection.Execute("INSERT INTO Table1 (Field1, Field2) VALUES ('Value5', 'Value6')")

$oConnection.Close

Exit(0)

31

Re: VBScript: Добавление записей БД Access

Я имел ввиду что "не прокатил" способ номер 2. А вот ваш третий способ мне очень понравился своей короткостью кода. Ну по скорости потом потестирую... Второй так и не заработал....

способ 1 - работает

Const $adOpenKeyset = 1
Const $adLockOptimistic = 3
Local $objConnection, $objRecordset

$objConnection = ObjCreate("ADODB.Connection")
$objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = \\b2\public1$\errors\1\errors.mdb"
$objConnection.Open

$objRecordset = ObjCreate("ADODB.Recordset")

With $objRecordset
    .Open ("SELECT * FROM Таблица1", $objConnection, $adOpenKeyset, $adLockOptimistic)
    .AddNew
    .Fields("источник") = "TEST - источник"
    .Fields("ошибка") = "TEST - ошибка"
    .Update
EndWith

способ 2 - не работает

$objConnection = ObjCreate("ADODB.Connection")
$objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = \\b2\public1$\errors\1\errors.mdb"
$objConnection.Open

$objRecordset = ObjCreate("ADODB.Recordset")

$objRecordset.Open("INSERT INTO Таблица1 ('источник', 'ошибка') VALUES ('TEST - источник', 'TEST - ошибка')")

способ 3 - работает

$objConnection = ObjCreate("ADODB.Connection")
$objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = \\b2\public1$\errors\1\errors.mdb"
$objConnection.Open

$objConnection.Execute ("INSERT INTO Таблица1 (источник, ошибка) VALUES ('TEST - источник', 'TEST - ошибка')")

Спасибо

32

Re: VBScript: Добавление записей БД Access

Loveц пишет:

способ 2 - не работает…

А так:

$objConnection = ObjCreate("ADODB.Connection")
$objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = '\\b2\public1$\errors\1\errors.mdb'"
$objConnection.Open

$objRecordset = ObjCreate("ADODB.Recordset")

$objRecordset.Open("INSERT INTO Таблица1 (источник, ошибка) VALUES ('TEST - источник', 'TEST - ошибка')", $objConnection)

33

Re: VBScript: Добавление записей БД Access

Виноват, забыл написать...
Пробовал и с апострафами и без. Результат - не работает. В посте выше случайно апострофы остались. А так строчка полностью идентична строчке из способа 3.

34

Re: VBScript: Добавление записей БД Access

Хмм… Ой ли :

$objRecordset.Open("INSERT INTO Таблица1 ('источник', 'ошибка') VALUES ('TEST - источник', 'TEST - ошибка')")

$objRecordset.Open("INSERT INTO Таблица1 (источник, ошибка) VALUES ('TEST - источник', 'TEST - ошибка')", $objConnection)

P.S. В «комбинированном» примере из поста #30 привязка RecordSet'а делалась в первом методе:

; 1-й метод
With $oRecordSet
    .Open("SELECT * FROM Table1", $oConnection, $adOpenDynamic, $adLockOptimistic)
    …

Оттого во втором методе уже не требовалось указывать отдельно Connection.

35

Re: VBScript: Добавление записей БД Access

упс
сори за невнимательность.
все три способа работают, еще раз спасибо за помощь.

этот вопрос закрыт.

36

Re: VBScript: Добавление записей БД Access

Обновил свой предыдущий пост.