说明:本人完成的工作是对传感器--超声波物位计进行硬件集成,上位机通过串口接收传感器数据并将其存到数据库中;在DAL层实现对数据库的增删改查,其中包含两个数据表分别是WaterLevelSet表和WaterLevelRecord表,以下代码即是完成对两张表进行数据操作。

 /*----------------------------------------------------------------
// Copyright (C) 2013 *************
// 版权所有。
//
// 文件名:WaterLevelDao.cs
// 文件功能描述:定义水位计设置信息相关的数据访问对象
//
// 创建标识:2013-9-22
//
// 修改标识:2013-9-23
// 修改描述:添加GetAllWaterLevelSetInfo,AddWaterLevelSetInfo,
//ModifyWaterLevelSetInfo,DelWaterLevelSetInfo等方法
//
// 修改标识:2013-9-24
// 修改描述:修改可空字段的数据绑定
//修改标识:2013-9-26
// 修改描述:修改AddWaterLevelSet,去掉SELECT @@IDENTITY
//
//----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMOS.Model.Device;
using System.Data.SqlClient;
using System.Data; namespace SMOS.DAL.Device
{
public class WaterLevelSetDao
{
/// <summary>
/// 根据设备ID获取水位计设置信息
/// </summary>
/// <param name="deviceID"></param>
/// <returns>水位计设置信息</returns>
public WaterLevelSetInfo GetWaterLevelSetInfo(int deviceID)
{
string sql =
@"select t.DeviceID,t.BaseLevel,t.Remark,t.Port,
t.BaudRate,t.DataBites,t.ParityBit,t.StopBits,t.AcquisitionInterval,
t.ConnectType,t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime
from dbo.WaterLevelSet t(nolock)
where t.DeviceID=@DeviceID"; IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
}; WaterLevelSetInfo entity = null;
DataSet ds = DBHelper.ExecuteDataset(sql,paras.ToArray()); if (ds == null || ds.Tables.Count <= || ds.Tables[].Rows.Count <= )
return entity;
return DataRowBinding(ds.Tables[].Rows[]);
}
/// <summary>
/// 获取所有水位计设置信息
/// </summary>
/// <returns>水位计设置列表</returns>
public IList<WaterLevelSetInfo> GetAllWaterLevelSetInfo()
{
string sql =
@"select t.DeviceID,t.BaseLevel,t.Remark,t.Port,
t.BaudRate,t.DataBites,t.ParityBit,t.StopBits,t.AcquisitionInterval,
t.ConnectType,t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime
from dbo.WaterLevelSet t(nolock)
where 1=1";
IList<WaterLevelSetInfo> lstWaterLevelSetInfo = new List<WaterLevelSetInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql);
if (ds == null || ds.Tables.Count <= )
return lstWaterLevelSetInfo;
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelSetInfo entity = DataRowBinding(dr);
if (entity != null)
lstWaterLevelSetInfo.Add(entity);
}
return lstWaterLevelSetInfo;
}
/// <summary>
/// 增加水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录数</returns>
public int AddWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql=
@"INSERT INTO dbo.WaterLevelSet
(DeviceID,BaseLevel,Remark,Port,BaudRate,
DataBites,ParityBit,StopBits,AcquisitionInterval,
ConnectType,CreateBy,CreateTime
)
VALUES
(@DeviceID,@BaseLevel,@Remark,@Port,@BaudRate,
@DataBites,@ParityBit,@StopBits,@AcquisitionInterval,
@ConnectType,@CreateBy,@CreateTime
)";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID},
new SqlParameter("@BaseLevel",SqlDbType.Decimal){Value = waterLevelSetInfo.BaseLevel},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = waterLevelSetInfo.Remark},
new SqlParameter("@Port",SqlDbType.Int){Value = waterLevelSetInfo.Port},
new SqlParameter("@BaudRate",SqlDbType.Int){Value = waterLevelSetInfo.BaudRate},
new SqlParameter("@DataBites",SqlDbType.Int){Value = waterLevelSetInfo.DataBits},
new SqlParameter("@ParityBit",SqlDbType.Int){Value = waterLevelSetInfo.ParityBit},
new SqlParameter("@StopBits",SqlDbType.Int){Value = waterLevelSetInfo.StopBits},
new SqlParameter("@AcquisitionInterval",SqlDbType.Int){Value = waterLevelSetInfo.AcquisitionInterval},
new SqlParameter("@ConnectType",SqlDbType.TinyInt){Value = waterLevelSetInfo.ConnectType.GetHashCode()},
new SqlParameter("@CreateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@CreateTime",SqlDbType.DateTime){Value = DateTime.Now},
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 修改水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录</returns>
public int ModifyWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql =
@"UPDATE dbo.WaterLevelSet
SET DeviceID=@DeviceID
,BaseLevel=@BaseLevel
,Remark=@Remark
,Port=@Port
,BaudRate=@BaudRate
,DataBites=@DataBites
,ParityBit=@ParityBit
,StopBits=@StopBits
,AcquisitionInterval=@AcquisitionInterval
,ConnectType=@ConnectType
,UpdateBy=@UpdateBy
,UpdateTime=@UpdateTime
WHERE DeviceID=@DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID},
new SqlParameter("@BaseLevel",SqlDbType.Decimal){Value = waterLevelSetInfo.BaseLevel},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = waterLevelSetInfo.Remark},
new SqlParameter("@Port",SqlDbType.Int){Value = waterLevelSetInfo.Port},
new SqlParameter("@BaudRate",SqlDbType.Int){Value = waterLevelSetInfo.BaudRate},
new SqlParameter("@DataBites",SqlDbType.Int){Value = waterLevelSetInfo.DataBits},
new SqlParameter("@ParityBit",SqlDbType.Int){Value = waterLevelSetInfo.ParityBit},
new SqlParameter("@StopBits",SqlDbType.Int){Value = waterLevelSetInfo.StopBits},
new SqlParameter("@AcquisitionInterval",SqlDbType.Int){Value = waterLevelSetInfo.AcquisitionInterval},
new SqlParameter("@ConnectType",SqlDbType.TinyInt){Value = waterLevelSetInfo.ConnectType.GetHashCode()},
new SqlParameter("@UpdateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@UpdateTime",SqlDbType.DateTime){Value = DateTime.Now},
};
return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 删除水位计设置信息
/// </summary>
/// <param name="waterLevelSetInfo">水位计设置信息</param>
/// <returns>操作记录</returns>
public int DelWaterLevelSetInfo(WaterLevelSetInfo waterLevelSetInfo)
{
if (waterLevelSetInfo == null)
{
return ;
}
string sql =
@"DELETE FROM dbo.WaterLevelSet
WHERE DeviceID = @DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = waterLevelSetInfo.DeviceID },
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
#region 数据绑定
private WaterLevelSetInfo DataRowBinding(DataRow dr)
{
if (dr == null)
{
return null;
} WaterLevelSetInfo entity = new WaterLevelSetInfo();
entity.DeviceID = Convert.ToInt32(dr["DeviceID"]);
entity.BaseLevel = Convert.ToDecimal(dr["BaseLevel"]); if (dr["Remark"] != DBNull.Value)
{
entity.Remark = dr["Remark"].ToString();
}
else
{
entity.Remark = string.Empty;
}
entity.Port = Convert.ToInt32(dr["Port"]);
entity.BaudRate = Convert.ToInt32(dr["BaudRate"]);
if (dr["DataBites"] != DBNull.Value)
{
entity.DataBits = Convert.ToInt32(dr["DataBites"]);
}
if (dr["ParityBit"] != DBNull.Value)
{
entity.ParityBit = Convert.ToInt32(dr["ParityBit"]);
}
if (dr["StopBits"] != DBNull.Value)
{
entity.StopBits = Convert.ToInt32(dr["StopBits"]);
}
if (dr["AcquisitionInterval"] != DBNull.Value)
{
entity.AcquisitionInterval = Convert.ToInt32(dr["AcquisitionInterval"]);
}
if (dr["ConnectType"] != DBNull.Value)
{
entity.ConnectType = SMOS.Model.Eunm.ConvertToEnum<SMOS.Model.Eunm.DeviceConnectType>(dr["ConnectType"]);
}
if (dr["CreateBy"] != DBNull.Value)
{
entity.CreateBy = dr["CreateBy"].ToString();
}
else
{
entity.CreateBy = string.Empty;
}
entity.CreateTime = Convert.ToDateTime(dr["CreateTime"]);
if (dr["UpdateBy"] != DBNull.Value)
{
entity.UpdateBy = dr["UpdateBy"].ToString();
}
else
{
entity.UpdateBy = string.Empty;
}
if (dr["UpdateTime"] != DBNull.Value)
{
entity.UpdateTime = Convert.ToDateTime(dr["UpdateTime"]);
}
return entity;
}
#endregion
}
}
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMOS.Model.Device;
using System.Data.SqlClient;
using System.Data; namespace SMOS.DAL.Device
{
public class WaterLevelRecordDao
{
/// <summary>
/// 查出水位计记录信息的最后一条记录
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <returns>操作记录</returns>
public WaterLevelRecordInfo GetLastWaterLevelRecordInfo(int deviceID)
{
string sql =
@"select top 1
t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID
order by t.CreateTime desc"; IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
}; WaterLevelRecordInfo entity = null;
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray()); if (ds == null || ds.Tables.Count <= || ds.Tables[].Rows.Count <= )
{
return entity;
}
return DataRowBinding(ds.Tables[].Rows[]); }
/// <summary>
/// 查询水位计的记录信息
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <returns>记录信息</returns>
public IList<WaterLevelRecordInfo> GetWaterLevelRecordInfos(int deviceID)
{
string sql =
@"select t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.UpdateBy,t.UpdateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID}
};
IList<WaterLevelRecordInfo> lstWaterLevelRecordInfo = new List<WaterLevelRecordInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray()); if (ds == null || ds.Tables.Count <= )
return lstWaterLevelRecordInfo;
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelRecordInfo entity = DataRowBinding(dr);
if (entity != null)
{
lstWaterLevelRecordInfo.Add(entity);
}
}
return lstWaterLevelRecordInfo;
}
/// <summary>
/// 分时间查出水位计相应记录信息
/// </summary>
/// <param name="deviceID">设备ID</param>
/// <param name="startTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns>记录信息</returns>
public IList<WaterLevelRecordInfo> GetWaterLevelRecordInfos(int deviceID, DateTime startTime, DateTime endTime)
{
string sql =
@"select t.RecordID,t.DeviceID,t.MeasuredLevel,t.RecordTime,
t.CreateBy,t.CreateTime,t.Remark
from dbo.WaterLevelRecord t(nolock)
where t.DeviceID=@DeviceID and RecordTime between @startTime and @endTime";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = deviceID},
new SqlParameter("@startTime",SqlDbType.DateTime){Value = startTime },
new SqlParameter("@endTime",SqlDbType.DateTime){Value = endTime }
};
IList<WaterLevelRecordInfo> lstWaterLevelRecordInfos = new List<WaterLevelRecordInfo>();
DataSet ds = DBHelper.ExecuteDataset(sql, paras.ToArray());
if (ds == null || ds.Tables.Count <= )
{
return lstWaterLevelRecordInfos;
}
foreach (DataRow dr in ds.Tables[].Rows)
{
WaterLevelRecordInfo entity = DataRowBinding(dr);
if (entity != null)
{
lstWaterLevelRecordInfos.Add(entity);
}
}
return lstWaterLevelRecordInfos;
}
/// <summary>
/// 增加水位计记录信息
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int AddWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"INSERT INTO dbo.WaterLevelRecord
(DeviceID,MeasuredLevel,RecordTime,
CreateBy,CreateTime,Remark
)
VALUES
(@DeviceID,@MeasuredLevel,@RecordTime,
@CreateBy,@CreateTime,@Remark
)
SELECT @@IDENTITY";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@DeviceID",SqlDbType.Int){Value = recordInfo.DeviceID},
new SqlParameter("@MeasuredLevel",SqlDbType.Decimal){Value = recordInfo.MeasuredLevel},
new SqlParameter("@RecordTime",SqlDbType.DateTime){Value = recordInfo.RecordTime},
new SqlParameter("@CreateTime",SqlDbType.DateTime){Value = DateTime.Now},
new SqlParameter("@CreateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@Remark",SqlDbType.NChar,){Value = recordInfo.Remark},
};
object ret = DBHelper.ExecuteScalar(sql, paras.ToArray());//返回非表类查询结果,自增的ID
if (ret != null && int.Parse(ret.ToString()) >= )
{
return int.Parse(ret.ToString());
}
return ;
}
/// <summary>
/// 更新水位计记录
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int ModifyWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"UPDATE dbo.WaterLevelRecord
SET DeviceID=@DeviceID
,MeasuredLevel=@MeasuredLevel
,RecordTime=@RecordTime
,UpdateBy=@UpdateBy
,UpdateTime=@UpdateTime
,Remark=@Remark
WHERE RecordID=@RecordID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@RecordID",SqlDbType.Int){Value = recordInfo.RecordID},
new SqlParameter("@DeviceID",SqlDbType.Int){Value = recordInfo.DeviceID},
new SqlParameter("@MeasuredLevel",SqlDbType.Decimal){Value = recordInfo.MeasuredLevel},
new SqlParameter("@RecordTime",SqlDbType.DateTime){Value = recordInfo.RecordTime},
new SqlParameter("@UpdateTime",SqlDbType.DateTime){Value = DateTime.Now},
new SqlParameter("@UpdateBy",SqlDbType.NVarChar,){Value = Global.GlobalInfo.loginInfo.LoginAccount},
new SqlParameter("@Remark",SqlDbType.NVarChar,){Value = recordInfo.Remark},
};
return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
/// <summary>
/// 删除水位计记录信息
/// </summary>
/// <param name="recordInfo">水位计记录信息</param>
/// <returns>操作记录</returns>
public int DelWaterLevelRecordInfo(WaterLevelRecordInfo recordInfo)
{
if (recordInfo == null)
{
return ;
}
string sql =
@"DELETE FROM dbo.WaterLevelRecord
WHERE RecordID=@RecordID";
IList<SqlParameter> paras = new List<SqlParameter>()
{
new SqlParameter("@RecordID",SqlDbType.Int){Value = recordInfo.RecordID },
}; return DBHelper.ExecuteNonQuery(sql, paras.ToArray());
}
#region 数据绑定
private WaterLevelRecordInfo DataRowBinding(DataRow dr)
{
if (dr == null)
{
return null;
}
WaterLevelRecordInfo entity = new WaterLevelRecordInfo();
entity.DeviceID = Convert.ToInt32(dr["DeviceID"]);
entity.MeasuredLevel=Convert.ToDecimal(dr["MeasuredLevel"]);
if (dr["Remark"] != DBNull.Value)
{
entity.Remark = dr["Remark"].ToString();
}
else
{
entity.Remark = string.Empty;
}
entity.RecordTime = Convert.ToDateTime(dr["RecordTime"]);
if (dr["CreateBy"] != DBNull.Value)
{
entity.CreateBy= dr["CreateBy"].ToString();
}
else
{
entity.CreateBy = string.Empty;
}
entity.CreateTime = Convert.ToDateTime(dr["CreateTime"]);
if (dr["UpdateBy"] != DBNull.Value)
{
entity.UpdateBy = dr["UpdateBy"].ToString();
}
else
{
entity.UpdateBy = string.Empty;
}
if (dr["UpdateTime"] != DBNull.Value)
{
entity.UpdateTime = Convert.ToDateTime(dr["UpdateTime"]);
} return entity;
}
#endregion
}
}

  若需转载请标明出处或链接http://www.cnblogs.com/EaIE099/,本人初入职场,对编程也是一个菜鸟,只想把自己所学点滴记录下来,如有不合理的地方希望各位高手多多指点,非常感谢!

用C#实现对MSSqlServer数据库的增删改查---DAL层的更多相关文章

  1. 用C#实现对MSSqlServer数据库的增删改查---Server层(WaterLevelRecordServer.cs、DeviceRecordServer.cs)

    抛开现实的残酷与无奈,对技术孜孜不倦的追求,从专注到执着,从疯狂到忘我,始终坚信代码可以改变世界,更能改变自己的人生. WaterLevelRecordServer.cs using System; ...

  2. 用C#实现对MSSqlServer数据库的增删改查---Server层(WaterLevelSetServer.cs、DeviceSetServer.cs)

    在Server层定义WaterLevelSetServer和WaterLevelRecordServer两个子类,分别继承DeviceSetServer和DeviceRecordServer. usi ...

  3. SQLite帮助类SQlitehelper 实现对SQLite数据的增删改查

    public class SQLiteHelper { public const string sConn = "Data Source=" + @"path" ...

  4. python web.py操作mysql数据库,实现对数据库的增删改查操作

    使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...

  5. Java操作数据库实现"增删改查"

    本文主要讲解JDBC操作数据库    主要实现对MySql数据库的"增删改查" 综合概述: JDBC的常用类和接口 一   DriverManager类 DriverManage类 ...

  6. ThinkPHP实现对数据库的增删改查

    好久都没有更新博客了,之前老师布置的任务总算是现在可以说告一段落了,今天趁老师还没提出其他要求来更新一篇博客. 今天我想记录的是我之前做项目,自己所理解的ThinkPHP对数据库的增删改查. 首先要说 ...

  7. Android学习---数据库的增删改查(sqlite CRUD)

    上一篇文章介绍了sqlite数据库的创建,以及数据的访问,本文将主要介绍数据库的增删改查. 下面直接看代码: MyDBHelper.java(创建数据库,添加一列phone) package com. ...

  8. Android 系统API实现数据库的增删改查和SQLite3工具的使用

    在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...

  9. Android SQL语句实现数据库的增删改查

    本文介绍android中的数据库的增删改查 复习sql语法: * 增 insert into info (name,phone) values ('wuyudong','111') * 删 delet ...

随机推荐

  1. [LeetCode] Search in Rotated Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  2. BZOJ 2109 航空管制(拓扑排序+贪心)

    绝世好题啊.. 题意:给出一个DAG,和每个点要求出现在这个DAG里面的拓扑排序的位置<=ti,求出所有可能的拓扑排序里面每个点出现的位置的最小值. 正着做不好做,考虑反着做,建立这个图的反图. ...

  3. IDEA使用switch传入String编译不通过

    今天在使用IDEA的时候,用到switch分支语句,传入String参数的时候一直报错,下面是源码报错截图: 看错误提示并没有提到switch支持String类型,不过ava1.7之后就支持Strin ...

  4. python常用模块collections os random sys

    Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...

  5. [cogs1065]绿豆蛙的归宿

    1065. [Nescafe19] 绿豆蛙的归宿 [题目描述] 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点.到达每一个顶点时,如果有K条离开该点的道路, ...

  6. 【SYZOJ279】滑稽♂树(树套树)

    [SYZOJ279]滑稽♂树(树套树) 题面 SYZOJ CJOJ 题目描述 zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到.虽然我们看不到,但是还是知道一些信息: 这真 ...

  7. 解题:SCOI 2014 方伯伯运椰子

    题面 很有趣的一道题,看起来是个神奇网络流,其实我们只要知道网络的一些性质就可以做这道题了 因为题目要求流量守恒,所以我们其实是在网络中搬运流量,最终使得总费用减小,具体来说我们可以直接把这种“搬运” ...

  8. Lab颜色空间

    原文:http://blog.csdn.net/carson2005/article/details/7200440 同RGB颜色空间相比,Lab是一种不常用的色彩空间.它是在1931年国际照明委员会 ...

  9. php的错误处理机制

    看tp5源码的,补充下 error_reporting(E_ALL); set_error_handler([__CLASS__, 'appError']); set_exception_handle ...

  10. Chocolatey - Windows Software Management Automation

    What is Chocolatey? Chocolatey is a software management solution unlike anything else you've ever ex ...