传参的两种方式

  SQL语句的执行不可缺少参数的传递,传递参数直接拼接SQL语句不可避免会遇到SQL注入问题,会造成很严重的系统安全问题,所以一般会使用 SetParameterValue("@abc", abc),拼接一个可变的参数集合parms ,在SQl语句中使用如下

  

 <dataCommand name="SubmitProductEntryAudit" database="Write" commandType="Text">
    <commandText>
      <![CDATA[
UPDATE IPP3.dbo.Product_EntryInfo
SET EntryStatus = 1
WHERE ProductSysNo = @ProductSysNo
      ]]>
    </commandText>
    <parameters>
      <param name="@ProductSysNo" dbType="Int32"/>
    </parameters>

  这样做的最明显好处就是能够避免SQl注入问题,也能够灵活的设置参数和赋值。

  上面的方法虽然好,但是在有些时候还是会暴露出不足的,例如当前端的业务逻辑比较复杂的时候,比如多条件查询语句的时候,我们不能够确定用户是否回去选择一个条件,如果在SQL中判断参数的话,会造成SQl服务器的压力,所以最好的做法是传到SQL语句中有值筛选条件,这样的话我们可以在cs后台中拼接我们的SQl语句条件。

  

CustomDataCommand command = DataCommandManager.CreateCustomDataCommandFromConfig("QueryPagedMerchantBrandList");
            using (var sqlBuilder = new DynamicQuerySqlBuilder(command.CommandText,
                command, queryFilter, string.IsNullOrEmpty(queryFilter.SortFields) ? "SysNo DESC" : queryFilter.SortFields))
            {
                sqlBuilder.ConditionConstructor.AddCondition(QueryConditionRelationType.AND,
                    "mb.[MerchantSysNo]", DbType.Int32, "@MerchantSysNo", QueryConditionOperatorType.Equal, queryFilter.VendorSysNo);

                sqlBuilder.ConditionConstructor.AddCondition(QueryConditionRelationType.AND,
                   "b.BrandName_Ch", DbType.String, "@BrandName", QueryConditionOperatorType.Like, queryFilter.BrandName);

                sqlBuilder.ConditionConstructor.AddCondition(QueryConditionRelationType.AND,
                    "mb.[Status]", DbType.String, "@Status", QueryConditionOperatorType.Equal, queryFilter.Status);

                command.CommandText = sqlBuilder.BuildQuerySql();
                List<Merchant_BrandInfo> resultList = command.ExecuteEntityList<Merchant_BrandInfo>();
                int totalCount = Convert.ToInt32(command.GetParameterValue("@TotalCount"));

                if (resultList != null && resultList.Count > 0)
                {
                    foreach (var item in resultList)
                    {
                        item.AttachmentList =CommonDA.GetEntryAttachmentTypeListBySource(item.SysNo.Value,2);
                    }
                }
                return new QueryResult<Merchant_BrandInfo>()
                {
                    PageInfo = new PageInfo() { PageIndex = queryFilter.PageIndex, PageSize = queryFilter.PageSize, TotalCount = totalCount, SortBy = queryFilter.SortFields },
                    ResultList = resultList
                };
            }

  这两种方式基本上就能够满足一般的传递参数需求。当然这里的方法的复用性要求很高,一个好的架构能够兼容各种不同的需求,满足不同的业务需求。

  记录工作中点点滴滴。

posted @ 2015-06-02 18:20  Flying_Boy  阅读(1605)  评论(0编辑  收藏  举报