zoukankan      html  css  js  c++  java
  • 传参的两种方式

      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
                    };
                }

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

      记录工作中点点滴滴。

  • 相关阅读:
    读《万历十五年》和《一个广告人的自白》
    Windows Phone开发(26):启动器与选择器之MediaPlayerLauncher和SearchTask
    Windows Phone开发(24):启动器与选择器之发送短信
    Windows Phone开发(25):启动器与选择器之WebBrowserTask
    linux服务器,svn认证失败,配置问题,防火墙等等
    nginx 防火墙、权限问题
    本地phpstudy开发中apache可以用,nginx不可用,
    nginx https配置后无法访问,可能防火墙在捣鬼
    为了解决linux配置Nginx 只能关闭防火墙才能访问的问题
    搜集点shell资料 规格严格
  • 原文地址:https://www.cnblogs.com/a164266729/p/4547384.html
Copyright © 2011-2022 走看看