public void UtilsTest_LiteDataTable_Serialization_Binary() { var table = new LiteDataTable(); table.Columns.Add(new LiteDataColumn("UserName", typeof(string))); table.Columns.Add(new LiteDataColumn("Age", typeof(string))); var row = table.NewRow(); row["UserName"] = "******"; row["Age"] = 26; table.Rows.Add(row); var row2 = table.NewRow(); row2["UserName"] = "******"; row2["Age"] = 25; table.Rows.Add(row2); var table2 = ObjectCloner.Clone(table); Assert.IsTrue(table2.Rows.Count == 2); Assert.IsTrue(table2[0]["UserName"].ToString() == "HuQingfang", "反序列化后,可以通过列名来获取列"); Assert.IsTrue(table2[0].GetString("UserName") == "HuQingfang"); Assert.IsTrue(table2[0].GetInt32("Age") == 26); Assert.IsTrue(table2[1].GetString("UserName") == "XuDandan"); Assert.IsTrue(table2[1].GetInt32("Age") == 25); }
public virtual List <OrganizationNotTree> GetByUserName(string userName) { FormattedSql sql = @"SELECT org.Id,org.Name FROM T_RBAC_Organization org LEFT JOIN T_RBAC_OrganizationUser ou on (org.id = ou.organizationid and ou.dbi_isphantom = 0) LEFT JOIN T_Users u on u.id = ou.userid and u.dbi_isphantom = 0 and u.wf_approvalstatus = 300 where org.wf_approvalstatus = 300 and(org.DBI_IsPhantom = 0 or org.DBI_IsPhantom is null) "; if (!string.IsNullOrEmpty(userName)) { sql.Append(string.Format("and u.username = '******' ", userName)); } sql.Append(" order by org.treeindex "); LiteDataTable dt = (this.DataQueryer as RdbDataQueryer).QueryTable(sql); List <OrganizationNotTree> result = new List <OrganizationNotTree>(); if (dt != null && dt.Rows.Count > 0) { foreach (var row in dt.Rows) { result.Add(new OrganizationNotTree { Id = Convert.ToInt64(row["Id"]), Name = Convert.ToString(row["Name"]) }); } } return(result); //return (OrganizationList)(this.DataQueryer as RdbDataQueryer).QueryData(sql); }
public void DT_POCO_DataTable() { var table = new LiteDataTable(); table.Columns.Add(new LiteDataColumn("Id", typeof(int))); table.Columns.Add(new LiteDataColumn("Name", typeof(string))); table.Columns.Add(new LiteDataColumn("DecimalProperty1", typeof(decimal))); table.Columns.Add(new LiteDataColumn("CreatedTime", typeof(DateTime))); table.Columns.Add(new LiteDataColumn("IsPhantom", typeof(bool))); table.Columns.Add(new LiteDataColumn("TreeIndex", typeof(string))); table.Columns.Add(new LiteDataColumn("TreePId", typeof(int))); var row = table.NewRow(); row["Id"] = 1; row["Name"] = "Rafy"; row["DecimalProperty1"] = (decimal)1; row["CreatedTime"] = DateTime.Now; row["IsPhantom"] = false; row["TreePId"] = null; table.Rows.Add(row); var customerList = table.ToPOCO <CustomerDTO>(); Assert.AreEqual(1, customerList.Count, "通过自己组装的 liteDataTable 应该能转换成一条 customer 的数据"); Assert.AreEqual(1, customerList[0].Id); Assert.AreEqual("Rafy", customerList[0].Name); Assert.AreEqual((decimal)1, customerList[0].DecimalProperty1); Assert.IsFalse(customerList[0].IsPhantom); Assert.IsNull(customerList[0].TreePId); }
/// <summary> /// liteDateTable 没有扩展属性也能转 entitylist 类型。 /// </summary> public void DT_LiteDataTable_ConvertToEntity_NoInheritProperty() { var table = new LiteDataTable(); table.Columns.Add(new LiteDataColumn("Id", typeof(int))); table.Columns.Add(new LiteDataColumn("Name", typeof(string))); table.Columns.Add(new LiteDataColumn("DecimalProperty1", typeof(decimal))); table.Columns.Add(new LiteDataColumn("DecimalProperty2", typeof(decimal))); table.Columns.Add(new LiteDataColumn("DecimalProperty3", typeof(decimal))); table.Columns.Add(new LiteDataColumn("CreatedTime", typeof(DateTime))); table.Columns.Add(new LiteDataColumn("CreatedUser", typeof(string))); table.Columns.Add(new LiteDataColumn("UpdatedTime", typeof(string))); table.Columns.Add(new LiteDataColumn("UpdatedUser", typeof(DateTime))); table.Columns.Add(new LiteDataColumn("TreeIndex", typeof(int))); table.Columns.Add(new LiteDataColumn("TreePId", typeof(int))); var row = table.NewRow(); row["Id"] = 1; row["Name"] = "HuKang"; row["DecimalProperty1"] = 1; row["DecimalProperty2"] = 2; row["DecimalProperty3"] = 3; row["CreatedTime"] = DateTime.Now; row["UpdatedTime"] = DateTime.Now; row["CreatedUser"] = "******"; row["UpdatedUser"] = "******"; table.Rows.Add(row); var customerList = table.ToEntityList <CustomerList>(); Assert.AreEqual(1, customerList.Count, "通过自己组装的且没有扩展属性的 liteDataTable 应该能转换成一条 customer 的数据"); }
/// <summary> /// 使用 IDataReader 中的结构为指定的表格添加列。 /// </summary> /// <param name="dataTable"></param> /// <param name="reader"></param> public static void AddColumns(LiteDataTable dataTable, IDataReader reader) { //columnsCount = reader.FieldCount; var schema = reader.GetSchemaTable(); foreach (DataRow dr in schema.Rows) { dataTable.Columns.Add(new LiteDataColumn(dr["ColumnName"].ToString(), dr["DataType"].ToString())); } }
public virtual List <OrganizationNotTree> GetByOrgIdAndUserNameContainChild(long orgId, string userName = "") { FormattedSql sql = new FormattedSql(); var dbSettingName = RBACPlugin.DbSettingName; var dbSetting = DbSetting.FindOrCreate(dbSettingName); if (DbSetting.IsOracleProvider(dbSetting)) { sql = @"select oorg.Id,oorg.Name from T_RBAC_ORGANIZATION oorg LEFT JOIN T_RBAC_OrganizationUser ou on(oorg.id = ou.organizationid and ou.dbi_isphantom = 0) LEFT JOIN T_Users u on(u.id = ou.userid and u.dbi_isphantom = 0) where(oorg.dbi_isphantom = 0 or oorg.dbi_isphantom is null) and oorg.wf_approvalstatus = 300 and oorg.treeindex like (select treeindex || '%' from T_RBAC_ORGANIZATION org where org.id = {0}) "; } else { sql = @"select oorg.Id,oorg.Name from T_RBAC_ORGANIZATION oorg LEFT JOIN T_RBAC_OrganizationUser ou on(oorg.id = ou.organizationid and ou.dbi_isphantom = 0) LEFT JOIN T_Users u on(u.id = ou.userid and u.dbi_isphantom = 0) where(oorg.dbi_isphantom = 0 or oorg.dbi_isphantom is null) and oorg.wf_approvalstatus = 300 and oorg.treeindex like (select treeindex + '%' from T_RBAC_ORGANIZATION org where org.id = {0}) "; } if (!string.IsNullOrEmpty(userName)) { sql.Append(string.Format("and u.username = '******' ", userName)); } sql.Parameters.Add(orgId); LiteDataTable dt = (this.DataQueryer as RdbDataQueryer).QueryTable(sql); List <OrganizationNotTree> result = new List <OrganizationNotTree>(); if (dt != null && dt.Rows.Count > 0) { foreach (var row in dt.Rows) { result.Add(new OrganizationNotTree { Id = Convert.ToInt64(row["Id"]), Name = Convert.ToString(row["Name"]) }); } } return(result); //return (OrganizationList)(this.DataQueryer as RdbDataQueryer).QueryData(sql); }
/// <summary> /// 填充实体 /// </summary> /// <param name="table">需要转换实体的 LiteDataTable</param> /// <param name="repo">实体的仓储</param> /// <param name="propertyToColumnMappings">属性和对应列的键值对集合</param> /// <param name="columnMapToProperty"> /// 此参数表示表格中的列的数据类型和是否直接映射实体的属性数据类型。 /// 如果传入 false,表示表格中的列数据类型和实体属性数据类型不一致。 /// </param> /// <returns></returns> private static EntityList ConvertEntitiesIntoList( LiteDataTable table, EntityRepository repo, IList <PropertyToColumnMapping> propertyToColumnMappings, bool columnMapToProperty = true ) { var resultList = repo.NewList(); var rdbDataProvider = ORM.RdbDataProvider.Get(repo); var columns = rdbDataProvider.DbTable.Columns; for (int i = 0, c = table.Rows.Count; i < c; i++) { var row = table.Rows[i]; var entityItem = repo.New(); for (int j = 0, c2 = propertyToColumnMappings.Count; j < c2; j++) { var mapping = propertyToColumnMappings[j]; var rowValue = row[mapping.ColumnIndex]; if (!columnMapToProperty) { for (int z = 0, z2 = columns.Count; z < z2; z++) { var column = columns[z]; //通过列名称相等匹配找到 rdbcolumn。 if (column.Name.EqualsIgnoreCase(mapping.ColumnName)) { column.WritePropertyValue(entityItem, rowValue); break; } } } else { entityItem.LoadProperty(mapping.Property, rowValue); } } resultList.Add(entityItem); } return(resultList); }
/// <summary> /// LiteDataTable 类型的扩展方法,实现 LiteDataTable 类型到 EntityList 类型的转换。 /// </summary> /// <typeparam name="TEntityList">The type of the entity list.</typeparam> /// <param name="table">The table.</param> /// <param name="columnMapToProperty"> /// 此参数表示表格中的列名是否直接映射实体的属性名。 /// true:表格列名就是属性名。 /// false:表格中列名映射的是实体对应的数据库表的列名,而非属性名。 /// 默认为 true。 /// </param> /// <returns></returns> public static TEntityList ToEntityList <TEntityList>(this LiteDataTable table, bool columnMapToProperty = true) where TEntityList : EntityList { //属性和对应列的键值对集合,为后面填充实体用。 var propertyMappings = new List <PropertyToColumnMapping>(10); var entityMatrix = EntityMatrix.FindByList(typeof(TEntityList)); var repo = RepositoryFacade.Find(entityMatrix.EntityType); var properties = repo.EntityMeta.EntityProperties; var columns = table.Columns; for (int i = 0, c = properties.Count; i < c; i++) { var propertyMeta = properties[i]; var property = propertyMeta.ManagedProperty; if (!property.IsReadOnly) { //这个位置是针对于时间戳的那几个字段 columnMeta 不为空 ,但是映射到数据库的 columnName 这个属性是空的。 //还有种情况是 columnMeta 为空,比如当对应的属性为 treeIndex。 var columnName = property.Name; if (!columnMapToProperty) { var columnMeta = propertyMeta.ColumnMeta; columnName = columnMeta == null ? propertyMeta.Name : columnMeta.ColumnName; } for (int columnIndex = 0, c2 = columns.Count; columnIndex < c2; columnIndex++) { var column = columns[columnIndex]; if (column.ColumnName.EqualsIgnoreCase(columnName)) { propertyMappings.Add(new PropertyToColumnMapping { Property = property, ColumnName = columnName, ColumnIndex = columnIndex }); break; } } } } return(ConvertEntitiesIntoList(table, repo, propertyMappings, columnMapToProperty) as TEntityList); }
public void UtilsTest_LiteDataTable_Serialization_WCF() { var table = new LiteDataTable(); table.Columns.Add(new LiteDataColumn("UserName", typeof(string))); table.Columns.Add(new LiteDataColumn("Age", typeof(string))); var row = table.NewRow(); row["UserName"] = "******"; row["Age"] = 26; table.Rows.Add(row); var row2 = table.NewRow(); row2["UserName"] = "******"; row2["Age"] = 25; table.Rows.Add(row2); //序列化。 var serializer = new DataContractSerializer(typeof(LiteDataTable)); //var serializer = new NetDataContractSerializer(); var stream = new MemoryStream(); serializer.WriteObject(stream, table); //读取 xml byte[] bytes = stream.ToArray(); string xml = Encoding.UTF8.GetString(bytes, 0, bytes.Length); Assert.IsTrue(xml.Contains("LiteDataTable")); Assert.IsTrue(xml.Contains("HuQingfang")); //反序列化 stream.Seek(0, SeekOrigin.Begin); var table2 = (LiteDataTable)serializer.ReadObject(stream); Assert.IsTrue(table2.Rows.Count == 2); Assert.IsTrue(table2[0]["UserName"].ToString() == "HuQingfang", "反序列化后,可以通过列名来获取列"); Assert.IsTrue(table2[0].GetString("UserName") == "HuQingfang"); Assert.IsTrue(table2[0].GetInt32("Age") == 26); Assert.IsTrue(table2[1].GetString("UserName") == "XuDandan"); Assert.IsTrue(table2[1].GetInt32("Age") == 25); }
/// <summary> /// 填充实体 /// </summary> /// <param name="liteDataTable">需要转换实体的 LiteDataTable</param> /// <param name="repo">实体的仓储</param> /// <param name="propertyToColumnMappings">属性和对应列的键值对集合</param> /// <returns></returns> private static EntityList ConvertEntitiesIntoList(LiteDataTable liteDataTable, EntityRepository repo, IList <PropertyToColumnMapping> propertyToColumnMappings) { var resultList = repo.NewList(); for (int i = 0, c = liteDataTable.Rows.Count; i < c; i++) { var row = liteDataTable.Rows[i]; var entityItem = repo.New(); for (int j = 0, c2 = propertyToColumnMappings.Count; j < c2; j++) { var mapping = propertyToColumnMappings[j]; var rowValue = row[mapping.ColumnName]; entityItem.LoadProperty(mapping.Property, rowValue); } resultList.Add(entityItem); } return(resultList); }
public void DT_LiteDataTable_CanConvertToEntity() { var table = new LiteDataTable(); table.Columns.Add(new LiteDataColumn("Id", typeof(int))); table.Columns.Add(new LiteDataColumn("Name", typeof(string))); table.Columns.Add(new LiteDataColumn("DecimalProperty1", typeof(decimal))); table.Columns.Add(new LiteDataColumn("DecimalProperty2", typeof(decimal))); table.Columns.Add(new LiteDataColumn("DecimalProperty3", typeof(decimal))); table.Columns.Add(new LiteDataColumn("CreatedTime", typeof(DateTime))); table.Columns.Add(new LiteDataColumn("CreatedUser", typeof(string))); table.Columns.Add(new LiteDataColumn("UpdatedTime", typeof(string))); table.Columns.Add(new LiteDataColumn("UpdatedUser", typeof(DateTime))); table.Columns.Add(new LiteDataColumn("IsPhantom", typeof(bool))); table.Columns.Add(new LiteDataColumn("TreeIndex", typeof(int))); table.Columns.Add(new LiteDataColumn("TreePId", typeof(int))); var row = table.NewRow(); row["Id"] = 1; row["Name"] = "HuKang"; row["DecimalProperty1"] = 1; row["DecimalProperty2"] = 2; row["DecimalProperty3"] = 3; row["CreatedTime"] = DateTime.Now; row["UpdatedTime"] = DateTime.Now; row["CreatedUser"] = "******"; row["UpdatedUser"] = "******"; row["IsPhantom"] = false; row["TreeIndex"] = null; row["TreePId"] = null; table.Rows.Add(row); var customerList = table.ToEntityList <CustomerList>(); Assert.AreEqual(1, customerList.Count, "通过自己组装的 liteDataTable 应该能转换成一条 customer 的数据"); Assert.AreEqual(customerList[0].Name, "HuKang", "通过自己组装的 liteDataTable 转换成的 customer 的数据应该保持一致"); }
/// <summary> /// 根据SQL Command返回的IDataReader填充数据容器 /// <para> /// 对于DBNull的值,填充null /// </para> /// </summary> /// <param name="dataTable">数据容器</param> /// <param name="reader">SQL语句返回的</param> public static void Fill(LiteDataTable dataTable, IDataReader reader) { if (dataTable.Columns.Count == 0) { AddColumns(dataTable, reader); } int columnsCount = dataTable.Columns.Count; while (reader.Read()) { var row = dataTable.NewRow(); for (int i = 0; i < columnsCount; i++) { var value = reader[i]; if (value != DBNull.Value) { row[i] = value; } } dataTable.Rows.Add(row); } }
/// <summary> /// 把DataTable填充到数据容器中,方便填充数据到DataWindow /// </summary> /// <param name="dataTable">数据容器</param> /// <param name="dt">DataTable</param> /// <Author>jianghaoqun 2007-06-07</Author> public static void Fill(LiteDataTable dataTable, DataTable dt) { int columnsCount = dataTable.Columns.Count; if (columnsCount == 0) { columnsCount = dt.Columns.Count; for (int i = 0; i < dt.Columns.Count; i++) { dataTable.Columns.Add(new LiteDataColumn(dt.Columns[i].ColumnName, dt.Columns[i].DataType)); } } foreach (DataRow dr in dt.Rows) { var row = dataTable.NewRow(); for (int i = 0; i < columnsCount; i++) { var value = dr[i]; if (value != DBNull.Value) { row[i] = value; } } dataTable.Rows.Add(row); } }
private static LiteDataTable ConvertToLiteDataTable(IDataReader reader) { var table = new LiteDataTable(); LiteDataTableAdapter.Fill(table, reader); return table; }
internal LiteDataRow(LiteDataTable table) { _table = table; _values = new object[_table.Columns.Count]; }
/// <summary> /// 将 LiteDataTable 转换为指定的 POCO 类型的实例列表。 /// </summary> /// <typeparam name="T">需要转换的类型。</typeparam> /// <param name="table"></param> /// <returns></returns> public static List <T> ToPOCO <T>(this LiteDataTable table) { //注意!!! //本方法与 ToPOCO<T>(this DataTable table) 方法一模一样。 //无法提取公共代码,修改者注意同时修改两处。 //找到实体中与该表格有映射的所有属性。 var propertyMappings = new List <CLRPropertyMapping>(10); var entityType = typeof(T); var properties = entityType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty); var columns = table.Columns; for (int i = 0, c = properties.Length; i < c; i++) { var propertyInfo = properties[i]; if (!propertyInfo.CanWrite) { continue; } var propertyName = propertyInfo.Name; for (int columnIndex = 0, c2 = columns.Count; columnIndex < c2; columnIndex++) { var column = columns[columnIndex]; if (column.ColumnName.EqualsIgnoreCase(propertyName)) { propertyMappings.Add(new CLRPropertyMapping { Property = propertyInfo, ColumnIndex = columnIndex }); break; } } } var list = new List <T>(10); //将每一行转换为实体,加入到列表中。 var rows = table.Rows; for (int i = 0, c = rows.Count; i < c; i++) { var row = rows[i]; var dto = Activator.CreateInstance <T>(); for (int j = 0, c2 = propertyMappings.Count; j < c2; j++) { var mapping = propertyMappings[j]; var value = row[mapping.ColumnIndex]; mapping.Property.SetValue(dto, value); } list.Add(dto); } return(list); }
/// <summary> /// LiteDataTable 类型的扩展方法,实现 LiteDataTable 类型到 EntityList 类型的转换。 /// </summary> /// <typeparam name="TEntityList"></typeparam> /// <param name="liteDataTable"></param> /// <param name="columnMapToProperty"> /// 此参数表示表格中的列名是否直接映射实体的属性名。 /// 如果传入 false,表示表格中的列名映射的是实体对应的数据库表的列名,而非属性名。 /// 默认为 true。 /// </param> /// <returns></returns> public static TEntityList ToEntityList <TEntityList>(this LiteDataTable liteDataTable, bool columnMapToProperty = true) where TEntityList : EntityList { var entityMatrix = EntityMatrix.FindByList(typeof(TEntityList)); var repo = RepositoryFacade.Find(entityMatrix.EntityType); //属性和对应列的键值对集合,为后面填充实体用。 var propertyToColumnMappings = new List <PropertyToColumnMapping>(10); //初始化 liteDataTable 中所有列名的集合,为后面初始化 propertyToColumnMappings 和判断属性用 。 var columns = liteDataTable.Columns; var tableColumnsNameList = new List <string>(); for (int i = 0, c = columns.Count; i < c; i++) { tableColumnsNameList.Add(columns[i].ColumnName); } //当表格中的列名映射的是实体对应的数据库表的列名,而非属性名的转换方法。 if (!columnMapToProperty) { var entityPropertyMetaList = repo.EntityMeta.EntityProperties; for (int i = 0, c = entityPropertyMetaList.Count; i < c; i++) { var propertyMeta = entityPropertyMetaList[i]; var manageProperty = propertyMeta.ManagedProperty; if (!manageProperty.IsReadOnly) { //这个位置是针对于时间戳的那几个字段 columnMeta 不为空 ,但是映射到数据库的 columnName 这个属性是空的。 //还有种情况是 columnMeta 为空,比如当对应的属性为 treeIndex。 var columnMeta = propertyMeta.ColumnMeta; var columnName = columnMeta == null ? propertyMeta.Name : columnMeta.ColumnName ?? propertyMeta.Name; for (int j = 0, c2 = tableColumnsNameList.Count; j < c2; j++) { if (tableColumnsNameList.Contains(columnName)) { propertyToColumnMappings.Add(new PropertyToColumnMapping { Property = manageProperty, ColumnName = columnName }); } } } } } else { var propertyList = repo.EntityMeta.ManagedProperties.GetCompiledProperties(); for (int i = 0, c = propertyList.Count; i < c; i++) { var property = propertyList[i]; var propertyName = property.Name; if (tableColumnsNameList.Contains(propertyName) && !property.IsReadOnly) { propertyToColumnMappings.Add(new PropertyToColumnMapping { Property = property, ColumnName = propertyName }); } } } return(ConvertEntitiesIntoList(liteDataTable, repo, propertyToColumnMappings) as TEntityList); }
// TODO: Database code really broken :( #region Database Code // Modified from falahati/LiteDBViewer private void FillDataGridView(IEnumerable <BsonDocument> documents) { if (collectionsList.Items.Contains("[QUERY]")) { collectionsList.Items.Remove("[QUERY]"); } dataGridView.DataSource = null; var ds = new LiteDataTable(); if (documents == null) { return; } foreach (var doc in documents) { var row = ds.NewRow() as LiteDataRow; if (row == null) { continue; } row.UnderlyingValue = doc; foreach (var prop in doc.RawValue) { if (prop.Value.IsMaxValue || prop.Value.IsMinValue) { continue; } if (!ds.Columns.Contains(prop.Key)) { ds.Columns.Add(new DataColumn(prop.Key, typeof(string))); } switch (prop.Value.Type) { case BsonType.Null: row[prop.Key] = "[NULL]"; break; case BsonType.Document: row[prop.Key] = prop.Value.AsDocument.RawValue.ContainsKey("_type") ? $"[OBJECT: {prop.Value.AsDocument.RawValue["_type"]}]" : "[OBJECT]"; break; case BsonType.Array: row[prop.Key] = $"[ARRAY({prop.Value.AsArray.Count})]"; break; case BsonType.Binary: row[prop.Key] = $"[BINARY({prop.Value.AsBinary.Length})]"; break; case BsonType.DateTime: row[prop.Key] = prop.Value.AsDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff"); break; case BsonType.String: row[prop.Key] = prop.Value.AsString; break; case BsonType.Int32: case BsonType.Int64: row[prop.Key] = prop.Value.AsInt64.ToString(); break; case BsonType.Decimal: case BsonType.Double: row[prop.Key] = prop.Value.AsDecimal.ToString(CultureInfo.InvariantCulture); break; default: row[prop.Key] = prop.Value.ToString(); break; } // End switch } // End foreach ds.Rows.Add(row); } // End foreach // Attatch Event Handlers ds.RowChanging += Ds_RowChanging; ds.ColumnChanging += Ds_ColumnChanging; ds.RowDeleting += Ds_RowDeleting; ds.TableNewRow += Ds_TableNewRow; dataGridView.DataSource = ds; }