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

时间:2015-01-26 15:42:53

标签: ssis

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

正在使用的路径: S:\发票 - 其他\发票来自客户\ 12.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

您可以提供任何帮助我解决此问题的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用参数化查询而不是字符串连接。这将处理值中的单引号,并且还可以避免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