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
我的 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