Sql server 用于连接到SQL Server并将返回的存储过程结果写入Excel文件的Vb.Net脚本不再工作

Sql server 用于连接到SQL Server并将返回的存储过程结果写入Excel文件的Vb.Net脚本不再工作,sql-server,excel,vb.net,Sql Server,Excel,Vb.net,这种使用方法可以使运行非常平稳。但它不再工作了,我无法理解为什么它不会写入数据,或者它是否能够连接到数据库。它没有捕获和打印消息框,因此它一定没有失败 下面是我试图加载到Excel文件中的SQL Server数据库表的示例: 对于任何想要测试的人: CREATE TABLE [dbo].[tbl_Submitted_Jobs_List] ( [Recnum] [int] IDENTITY(1,1) NOT NULL, [DateOfService] [date] NULL,

这种使用方法可以使运行非常平稳。但它不再工作了,我无法理解为什么它不会写入数据,或者它是否能够连接到数据库。它没有捕获和打印消息框,因此它一定没有失败

下面是我试图加载到Excel文件中的SQL Server数据库表的示例:

对于任何想要测试的人:

CREATE TABLE [dbo].[tbl_Submitted_Jobs_List]
(
    [Recnum] [int] IDENTITY(1,1) NOT NULL,
    [DateOfService] [date] NULL,
    [JobName] [nvarchar](75) NULL,
    [JobID] [int] NULL,
    [Superintendent] [nvarchar](40) NULL,
    [ReportRun] [bit] NULL
) ON [PRIMARY]
GO

INSERT INTO tbl_Submitted_Jobs_List (DateOfService, JobName, JobID, Superintendent, email) 
VALUES
    ('2018-10-25', 'Chase Test Job', 2233, 'Forms', chase@test.com),
    ('2018-10-25', 'Chase Test Job', 2233, 'Forms', chase@test.com),
    ('2018-10-25', 'Chase Test Job', 2233, 'Forms', chase@test.com),
    ('2018-10-25', 'Trent Test Job', 1234, 'Test', cayers@test.com),
    ('2018-10-25', 'Trent Test Job', 1234, 'Test', cayers@test.com),
    ('2018-10-25', 'Trent Test Job', 1234, 'Test', cayers@test.com),
    ('2018-10-25', 'Trent Test Job', 1234, 'Test', cayers@test.com)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[Report_Daily_Superintendent_Jobs]
--Report_Daily_Superintendent_Jobs 
AS
BEGIN
    SELECT DateOfService, JobName, JobID, Superintendent, email
    FROM dbo.tbl_Submitted_Jobs_List 
    ORDER BY DateOfService, Superintendent
END
我仍在努力更好地解决代码故障。我的VB.Net不是很强大。但是在上面的T-SQL代码中,我删掉了一些连接,使存储过程更容易在本文中测试。结果表对我来说还是一样的

下面是我正在执行的VB.Net代码。我正在连接SQL Server并运行存储过程
Report\u Daily\u supervision\u Jobs

然后,我尝试解析结果,并将其加载到一个Excel文件中,该文件是我在C驱动器上为测试创建的,路径如下所示

我只是想验证代码是否工作正常,然后我可能正在查看MSSQL服务器的连接问题

如果有人真的有更好的技术来更有效地写入Excel文件,而这可能需要更少的读者操作,我总是很高兴听到批评

谢谢大家!

导入系统
导入System.Collections.Generic
导入System.ComponentModel
导入系统数据
导入System.Data.SqlClient
导入系统文本
导入系统。诊断
导入System.Collections.ObjectModel
导入System.Data.Odbc
导入System.IO
导入系统配置
命名空间WorkflowActivity.Scripting.SDKScript
公共类脚本1
继承RAScriptClass92
受保护的重写子执行()
尝试
Dim路径为String=“C:\Test\import\Reports\”和“Report\u supervision.csv”
Dim sw作为StreamWriter
Dim myServerAddress为String=“localhost\SQLEXPRESS”
将myDataBase设置为String=“TestDB”
将myUsername设置为String=“sa”
将myPassword设置为String=“password”
如果Directory.Exists(path)=False,则
CreateDirectory(路径)
如果结束
如果File.Exists(path)=False,则
sw=File.CreateText(路径)
sw.Flush()
sw.Close()
如果结束
sw=文件.AppendText(路径)
Dim con作为新的SqlConnection(“Server=“&myServerAddress&_
“Database=“&myDataBase&_
“用户ID=”&myUsername&_
“Password=“&myPassword&_
“Trusted_Connection=False;”)
Dim cmd作为新的SqlCommand(“[报告\日常\主管\工作]”,con)
con.Open()
作为SqlDataReader的Dim读取器
cmd.CommandTimeout=60
sw.WriteLine(“服务日期、职务名称、职务ID、主管、超级电子邮件”)
而reader.Read()
sw.WriteLine(String.Format(“{0}”、“{1}”、“{2}”、“{3}”、“{4}”)_
reader.GetString(0).Trim(“”)_
reader.GetString(1).Trim(“”)_
reader.GetString(2).Trim(“”)_
reader.GetString(3).Trim(“”)_
reader.GetString(4.Trim(“”))
结束时
sw.Flush()
sw.Close()
reader=cmd.ExecuteReader()
特例
Msgbox(“无法连接,错误:&ex.Message”)
结束尝试
端接头
末级
结束命名空间

您可以直接从SQL server生成
.csv
文件。请尝试以下操作:

EXEC master..xp_cmdshell 'SQLCMD -E -s"," -W -Q "SET NOCOUNT ON EXEC DBNAME.[dbo].[Report_Daily_Superintendent_Jobs]" | findstr /V /C:"-" /B > D:\outputfilename.csv'

请根据您的环境替换名称

我不确定它以前是如何工作的,但您必须先执行Reader,然后才能从中获取行:

            reader = cmd.ExecuteReader()  

            While reader.Read()

                    sw.WriteLine(String.Format("""{0}"",""{1}"",""{2}"",""{3}"",""{4}""", _
                    reader.GetString(0).Trim(" "), _
                    reader.GetString(1).Trim(" "), _
                    reader.GetString(2).Trim(" "), _
                    reader.GetString(3).Trim(" "), _
                    reader.GetString(4).Trim(" ")))

            End While

            sw.Flush()
            sw.Close()
我还建议您使用以下使用模式:

Dim sConnection As String = "server=     (local);uid=sa;pwd=PassWord;database=DatabaseName"
         Using Con As New SqlConnection(sConnection)
        Con.Open()
        Using Com As New SqlCommand("Select * From tablename", Con)
            Using RDR = Com.ExecuteReader()
                If RDR.HasRows Then
                    Do While RDR.Read
                        txtName.Text = RDR.Item("Name").ToString()
                    Loop
                End If
            End Using
        End Using
        Con.Close()
    End Using

你调试代码了吗?它似乎不是,所以你应该先这样做,然后再张贴在这里。您应该已经知道连接是否成功,因为抛出的特定异常会告诉您这一点。此外,如果您设置断点并逐步执行代码,那么您将确切看到行为首先偏离预期的那一行。如果您说(实际上没有说)它在调试时工作,但在预期的环境中不工作,那么请添加一些跟踪代码,也就是说,在不同阶段输出应用程序的状态,然后您可以确定应用程序到达的阶段以及状态与预期不符的位置。这看起来应该运行正常,但我得到的错误是:命名管道提供程序:无法打开与SQL Server的连接[2]。我检查了,所有的TCP/IP管道都为所有客户端协议启用了。找不到服务器或无法访问服务器。我在末尾替换了您的DBNAME和路径。我还缺少什么东西可以替换吗?EXEC master..xp_cmdshell'SQLCMD-E-s',“-W-Q”在EXEC PullSageData.[dbo].[Report_Daily_supervision_Jobs].“| findstr/V/C:”-“/B>C:\Laserfiche\import\Reports.csv'尝试在SQLCMD之后用-s选项传递服务器名。我用-s添加了服务器,输出看起来是空的。我进行了验证,并在预期的位置创建了csv文件。非常感谢你!在SQL中运行此命令要干净得多。