Execute方法用于不需要返回数据的执行语句,如DDL、UPDATE、DELETE语句。返回值为影响的行数。 Execute方法每次仅执行一条语句,对SQLServer支持多条语句一起执行,因此多条语句拼在一起执行没有问题,但Oracle下执行会报错。 如果需要执行多条语句,请调用批量执行方法:ExecuteBatch。 如果要执行SELECT语句,建议使用ExecuteReader方法。
执行DDL:
DBUtils.Execute(context, "CREATE TABLE T_TEMP(FID INT NOT NULL, FNAME VARCHAR(10) NULL ) ");
以下语句未使用参数化,会导致数据库硬解析影响性能。
foreach (FieldValue val in fieldValues)
{
string sql = string.Format("UPDATE T_DEMO set FValue = {0} where FID = {1} ", val.Value, val.Id); //注意此处val.Value不应该拼接,应使用参数化
DBUtils.Execute(Context, sql);
}
执行带参数的语句:
sql = "INSERT INTO t_temp(FId, FType, FKernelXml, FName, FDevType) VALUES (@FId, @FType, @FKernelXml, @FName, @FDevType)";
List<SqlParam> paramList = new List<SqlParam>();
paramList.Add(new SqlParam("@FId", KDDbType.AnsiString, formID)); //非unicode(varchar类型)
paramList.Add(new SqlParam("@FType", KDDbType.Int64, metadata.Type));
paramList.Add(new SqlParam("@FKernelXml", KDDbType.Xml, xml));
paramList.Add(new SqlParam("@FName", KDDbType.String, metadata.Name)); //unicode字符(nvarchar类型)
paramList.Add(new SqlParam("@FDevType", KDDbType.Int32, (int)metadata.DevType));
DBUtils.Execute(this.Context, sql, paramList);
file:///C:/Users/rd_weixy/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png ExecuteDynamicObject
执行指定的SQL并返回默认的一批使用DynamicObject集合描述的数据。
注:该方法内部是调用ExecuteDataReader,如果不是必须返回DynamicObject类型,建议使用ExecuteDataReader更好。
下面例子将获取的DynamicObject对象填充到单据体中。
//在表单插件中,应调用服务接口来获取数据,不能直接访问App服务
DynamicObjectCollection dcObjs = DBServiceHelper.ExecuteDynamicObject(this.View.Context, sql, null, null, System.Data.CommandType.Text, param);
//获取单据体数据包
DynamicObjectCollection dyCollection = (DynamicObjectCollection)this.View.Model.DataObject[EitityKey];
dyCollection.Clear();
DynamicObject dyObj;
foreach (var obj in dcObjs)
{
dyObj = (DynamicObject)dyCollection.DynamicCollectionItemPropertyType.CreateInstance();
dyObj["FDataCenterId"] = obj["FDataCenterId"];
dyObj["FDCNumber"] = obj["FNumber"];
dyObj["FDCName"] = obj["FName"];
if (!string.IsNullOrWhiteSpace(_currentDataCenterId) && dyObj["FDataCenterId"].Equals(_currentDataCenterId))
{
dyObj["FStatus"] = Kingdee.BOS.Resource.ResManager.LoadKDString("启用", "002014030004624", Kingdee.BOS.Resource.SubSystemType.BOS);
_isEnable = true;
}
else
{
dyObj["FStatus"] = "";
}
dyCollection.Add(dyObj);
}
服务接口使用的DynamicObject类型时,用ExecuteDynamicObject方法取数更方便,不需要自己转换。
string sql = @"select FUserID, FName, FFORBIDSTATUS FROM t_sec_user ";
DynamicObjectCollection charts = DBUtils.ExecuteDynamicObject(ctx, sql);
...
ISaveService saveService = App.ServiceHelper.GetService<ISaveService>();
saveService.Save(ctx, charts.ToArray<DynamicObject>());
以下例子ExecuteDyna