FTP(File Transfer Protocol),是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息。
而在SSIS中,有一个FTP的组件,可以对它进行信息的配置,包括用户名、密码、端口号等等,如下图:
一般情况下,这些信息都是存在数据库中,然后通过SSIS菜单下的包配置来进行赋值,然而弊端就在于包配置信息无法直接读取加密信息,选择直接给FTP连接管理直接赋值的话,密码是无法保存的(PS:这是SSIS的一种自带保护机制),脚本是个好东西,在这里可以用来解决这个问题。
在上一篇有写到DES加密解密的方法,这里就不做赘述了,其实最主要的是要获得FTP的这个对象,首先我想到的是用DTS对象的Connections["FTPName"]来获取整个连接信息,结果经过测试得到的只是:Server name 和 Server port 值,所以用Dts对象的Connections获取这条路走不通,只能想另外的办法。在 SQL Server 2012 Integration Services 高级教程(第二版) 中提到FtpClientConnected这个对象,测试可以通过
ConnectionManager conn = default(ConnectionManager); FtpClientConnection ftp = default(FtpClientConnection); //获取FTP连接,名字保持一致,中文会导致乱码 conn = Dts.Connections["FTP Connection Manager"]; ftp = new FtpClientConnection(conn.AcquireConnection(null)); //ZCC为数据库中FTP连接信息表中的主键,获取密文密码 string CryPwd = GetConDb("ZCC")[0]; //对密文密码就行解密,得到明文 string Oldpwd = DecryptDES(CryPwd, UUkey); //将解密后的密码赋值给FTP对应的参数 ftp.ServerName = GetConDb("ZCC")[1]; ftp.ServerPort = int.Parse(GetConDb("ZCC")[2]); ftp.ServerUserName = GetConDb("ZCC")[3]; ftp.ServerPassword = Oldpwd;
代码是其次,最主要的是思想,在这里我做得处理是,从数据库中取出来对应的 Server Name、Server Port、ServerUserName、ServerPassword,然后用拼接字符串的方式连一起,然后用Split分割成一个数组,当然也可以直接将这四个数据放到数组中,GetConDb就是一个返回类型为数组的方法,返回的数组就是这四个数值,所以当得到ftp这个对象的时候,就可以根据数组的索引来给ftp对象中对应的配置参数赋值了。
public static string[] GetConDb(string MainConn) { string Username = ""; string UserPassword = ""; string Ip = ""; string Port = ""; string constr = "Data Source=.;Initial Catalog=ICBC;Integrated Security=SSPI;"; string sqlstr = @"select * from ICBC.dbo.[FTPConfigurations] where FTPMainConn='" + MainConn+ "'"; SqlConnection conn = new SqlConnection(constr); SqlCommand cmd = new SqlCommand(sqlstr, conn); conn.Open(); try { DataTable dt = new DataTable(); SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.Fill(dt); string ccc = dt.Rows[1]["FTPConnPath"].ToString(); for (int i = 0; i < dt.Rows.Count; i++) { string Sername = dt.Rows[i]["FTPConnPath"].ToString(); if (Sername.Contains("ServerUserName")) { Username = dt.Rows[i]["ConfiguredValue"].ToString(); } if (Sername.Contains("ServerPassword")) { UserPassword = dt.Rows[i]["FTPConnPwd"].ToString(); } if (Sername.Contains("[FTPConnectionString]")) { string ServerPort = dt.Rows[i]["FTPConnValue"].ToString(); Ip = ServerPort.Substring(0, ServerPort.Length - 3); Port = ServerPort.Substring(ServerPort.Length - 2, 2); } } string all = Username + ";" + UserPassword + ";" + Ip + ";" + Port; string[] strDb = all.Split(';'); return strDb; } catch (Exception ex) { throw new Exception(ex.Message); } finally { conn.Close(); } }
权当做学习笔记
-----市人皆大笑,举手揶揄之