项目数据对象:
仓库:基本信息管理---增删改查
仓库信息:编号(唯一标识 标识列)、仓库名称、编码、分区数、描述
仓库分区:编号(唯一标识 标识列)、分区名、所属仓库(仓库编号)、室内温度、低温线、高温线、状态
产品
产品信息: 产品编号、产品名称、产品编码、存储最低温度、存储最高温度、
产品入库功能:自编号、产品编号、分区编号、仓库编号、产品入库数量
入库信息记录:自编号、产品编号、分区编号、入库时间、入库数量
出库信息记录:自编号、产品编号、分区编号、入库时间、入库数量
仓库分区温控
用户
用户编号
账号
密码
状态
删除标识列
数据库表单设计
UserInfos 用户信息表
StoreInfos 仓库信息表
StoreRegionInfos 仓库分区信息表
ProductInfos 产品信息表
ProductStoreInfos 仓库库存信息表
ProductInStoreRecordInfos 仓库入库记录表
三层结构
UI: Winfrom
BLL:业务逻辑--业务逻辑处理,UI和DAL的桥梁
DAL:数据访问层--处理数据(数据库)
DbUtility:数据访问通用类库
Models:实体模型层,数据库中的表到实体对象之间的映射,存放实体类,类中的属性即表中的类名
DModels--数据表对应的实体类
UIModels--UI层,BLL层对应的实体类
VModels--视图对应的实体类
Common:辅助工具层
Communicate:通信类库
Common里面的类
创建表、列、主键的特性(Attribute)
特性:用于在运行时传递程序中各种元素(比如类或方法)的行为信息的声明性标签
TableAttribute:映射表名
/// <summary>
/// 表名特性
/// </summary>
[AttributeUsage(AttributeTargets.Class)] //特性应用于类
public class TableAttribute:Attribute
{
public string TableName { get; protected set; }
public TableAttribute(string tableName)
{
this.TableName = tableName;
}
}
ColumnAttribute:映射列名
/// <summary>
///映射列名特性,标注数据库列名,只有当属性名和数据库列名不一致时才会用到
/// </summary>
[AttributeUsage(AttributeTargets.Property)] //特性应用于类
public class ColumnAttribute : Attribute
{
public string ColumnName { get; protected set; }
public ColumnAttribute(string columnName)
{
this.ColumnName = columnName;
}
}
PrimaryKeyAttribute:标注主键
/// <summary>
/// 主键特性
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class PrimaryKeyAttribute : Attribute
{
public string PrimaryKey { get; protected set; }
public bool autoIncrement = false; //标注主键是否是自增的
public PrimaryKeyAttribute(string primaryKey)
{
this.PrimaryKey = primaryKey;
}
}
DbConvert 类型转换处理---DataRow/DataTable/SqlDataReader T/List<T>
// 将SqlDataReader对象转换成实体(返回一条数据)
public static T SqlDataReaderToModel<T>(SqlDataReader reader, string cols)
{
//创建指定类型的实例
T model = Activator.CreateInstance<T>();
Type type = typeof(T);
//获取指定列名的属性数组
var properties = PropertyHelp.GetTypePropertie<T>(cols); //获取T这个类里指定的属性
if (reader.Read())
{
//将指定列的值赋值给对应的属性
foreach (var p in properties)
{
string colName = p.GetColName(); //GetColName方法可以防止数据库里的列名和T里的类名不一致(该方法里用ColumnAttribute特性标注不一致的列名)
if (reader[colName] is DBNull)
{
p.SetValue(model, null); //SetValue方法可以让数据库里的内容正确的赋值到可空属性上
}
else
{
SetPropertyValue<T>(model, reader[colName], p);
}
}
return model;
}
else return default(T);
}
// 将数据库中的一行数据(DataRow)转换为指定类型(T)的对象
private static T DataRowToModel<T>(DataRow dr, string cols)
{
//创建实例对象,调用无参构造函数
T model = Activator.CreateInstance<T>();
Type type = typeof(T);
if (dr != null)
{
//获取指定列名的属性数组
var properties = PropertyHelp.GetTypePropertie<T>(cols);
//将第列的值赋值给对应的属性
foreach (var p in properties)
{
string colName = p.GetColName();
if (dr[colName] is DBNull)
p.SetValue(model, null);//为属性设置值
else
{
SetPropertyValue<T>(model, dr[colName], p);
}
}
return model;
}
else
return default(T);
}
DAL里的类
CreateSql 生成sql语句:增Insert删Delete改Update查Select
插入insert
public static SqlModel GetInsertSqlAndParas<T>(T t,string cols,int isRetun)
{
Type type = typeof(T);
PropertyInfo[] properties = PropertyHelp.GetTypePropertie<T>(cols); //返回指定的cols的属性名
string priName = type.GetPrimary();//获取主键名(用PrimaryKeyAttribute标识的属性名,不需要显式插入)
//生成要插入的列名{1}
string columns = string.Join(",", properties.Where(p => p.Name != priName).Select(p => $"[{p.GetColName()}]"));
//生成插入的参数{2}
string paraColumns = string.Join(",",properties.Where(p=>p.Name!= priName).Select(p =>$"@{p.GetColName()}"));
//参数数组的生成
SqlParameter[] arrParas = CreateParameters<T>(properties, t);
//Sql语句的生成
string sql = $"INSERT INTO [{type.GetTName()}]({columns}) VALUES({paraColumns})";
if (isRetun == 1)
{
sql += ";select @@identity"; //是否获取自增长主键值
}
return new SqlModel() { Sql = sql, SqlParaArray = arrParas };
}