我的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
您可以提供任何帮助我解决此问题的帮助将不胜感激。
答案 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