传参的两种方式
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 }; }
这两种方式基本上就能够满足一般的传递参数需求。当然这里的方法的复用性要求很高,一个好的架构能够兼容各种不同的需求,满足不同的业务需求。
记录工作中点点滴滴。