проблема со скриптом VBScript

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

проблема со скриптом VBScript

Сообщение osadmin » 24.06.2008 (Вт) 8:56

hi2all
скажу сразу - VB не знаю вообще. ну не доводилось.
но сам программист и сисадмин.
ищу средство доступа к базе на access из коммандной строки и вот натолкнулся на следующий скриптик, но он почему-то глючит
при попытке запуска выдает

" Недопустимое использование Null : 'Replace' "
как это исправить ?
заранее спасибо

Код: Выделить всё

databaseFile = "database.mdb"
tableToExtract = "CodeFiles"
savedFile = "somecsv.csv"

Set fso = CreateObject("Scripting.FileSystemObject")

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

Set csvOutput1 = fso.OpenTextFile(savedFile, 8, True, -2)

cn.Open "Provider=MSDASQL; Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & databaseFile & ";"
rs.Open "SELECT * FROM " & tableToExtract, cn
Do While Not rs.EOF
      csvLine = ""
    For i = 0 to rs.Fields.Count - 1
        If i > 0 Then
            csvLine = csvLine & ","
        End If
        If IsNull(rs.fields(i).value) Then
            csvLine = csvLine & """"""
        Else
        fileldData = rs.fields(i).value
        fileldData = Replace(fileldData, vbCrLf, "", 1, -1, 1)
        fileldData = Replace(fileldData, """", "", 1, -1, 1)
            csvLine = csvLine & """" & fileldData & """"
        End If
    Next
    csvOutput1.WriteLine csvLine
rs.MoveNext
Loop

rs.Close
set rs = nothing

csvOutput1.Close

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.06.2008 (Вт) 8:59

fileldData = "" & rs.fields(i).value
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 9:03

А вообще я бы и строку коннекта рекомендовал бы изменить, работать через OLEDB, а не ODBC.
http://www.connectionstrings.com/?carrier=access
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 9:05

Antonariy писал(а):fileldData = "" & rs.fields(i).value

Кстати, дело не в этом.
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 9:05

спасибо большое
работает

ну смысл то простой - выдрать поле из БД и в файл его
так что тут не стоит с драйверами заморачиваться

спасибо всем

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 9:08

osadmin писал(а):работает

Это странно :)
Но хорошо.
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 9:09

а при испольльзовании
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & databaseFile & ";"

выдает ошибку - несоответствие типов

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 9:55

мужики
помогите

в строке
rs.Open query, cn

если в query идет перечисление полей через запятую, то оно не хочет выполнять (
как это побороть ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 9:56

Покажи пример.
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 10:07

Код: Выделить всё

databaseFile = "heap.mdb"
query = "SELECT `Phone`,`RecordedDataTime` FROM `Order` WHERE `ServiceNote`=23"
 
savedFile = "out.txt"

Set fso = CreateObject("Scripting.FileSystemObject")

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

Set csvOutput1 = fso.OpenTextFile(savedFile, 2, True, -2)


cn.Open "Provider=MSDASQL; Driver={Microsoft Access Driver (*.mdb)}; DBQ="& databaseFile & ";"

rs.Open query, cn

Do While Not rs.EOF
      csvLine = ""
    For i = 0 to rs.Fields.Count - 1
        If i > 0 Then
            csvLine = csvLine & ","
        End If
        If IsNull(rs.fields(i).value) Then
            csvLine = csvLine & """"""
        Else
        fileldData = "" & rs.fields(i).value
        fileldData = Replace(fileldData, vbCrLf, "", 1, -1, 1)
        fileldData = Replace(fileldData, """", "", 1, -1, 1)
rem            csvLine = csvLine & """" & fileldData & """"
               csvLine = csvLine & fileldData

        End If
    Next
    csvOutput1.WriteLine csvLine
rs.MoveNext
Loop

rs.Close
set rs = nothing

csvOutput1.Close

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 10:09

Обратные одиночные кавычки используются в MySQL.
В Access надо использовать квадратные скобки (или вообще не указывать).
query = "SELECT [Phone],[RecordedDataTime] FROM [Order] WHERE [ServiceNote]='23'"
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 10:14

дык оно не на то матюкается
в строке rs.Open query, cn
говорит, что слишком много параметров

оно воспринимает "," в запросе как запятую в операторе (

что делать с этом запятой
мне именно 2 поля надо выбрать, а не *

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 10:16

Нет, ошибка относится именно к неправильному указанию полей в запросе.
Впрочем, можешь эту строчку написать так:
Set rs = cn.Execute(query)
Результат будет такой же.
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 10:17

так а что ж неправильного в запросе-то

"SELECT [Phone],[RecordedDataTime] FROM [Order] WHERE [ServiceNote]='23'"

все вроде так

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 10:19

Так правильно, неправильно select `phone`.
Или у тебя ошибка полями в квадратных скобках?
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 10:23

все нормально
ему не понравилось '23'
убрал '' и все пошло

спасибо за помощь

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 10:37

Попробуй такой код:
Код: Выделить всё
Dim databaseFile
Dim query
Dim savedFile

databaseFile = "heap.mdb"
query = "SELECT [Phone], [RecordedDataTime] FROM [Order] WHERE [ServiceNote]=23"
savedFile = "out.txt"

Dim cn, rs

Set cn = CreateDBConnection(databaseFile)
Set rs = GetRecordset(cn, query)

Dim fso, file
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(savedFile, 2, True, -2)

Dim buff, i, v

Do While Not rs.EOF
  buff = vbNullString
  For i = 0 To .Fields.Count-1
    v = IfNull(.Fields(i).Value, vbNullString)
    If i > 0 Then buff = buff & ", "
    buff = buff & """" & Replace(Replace(v, vbNewLine, vbNullString), """", vbNullString) & """"
  Next
  file.WriteLine buff
  .MoveNext
Loop

Function CreateDBConnection(Database)
  Dim DBConnection
  Set DBConnection = CreateObject("ADODB.Connection")
  With DBConnection
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .Properties("User ID") = "Admin"
    .Properties("Data Source") = Database
    .Open
  End With
  Set CreateDBConnection = DBConnection
End Function

Sub ExecSQL(DBConnection, SQL)
  Dim cmd
  Set cmd = CreateObject("ADODB.Command")
  Set cmd.ActiveConnection = DBConnection
  cmd.CommandType = 1 'Text
  cmd.CommandText = SQL
  cmd.Execute , , 128
End Sub

Function GetRecordset(DBConnection, SQL)
  Dim rs
  Set rs = CreateObject("ADODB.Recordset")
  Set rs.ActiveConnection = DBConnection
  rs.CursorLocation = 3 'adUseClient
  rs.CursorType = 3 'adOpenStatic
  rs.LockType = 1 'adLockReadOnly
  rs.Source = SQL
  rs.Open
  Set GetRecordset = rs
End Function

Function IfNull(Value, NullValue)
  If IsNull(Value) Then
    IfNull = NullValue
  Else
    IfNull = Value
  End If
End Function

Function NullIf(Value, NullValue)
  If Value = NullValue Then
    NullIf = Null
  Else
    NullIf = Value
  End If
End Function

Function QuoteString(Value)
  QuoteString = "'" & Replace(Value, "'", "''") & "'"
End Function


То же самое, но поддерживать его будет проще.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 10:40

Если поле ServiceNote числовое, а не текстовое, то да, апостофы не нужны.
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 11:43

спасибки
а можно еще тупой вопросик

а возможно ли писать не в текстовый файл, а чтобы создавался еще один файлик базы mdb
и в него писались данные...
если есть - киньте в меня ссылкой на примерчик

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.06.2008 (Вт) 12:19

Тебе нужно, чтобы создавался новый файл mdb?
Или чтобы писать в уже существующий?
Lasciate ogni speranza, voi ch'entrate.

osadmin
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 24.06.2008 (Вт) 8:39

Сообщение osadmin » 24.06.2008 (Вт) 12:23

чтобы новый

ну процедура записи в файла стандартная я так думаю,
только либо открывается уже существующий файл либо создается новый и в него пишеться


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

    TopList  
cron