SSIS Visual Basic - 路径名中的单引号

SSIS Visual Basic - Single Quote in Path name

我的 SSIS 程序包中有一个 Visual Basic 步骤,用于从用户提供的目录中获取文件列表。此步骤在大多数情况下效果很好,但是当用户提供其中包含单引号的路径时,该步骤会失败并出现错误。

正在使用的路径: S:\Invoices - Miscellaneous\invoices 来自 Customer.17.14

产生错误: 错误:System.Reflection.TargetInvocationException:调用目标抛出异常。 ---> System.Data.SqlClient.SqlException:'d' 附近的语法不正确。 字符串')'后的引号不闭合。

下面是我在该步骤中使用的代码。但是,我应该指出的一件事是使用 xp_cmdshell 是不可能的,因为我们无法在这种环境中使用它。

Public Sub Main()

    Dim SourcePath As String

    SourcePath = Dts.Variables("SourcePath").Value

    Dim SQLStr As String    'SQL string to hold the root query
    Dim ConnString As String
    ConnString = "Data Source=SQLPROD;Initial Catalog=Customer;Integrated Security=SSPI;"
    Dim SQLConn As New SqlConnection()
    Dim SQLCmd As New SqlCommand()
    SQLConn.ConnectionString = ConnString
    SQLConn.Open() 'open connection
    SQLCmd.Connection = SQLConn
    'write root file list
    Dim di As New IO.DirectoryInfo(SourcePath)
    Dim fi As IO.FileInfo() = di.GetFiles
    Dim f As IO.FileInfo

    'list the names of all files in the specified directory
    For Each f In fi
        SQLStr = "INSERT into T_FILE_LIST(File) VALUES  ('" + di.ToString + "\" + f.ToString.Trim + "')"
        SQLCmd.CommandText = SQLStr
        SQLCmd.ExecuteNonQuery()
    Next
    SQLConn.Close()
    Dts.TaskResult = ScriptResults.Success
End Sub

如果您能提供任何帮助来帮助我解决这个问题,我们将不胜感激。

使用参数化查询而不是字符串连接。这将处理值中的单引号,并避免 SQL 注入攻击的可能性。像这样:

'list the names of all files in the specified directory
SQLStr = "INSERT into T_FILE_LIST(File) VALUES (@File)"
SQLCmd.CommandText = SQLStr
SQLCmd.Parameters.Add("@File", SqlDbType.VarChar)
For Each f In fi
    SQLCmd.Paramaters("@File").Value = IO.Path.Combine(di.ToString, f.ToString.Trim)
    SQLCmd.ExecuteNonQuery()
Next