zoukankan      html  css  js  c++  java
  • [SSIS] 在脚本里面使用数据库连接字符串进行查询等处理, 入坑

     入坑.!!!!!

     SSIS 中dts包 设置的  ADO.Net连接, 在传入脚本的时候, 我要使用 数据库连接,进行数据的删除操作.

    于是我使用了 了如下的 代码  

      

    使用的是windows 身份验证, 发布到正式环境上的时候, 不能使用windows验证, 而要使用 账号密码登录, 结果我改完账号密码登陆以后,

    里面调用的地方,   connection.open 的时候就报错了, 说登录失败. 我看了看了一下连接字符串, 没有密码部分.

     这个 是 微软设置的dts 包或者项目 的安全性, 连接字符串的密码部分 不是对外公布的明文.  所以这样子去拿连接字符串,是拿不到的.

        现在提供以下解决方案

        先设两个变量, 然后 直接拿到 Connection

        

        IDTSConnectionManager100 connMgr;
        SqlConnection sqlConn;
     public override void AcquireConnections(object Transaction)
        {
    //获取 以及设置 Connection 连接 connMgr
    = this.Connections.DestConnStr; sqlConn = (SqlConnection)connMgr.AcquireConnection(Transaction); }
    public override void ReleaseConnections() { connMgr.ReleaseConnection(sqlConn); }
     public int ExecuteNonQuery(string sqlStr, CommandType cType, SqlParameter[] parms)
        {
            int result = 0;
           
            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = sqlConn; //直接使用 数据连接
                cmd.CommandType = cType;
                cmd.CommandText = sqlStr;
                if (parms != null)
                {
                    cmd.Parameters.AddRange(parms);
                }
                result = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                result = 0;
                throw ex;
            }
            
            return result;
        }

    最后别忘了 Despose

    public override void PostExecute()
        {
            base.PostExecute();
            /*
             * Add your code here
             */
            if (sqlConn != null)
                sqlConn.Dispose();
        }
    

     

    补充一下, 在dts 包 脚本组件 输入输出项的时候, 新增的输出列,插入到目标列, 如果脚本里面不对 输出列进行赋值, 输出列是会有默认值的

      datetime 的默认值 为  0000-00-00

      字符串 默认 为 空字符串( 而不是null)

      然后要使 数据库的目标插入的时候 是 null,要对 输入输入列进行 赋值, 

      例如: 

    Row.synctime_IsNull = true;

     补充2: 在执行存储过程, 使用 datetime  类型的参数, 传入到oledb , 因为设置的类型 为 datetime , 所以有默认值, 

     这或许是一个bug, 这个值不会发生改变, 就算外面发生了改变,  传入到存储过程里面, 也还是原来的初始值.

     解决这个问题的方案是:  将字段类型甚至为 string,而不是datetime , 然后  变量设置为 字符串表达式

     比如 更新的时候去系统运行的当前时间 , 使用系统时间, 字符串函数去转换一下

    SSSI里面的坑真多啊

  • 相关阅读:
    android游戏开发框架libgdx的使用(十二)—TiledMap地图的使用
    android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用
    子句判断、启动强度和去模糊化AForge.NET框架的使用(三)
    分享从网上收集的一些游戏资源,以RPG类为主
    android游戏开发框架libgdx的使用(十六)—使用TexturePacker工具加快开发速度
    android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动
    Ajax实现评论的顶和踩功能
    Jelastic支持java的PaaS
    真心好用的VS扩展NuGet
    分享几篇文章(PDF版)
  • 原文地址:https://www.cnblogs.com/mjxxsc/p/5666833.html
Copyright © 2011-2022 走看看