【问题标题】:How to run SQLCMD script using VB.NET如何使用 VB.NET 运行 SQLCMD 脚本
【发布时间】:2017-03-11 09:05:56
【问题描述】:

我正在尝试使用 VB.NET 代码使用 SQLCMD(SQL 命令提示符)执行 SQL 查询。我正在使用 Windows Shell 脚本连接到服务器并执行查询并将结果集存储在 Excel 文件中。下面是我的代码,它不起作用。 下面的代码中缺少什么?

    Dim Command
    Dim ServerName As String
    Dim DatabaseName As String
    Dim QueryToExceute As String

    ServerName = "IN2175533W1"
    DatabaseName = "C:\FileDirectory\XYZ.mdf"
    QueryToExceute = "Select * from Table_Name"

   Command = """C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE"" " & "-S " & ServerName & " -d " & DatabaseName & " -Q " & QueryToExceute & " -s" & "," & " -o" & "C:\TestQuery.xlsx"

    Dim wsh As Object = CreateObject("WScript.Shell")

    'Using WScript to execute Stuff
    wsh = CreateObject("WScript.Shell")
    wsh.Run(Command)

我也尝试了进程类,但它不起作用。以下是我的代码:

    Dim Command
    Dim ServerName As String
    Dim DatabaseName As String
    Dim QueryToExceute As String

    ServerName = "IN2175533W1"
    DatabaseName = "C:\ABC\XYZ.mdf"
    QueryToExceute = "Select * from Quality"


        Dim Process = New Process()
    Process.StartInfo.UseShellExecute = False
    Process.StartInfo.RedirectStandardOutput = True
    Process.StartInfo.RedirectStandardError = True
    Process.StartInfo.CreateNoWindow = True
    Process.StartInfo.FileName = "SQLCMD.EXE"
    Process.StartInfo.Arguments = "-S " & ServerName & "-d" & DatabaseName & "-Q" & QueryToExceute & "-s" & "," & "-o" & "C:\Testing1.xlsx"

    Process.StartInfo.WorkingDirectory = "C:\users\rahul.wankhade\Desktop"
    Process.Start()
    Process.WaitForExit()

【问题讨论】:

  • SQLCMD 本身就是一个实用程序和应用程序。你应该使用Process class
  • @Rahul....我尝试了进程类但无法执行查询。

标签: sql .net vb.net


【解决方案1】:

这是我测试的,注意我更改了服务器、数据库和查询以匹配我的机器。我正在通过 VS2015 使用字符串插值。

Module Module1
    Sub Main()
        Dim ServerName As String = "KARENS-PC"
        Dim DatabaseName As String = "C:\Data\NORTHWND.MDF"
        Dim DoubleQuote As String = Chr(34)
        Dim QueryToExceute As String =
            $"{DoubleQuote}SELECT CompanyName,ContactName FROM Customers{DoubleQuote}"
        Dim ExportFileName As String =
            $"{DoubleQuote}C:\Data\MyDataFromSqlServer.csv{DoubleQuote}"

        Dim Process = New Process()
        Process.StartInfo.UseShellExecute = False
        Process.StartInfo.RedirectStandardOutput = True
        Process.StartInfo.RedirectStandardError = True
        Process.StartInfo.CreateNoWindow = True
        Process.StartInfo.FileName = "SQLCMD.EXE"
        Process.StartInfo.Arguments =
            $"-S {ServerName} -d {DatabaseName} -E -Q {QueryToExceute} -o {ExportFileName} -h-1 -s"","" -w 700"
        Process.StartInfo.WorkingDirectory = "C:\Data"
        Process.Start()
        Process.WaitForExit()
        Console.WriteLine("Done")
        Console.ReadLine()

    End Sub
End Module

没有VS2015的常规方式

Module Module1
    Sub Main()
        Dim ServerName As String = "KARENS-PC"
        Dim DatabaseName As String = "NorthWindAzure"
        Dim DoubleQuote As String = Chr(34)
        Dim QueryToExceute As String =
            DoubleQuote & "SELECT CompanyName,ContactName FROM Customers" & DoubleQuote
        Dim ExportFileName As String =
            DoubleQuote & "C:\Data\MyDataFromSqlServer.csv" & DoubleQuote

        Dim Process = New Process()
        Process.StartInfo.UseShellExecute = False
        Process.StartInfo.RedirectStandardOutput = True
        Process.StartInfo.RedirectStandardError = True
        Process.StartInfo.CreateNoWindow = True
        Process.StartInfo.FileName = "SQLCMD.EXE"
        Process.StartInfo.Arguments =
            "-S " & ServerName & " -d " & DatabaseName & " -E -Q " &
            QueryToExceute & " -o " & ExportFileName & "  -h-1 -s"","" -w 700"
        Process.StartInfo.WorkingDirectory = "C:\Data"

        Process.Start()
        Process.WaitForExit()
        Console.WriteLine("Done")
        Console.ReadLine()
    End Sub
End Module

【讨论】:

  • ...非常感谢..我正在使用 Visual Studio 2012,其中字符串插值不起作用....您能否纠正您的代码以在 Visual Studio 2012 中使用它
  • 这就是为什么指出版本是个好主意 :-) 我用 VS2012 的第二个版本编辑了我的帖子,
【解决方案2】:

我做的另一种方法是在代码下面,读出字符串对象中的所有代码,通过将 Go 替换为任何其他符号来解析它并逐个执行数组。

Sub ExecuteWithCommand()
    Try
        Dim sFile As FileInfo = New FileInfo(Directory.GetCurrentDirectory.ToString() & "\Script.sql")
        If (sFile.Exists = True) Then
            Dim dbObj = New SqlDataAccess()   
           'your SQL data-access class'
            Dim objReader As New System.IO.StreamReader(Directory.GetCurrentDirectory.ToString() & "\Script.sql")
            Dim scriptArr As String()
            Dim i As Integer
            dbObj.Command.CommandText = objReader.ReadToEnd.Replace("GO", "#")  
            'use any other symbol which you want, keeping in mind, its not used elsewhere in script'
            scriptArr = dbObj.Command.CommandText.Split("#")

            For i = 0 To scriptArr.Length - 1
                dbObj.Command.CommandText = scriptArr.GetValue(i)
                dbObj.Command.ExecuteNonQuery()
            Next

        End If
    Catch ex As Exception            
        Console.WriteLine(ex.Message)
    End Try

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多