VB Script для выгрузки таблицы SQL Server в CSV - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь создать сценарий VB для выгрузки таблицы сервера SQL в файл CSV

Option Explicit
Dim rs,fieldVals,dbConnIn
Dim connectString,shell,tmp,fso,ts,line

Const adOpenDynamic=2
Const adLockPessimistic=2
Const adCmdTable=2
Const adOpenForwardOnly=0
Const adOpenStatic=3
Const adLockReadOnly=1

connectString="Provider=SQLOLEDB;Server=192.168.168.4;Database=MYDB;Uid=sa;Pwd=myPassword;"
Set dBConnIn = CreateObject("ADODB.Connection")
dBConnIn.CommandTimeout = 300
dBConnIn.Open connectString
' This is just a simple way of getting a record set from and SQL Query
Set rs=CreateObject("ADODB.RecordSet")
rs.Open _
   "TITULARES", _
   dbConnIn, _
   adOpenStatic, _
   adLockReadOnly, _
   adCmdTable

Set shell=CreateObject("WScript.Shell")
Set fso=CreateObject("Scripting.FileSystemObject")
Set ts=fso.OpenTextFile("E:\TITULARES.csv",2,TRUE)
line=""
For Each tmp In rs.Fields
   line=line & tmp.Name & ","
Next
ts.WriteLine Left(line,Len(line)-1)
While Not rs.EOF
 line=""
 For Each tmp In rs.Fields
  line=line & """" & Replace(tmp.Value,"""","""""") & ""","
 Next
 ts.WriteLine Left(line,Len(line)-1)
 rs.MoveNext
Wend

rs.Close
ts.close

Все хорошо, но поскольку некоторые из моих полей таблицы SQL имеют значение NULL или пусто, я получаю эту ошибку:

d.vbs(39, 2) Microsoft VBScript runtime error: Invalid procedure call or argument: 'Left'

Любые идеи о том, как решить эту проблему?

Спасибо!

Кстати ..., заставил это работать так:

Set dBConnIn = CreateObject("ADODB.Connection")
dBConnIn.CommandTimeout = 300
dBConnIn.Open connectString
' This is just a simple way of getting a record set from and SQL Query
Set rs=CreateObject("ADODB.RecordSet")
rs.Open _
   "TITULARES", _
   dbConnIn, _
   adOpenStatic, _
   adLockReadOnly, _
   adCmdTable

Set shell=CreateObject("WScript.Shell")
Set fso=CreateObject("Scripting.FileSystemObject")
Set ts=fso.OpenTextFile("E:\TITULARES.csv",2,TRUE)
line=""
For Each tmp In rs.Fields
   line=line & tmp.Name & ","
Next
ts.WriteLine Left(line,Len(line)-1)
While Not rs.EOF
 line=""
 For Each tmp In rs.Fields
  If IsNull(tmp.Value) Then
   line=line & """" & Replace(tmp.Value,"""","""""") & ""","
  Else
   line=line & """" & tmp.Value & ""","
  End If
 Next
 ts.WriteLine Left(line,Len(line)-1)
 rs.MoveNext
Wend

rs.Close
ts.close

Спасибо всем!

Ответы [ 3 ]

1 голос
/ 22 апреля 2013

Спасибо, это помогло мне с аналогичным требованием, поэтому я делюсь тем, что я сделал.

Я внес некоторые изменения в ваш код:

  1. Использование VB.NET- похоже, ваш код VB6, но вы все равно можете найти это полезным.
  2. Устранена проблема с нулевыми значениями.
  3. Добавлена ​​опция для включения имен столбцов.
  4. Сделанокавычки условны только для текстовых столбцов.Вы можете отметить, что ЕСЛИ или изменить условия.
Imports System.StringComparison
Imports Microsoft.VisualBasic.Strings

Private Function ExportToCSV(ByVal stTable As String, ByVal stFile As String, ByVal bColumnNames As Boolean)

    Dim shell, tmp, fso, ts, line

    Dim Conn As ADODB.Connection = New ADODB.Connection
    Dim RS As ADODB.Recordset = New ADODB.Recordset
    Dim connectstring As String = My.Settings.connSQL 'your connection string here
    Conn.ConnectionString = My.Settings.connSQL
    Conn.Open()
    RS.ActiveConnection = Conn
    RS.Open("Select * from " & stTable, Conn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)

    shell = CreateObject("WScript.Shell")
    fso = CreateObject("Scripting.FileSystemObject")
    ts = fso.OpenTextFile(stFile, 2, True)
    line = ""
    If bColumnNames = True Then
        For Each tmp In RS.Fields
            line = line & tmp.Name & ","
        Next
        ts.WriteLine(Microsoft.VisualBasic.Strings.Left(line, Len(line) - 1))
    End If

    While Not RS.EOF
        line = ""
        For Each tmp In RS.Fields
            If IsDBNull(tmp.Value) Then
                line = line & ","
            Else
                If RS.Fields(tmp.name).Type = ADODB.DataTypeEnum.adVarChar Or RS.Fields(tmp.name).Type = ADODB.DataTypeEnum.adChar Or RS.Fields(tmp.name).Type = ADODB.DataTypeEnum.adVarWChar Or RS.Fields(tmp.name).Type = ADODB.DataTypeEnum.adWChar Then
                    line = line & """" & tmp.Value & ""","
                Else
                    line = line & tmp.value & ","
                End If
            End If
        Next
        ts.WriteLine(Microsoft.VisualBasic.Strings.Left(line, Len(line) - 1))
        RS.MoveNext()
    End While

    RS.Close()
    ts.close()
End Function
0 голосов
/ 06 октября 2015

Небольшая вспомогательная функция для экранирования специальных символов

'http://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules
Public Function EscapeCsvData(ByVal data As String) As String
    If (data.Contains("")) Then
        data = data.Replace("""", """""")
    End If

    If (data.Contains(",")) Then
        data = String.Format("""{0}""", data)
    End If

    If (data.Contains(System.Environment.NewLine)) Then
        data = String.Format("""{0}""", data)
    End If

    Return data
End Function
0 голосов
/ 26 марта 2012

Есть лучшие способы экспорта таблиц SQL Server в .CSV: см. здесь или здесь ; Подумайте о SELECT / INSERT INTO ", .GetRows () или .GetString ().

Решение с минимальным воздействием на ваш код использует функцию типа:

Function SaveValue(oFld)
  If IsNull(oFld.Value) Then
     SaveValue = "" ' or whatever you like
  Else
     SaveValue = oFld.Value
  End If
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...