【问题标题】:VB Script to dump an SQL Server table to CSV将 SQL Server 表转储到 CSV 的 VB 脚本
【发布时间】:2012-04-09 18:02:03
【问题描述】:

我尝试制作一个 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

谢谢大家!

【问题讨论】:

  • 抱歉,忘了提,我也收到此错误:d.vbs(36, 3) Microsoft VBScript 运行时错误:无效使用 Null: 'Replace' for line: line=line & "" "" & Replace(tmp.Value,"""","""""") & ""","

标签: vbscript


【解决方案1】:

谢谢,这帮助我解决了类似的要求,所以我分享我所做的。

我对您的代码做了一些更改:

  1. 使用 VB.NET - 看起来您的代码是 VB6,但无论如何您可能会发现这很有用。
  2. 解决了空值问题。
  3. 插入了包含列名的选项。
  4. 使引号仅对文本列有条件。您可以注释掉该 IF 或修改条件。
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

【讨论】:

    【解决方案2】:

    有更好的方法将 SQL Server 表导出到 .CSV:请参阅 herehere;想想 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
    

    【讨论】:

    • 关于它们在这种情况下不可用的其他方式,我的服务器上只有 ASP.NET 访问权限,所以没有“sqlcmd”或“bcp”(我知道如何使用)
    • 我想我可以(但我必须测试它): For Each tmp In rs.Fields If IsNull(tmp.Value) Then line=line & """" & Replace(tmp.Value ,"""","""""") & """, Else line=line & """" & tmp.Value & """," End If Next
    【解决方案3】:

    转义特殊字符的小辅助函数

    '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
    

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多