仓库温控管理系统项目开发

项目数据对象:

仓库:基本信息管理---增删改查

仓库信息:编号(唯一标识 标识列)、仓库名称、编码、分区数、描述

仓库分区:编号(唯一标识 标识列)、分区名、所属仓库(仓库编号)、室内温度、低温线、高温线、状态

产品        

产品信息: 产品编号、产品名称、产品编码、存储最低温度、存储最高温度、

产品入库功能:自编号、产品编号、分区编号、仓库编号、产品入库数量

入库信息记录:自编号、产品编号、分区编号、入库时间、入库数量

出库信息记录:自编号、产品编号、分区编号、入库时间、入库数量

仓库分区温控
用户

用户编号 

账号

密码

状态

删除标识列

数据库表单设计

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

STMS.DbUtility里的类

SqlHelp  执行命令

源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可。源码是经
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值