DataAccessLayer
来源:互联网 发布:美拍视频怎么传到淘宝 编辑:程序博客网 时间:2024/05/17 12:25
/************************
* 金色海洋工作室 —— 数据访问层
*
* 数据访问层(SQL Server 版)
*
* 最后修改时间:2006年8月15日
************************/
using System;
using System.Data;
using System.Data.SqlClient;
using JYK.DataStruct; //结构,用于“实体类”
//using System.Security.Principal;
namespace JYK
{
/// <summary>
/// 存储过程的参数的类型,在输出型的参数里使用。
/// </summary>
public enum ParameterKind
{
Int,
Double,
Decimal,
NVarChar,
Bit
}
/// <summary>
/// 这是一个通用的数据访问层接口。对ADO.NET的封装。功能类似于 SQLHelper ,但是比SQLHelper要简洁和高效。
/// </summary>
public sealed class DataAccessLayer
{
#region 属性
private static string errorMsg; //出错信息
private static bool isShowErrorSQL; //是否显示出错的查询语句(包括存储过程名程)
private int executeRowCount; //获取执行SQL查询语句后影响的行数
private SqlCommand cm; //建立Command对象
private SqlTransaction sqlTrans; //用于事务处理
private static bool isUseTrans; //是否启用了 .net 的事务处理
/// <summary>
/// 读取出错信息
/// </summary>
public string ErrorMsg
{
get { return errorMsg; }
}
/// <summary>
/// 修改连接字符串,在同时访问两个或两个以上的数据库的时候使用
/// </summary>
public string cnString
{
set { cm.Connection.ConnectionString = value; }
get { return cm.Connection.ConnectionString; }
}
/// <summary>
/// 获取执行SQL查询语句后影响的行数
/// </summary>
public int ExecuteRowCount
{
get { return executeRowCount; }
}
/// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
if (isUseTrans)
sqlTrans.Dispose();
errorMsg = null;
cm.Parameters.Clear();
cm.Connection.Close();
cm.Dispose();
}
#endregion
public DataAccessLayer() //构造函数
{
//默认不使用事务
isUseTrans = false;
//获取连接字符串
cm = new SqlCommand();
cm.Connection = new SqlConnection("获取连接字符串");
//JYK.Connection.ConnectionString
//初始化错误信息
errorMsg = "0";
isShowErrorSQL = true; //本地运行,显示出错的查询语句(包括存储过程名程)
//isShowErrorSQL = false; //服务器运行,不显示出错的查询语句(包括存储过程名程)
}
#region 内部函数
//设置初始值
/// <summary>
/// 设置 errorMsg = "0" ;cm.CommandText 和 cm.CommandType
/// </summary>
/// <param name="commandText">查询语句或者存储过程</param>
/// <param name="commandType">1:存储过程;2:查询语句</param>
private void SetCommand(string commandText, int commandType)
{
errorMsg = "0"; //清空错误信息
executeRowCount = 0;
cm.CommandText = commandText;
if (commandType == 1)
cm.CommandType = CommandType.Text;
else
cm.CommandType = CommandType.StoredProcedure;
}
//设置出错信息
/// <summary>
/// 当发生异常时,所作的处理
/// </summary>
/// <param name="FunctionName">函数名称</param>
/// <param name="commandText">查询语句或者存储过程</param>
/// <param name="message">错误信息</param>
private void SetErrorMsg(string FunctionName, string commandText, string message)
{
//设置返回到上一层的错误信息
errorMsg = FunctionName + "函数出现错误。<BR>错误信息:" + message;
if (isShowErrorSQL)
errorMsg += "<BR>查询语句:" + commandText;
if (isUseTrans)
this.TranRollBack(); //事务模式下:回滚事务
cm.Connection.Close(); //关闭连接
addLogErr(commandText, errorMsg); //记录到错误日志
}
#endregion
#region 记录错误日志
//如果要使用的话,根据你的需要进行修改。
public void addLogErr(string SPName, string ErrDescribe)
{
//记录到错误日志
string FilePath = System.Web.HttpContext.Current.Server.MapPath("/log/" + DateTime.Now.ToString("yyyyMMdd") + ".txt");
System.Text.StringBuilder str = new System.Text.StringBuilder();
str.Append(DateTime.Now.ToString());
str.Append(" ");
str.Append(SPName);
str.Append(" ");
str.Append(ErrDescribe.Replace("<BR>", ""));
str.Append(" ");
System.IO.StreamWriter sw = null;
try
{
sw = new System.IO.StreamWriter(FilePath, true, System.Text.Encoding.Unicode);
sw.Write(str.ToString());
}
catch (Exception ex)
{
System.Web.HttpContext.Current.Response.Write("没有访问日志文件的权限!或日志文件只读!");
}
finally
{
if (sw != null)
sw.Close();
}
}
#endregion
//事务日志
#region 事务处理部分。并没有做太多的测试,有不合理的地方请多指教
/// <summary>
/// 打开连接,并且开始事务。
/// </summary>
public void TranBegin()
{
cm.Connection.Open();
sqlTrans = cm.Connection.BeginTransaction();
cm.Transaction = sqlTrans;
isUseTrans = true;
}
/// <summary>
/// 提交事务,并关闭连接
/// </summary>
public void TranCommit()
{
sqlTrans.Commit();
cm.Connection.Close();
}
/// <summary>
/// 回滚事务,并关闭连接。在程序出错的时候,自动调用。
/// </summary>
public void TranRollBack()
{
sqlTrans.Rollback();
cm.Connection.Close();
}
#endregion
//查询语句部分
#region 运行查询语句返回记录(DataSet、DataTable、DataRow、String[]、String)
/// <summary>
/// 运行SQL查询语句 返回DataSet。可以传入多条查询语句,返回的DataSet里会有多个DataTable
/// </summary>
/// <param name="SQL">查询语句。比如select * from tableName</param>
/// <returns>返回DataSet</returns>
#region 函数实现 — — RunSqlDataSet
public DataSet RunSqlDataSet(string SQL)
{
SetCommand(SQL, 1); //设置command
SqlDataAdapter da = new SqlDataAdapter(cm);
try
{
DataSet DS = new DataSet();
da.Fill(DS);
return DS;
}
catch (Exception ex)
{
SetErrorMsg("RunSqlDataSet", SQL, ex.Message); //处理错误
return null;
}
finally
{
//自动关闭了,不用手动关闭。
da.Dispose();
}
}
#endregion
/// <summary>
/// 运行SQL查询语句 返回DataTable。
/// </summary>
/// <param name="SQL">查询语句。比如select * from tableName</param>
/// <returns>返回DataTable</returns>
#region 函数实现 — — RunSqlDataTable
public DataTable RunSqlDataTable(string SQL)
{
SetCommand(SQL, 1); //设置command
SqlDataAdapter da = new SqlDataAdapter(cm);
try
{
DataTable DT = new DataTable();
da.Fill(DT);
return DT;
}
catch (Exception ex)
{
SetErrorMsg("RunSqlDataTable", SQL, ex.Message); //处理错误
return null;
}
finally
{
//自动关闭了,不用手动关闭。
da.Dispose();
}
}
#endregion
/// <summary>
/// 运行SQl语句返回第一条记录。返回DataRow
/// </summary>
/// <param name="SQL">查询语句。比如select * from tableName</param>
/// <returns></returns>
#region 函数实现 — — RunSqlDataRow
public DataRow RunSqlDataRow(string SQL)
{
SetCommand(SQL, 1); //设置command
SqlDataAdapter da = new SqlDataAdapter(cm);
try
{
DataTable DT = new DataTable();
da.Fill(DT);
if (DT.Rows.Count > 0)
return DT.Rows[0];
else
return null;
}
catch (Exception ex)
{
SetErrorMsg("RunSqlDataRow", SQL, ex.Message); //处理错误
return null;
}
finally
{
//自动关闭了,不用手动关闭。
da.Dispose();
}
}
#endregion
/// <summary>
/// 运行SQl语句返回第一条记录的数组。返回字符串数组
/// </summary>
/// <param name="SQL">查询语句。比如select top 1 * from tableName</param>
/// <returns></returns>
#region 函数实现 — — RunSqlStrings
public string[] RunSqlStrings(string SQL)
{
//返回ID 传入查询语句,返回第一条记录的第一的字段的值
SetCommand(SQL, 1); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
SqlDataReader r = cm.ExecuteReader(CommandBehavior.SingleRow);
if (r.Read())
{
int ArrLength = r.FieldCount;
string[] strValue = new string[ArrLength];
for (int i = 0; i < ArrLength; i++)
strValue[i] = r.GetValue(i).ToString();
return strValue;
}
else
{
r.Close();
return null;
}
}
catch (Exception ex)
{
SetErrorMsg("RunSqlStrs", SQL, ex.Message); //处理错误
return null;
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
/// <summary>
/// 运行SQl语句返回每一条记录的第一个字段的数组。返回字符串数组
/// </summary>
/// <param name="SQL">查询语句。比如select myName from tableName</param>
/// <param name="SQLForCount">用于统计记录数的SQL语句。如果传入数字的话,则直接使用数字作为记录数。</param>
/// <returns></returns>
#region 函数实现 — — RunSqlStringsByRow
public string[] RunSqlStringsByRow(string SQL, string SQLForCount)
{
//先获取记录数
int RowCount = 0;
if (JYK.Functions.IsInt(SQLForCount))
{
RowCount = Int32.Parse(SQLForCount);
}
else
{
string strRowCount = RunSqlGetID(SQLForCount);
if (strRowCount == null)
return null;
RowCount = Int32.Parse(strRowCount);
}
if (RowCount < 1)
return null;
//返回ID 传入查询语句,返回第一条记录的第一的字段的值
SetCommand(SQL, 1); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
string[] strValue = new string[RowCount];
SqlDataReader r = cm.ExecuteReader();
int i = 0;
while (r.Read())
{
strValue[i] = r[0].ToString();
i++;
}
return strValue;
}
catch (Exception ex)
{
SetErrorMsg("RunSqlStrs", SQL, ex.Message); //处理错误
return null;
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
/// <summary>
/// 运行SQl语句返回第一条记录的第一列的值。
/// </summary>
/// <param name="SQL">查询语句。比如select top 1 ID from tableName where userName='aa'。会返回ID的内容</param>
/// <returns></returns>
#region 函数实现 — — RunSqlGetID
public string RunSqlGetID(string SQL)
{
SetCommand(SQL, 1); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
SqlDataReader r = cm.ExecuteReader(CommandBehavior.SingleRow);
if (r.Read())
return r.GetValue(0).ToString();
else
return null;
}
catch (Exception ex)
{
SetErrorMsg("RunSqlGetID", SQL, ex.Message); //处理错误
return null;
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
#endregion
#region 运行查询语句不返回记录集(无返回记录、检查持否存在指定的记录)
/// <summary>
/// 运行SQL查询语句,不返回记录集。用于添加、修改、删除等操作
/// </summary>
/// <param name="SQL">查询语句。比如insert into tableName 、update tableName</param>
/// <returns></returns>
#region 函数实现 — — RunSql
public void RunSql(string SQL)
{
SetCommand(SQL, 1); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
executeRowCount = cm.ExecuteNonQuery();
}
catch (Exception ex)
{
SetErrorMsg("RunSql", SQL, ex.Message); //处理错误
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
/// <summary>
/// 执行一条SQL语句,看是否能查到记录 有:返回true;没有返回false,用于判断是否重名
/// </summary>
/// <param name="SQL">查询语句。比如select ID from tableName where userName='aa'</param>
/// <returns></returns>
#region 函数实现 — — RunSqlExists
public bool RunSqlExists(string SQL)
{
SetCommand(SQL, 1); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
SqlDataReader r = cm.ExecuteReader(CommandBehavior.CloseConnection);
if (r.HasRows)
return true;
else
return false;
}
catch (Exception ex)
{
errorMsg = "运行RunSqlExists函数时出现错误。<BR>错误信息:" + ex.Message;
SetErrorMsg("RunSqlDataSet", SQL, ex.Message); //处理错误
return true;
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
#endregion
//新增加的部分,返回结构数组用于绑定控件
#region 函数实现 — — RunSqlStructBaseTitle
/// <summary>
/// 运行SQl语句返回结构数组BaseTitle
/// </summary>
/// <param name="SQL">查询语句。比如select myName from tableName</param>
/// <param name="SQLForCount">用于统计记录数的SQL语句。如果传入数字的话,则直接使用数字作为记录数。</param>
/// <param name="TitleCount">标题的字符数,一个汉字按照两个字符计算。传入“0”则表示不截取标题。</param>
/// <param name="DateFormat">时间格式。比如“yyyy-MM-dd HH:mm:ss dddd”</param>
/// <returns>返回BaseTitle结构的数组。URL,标题,时间,人气</returns>
public BaseTitle[] RunSqlStructBaseTitle(string SQL, string SQLForCount, int TitleCount, string DateFormat, int IntroCount)
{
string strRowCount = RunSqlGetID(SQLForCount);
if (strRowCount == null)
return null;
int DataCount = Int32.Parse(strRowCount);
if (DataCount < 1)
return null;
return RunSqlStructBT(SQL, DataCount, TitleCount, DateFormat, IntroCount);
}
#endregion
#region 函数实现 — — RunSqlStructBaseTitle
/// <summary>
/// 运行SQl语句返回结构数组BaseTitle
/// </summary>
/// <param name="SQL">查询语句。比如select myName from tableName</param>
/// <param name="SQLForCount">用于统计记录数的SQL语句。如果传入数字的话,则直接使用数字作为记录数。</param>
/// <param name="TitleCount">标题的字符数,一个汉字按照两个字符计算。传入“0”则表示不截取标题。</param>
/// <param name="DateFormat">时间格式。比如“yyyy-MM-dd HH:mm:ss dddd”</param>
/// <returns>返回BaseTitle结构的数组。URL,标题,时间,人气</returns>
public BaseTitle[] RunSqlStructBaseTitle(string SQL, int DataCount, int TitleCount, string DateFormat, int IntroCount)
{
if (DataCount < 1)
return null;
return RunSqlStructBT(SQL, DataCount, TitleCount, DateFormat, IntroCount);
}
#endregion
#region 函数实现 — — RunSqlStructBaseTitle
/// <summary>
/// 运行SQl语句返回结构数组BaseTitle
/// </summary>
/// <param name="SQL">查询语句。比如select myName from tableName</param>
/// <param name="SQLForCount">用于统计记录数的SQL语句。如果传入数字的话,则直接使用数字作为记录数。</param>
/// <param name="TitleCount">标题的字符数,一个汉字按照两个字符计算。传入“0”则表示不截取标题。</param>
/// <param name="DateFormat">时间格式。比如“yyyy-MM-dd HH:mm:ss dddd”</param>
/// <returns>返回BaseTitle结构的数组。URL,标题,时间,人气</returns>
private BaseTitle[] RunSqlStructBT(string SQL, int DataCount, int TitleCount, string DateFormat, int IntroCount)
{
//返回ID 传入查询语句,返回第一条记录的第一的字段的值
SetCommand(SQL, 1); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
BaseTitle[] strValue = new BaseTitle[DataCount];
SqlDataReader r = cm.ExecuteReader();
int i = 0;
while (r.Read())
{
//主键
strValue[i].ID = r[0].ToString();
//网址
strValue[i].URL = r[1].ToString();
//判断截取字符数
if (TitleCount == 0)
{
strValue[i].AllTitle = r[2].ToString();
strValue[i].Title = r[2].ToString();
}
else
{
strValue[i].AllTitle = r[2].ToString();
strValue[i].Title = JYK.Functions.strCal(r[2].ToString(), TitleCount);
}
//判断时间
if (DateFormat.Length == 0)
strValue[i].AddedDate = "";
else
strValue[i].AddedDate = DateTime.Parse(r[3].ToString()).ToString(DateFormat);
//人气
strValue[i].Hits = r[4].ToString();
//图片路径
strValue[i].ImagePath = r[5].ToString();
//内容简介
if (IntroCount == 0)
strValue[i].Introduction = r[6].ToString();
else
strValue[i].Introduction = JYK.Functions.strCal(r[6].ToString(), IntroCount);
i++;
}
// if (i == 0)
// {
// //没有数据,返回空
// return null;
// }
// else if (i < DataCount )
// {
// //记录数不够用,修改数组大小
// BaseTitle[] tmp = new BaseTitle[i];
// int j = 0;
// foreach(BaseTitle tt in strValue)
// {
// tmp[j].Hits = tt.Hits ;
// tmp[j].ID = tt.ID ;
// tmp[j].ImagePath = tt.ImagePath ;
// tmp[j].Introduction = tt.Introduction ;
// tmp[j].Title = tt.Title ;
// tmp[j].URL = tt.URL ;
// j++;
// if (j == i )
// break;
// }
// return tmp;
// }
// else
// {
// return strValue;
// }
return strValue;
}
catch (Exception ex)
{
SetErrorMsg("RunSqlStructBT", SQL, ex.Message); //处理错误
return null;
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
//=====================================================================
#region 函数实现 — — RunSqlStructCusTitle
/// <summary>
/// 运行SQl语句返回结构数组 CusTitle
/// </summary>
/// <param name="SQL">查询语句。比如select myName from tableName</param>
/// <param name="SQLForCount">用于统计记录数的SQL语句。如果传入数字的话,则直接使用数字作为记录数。</param>
/// <param name="TitleCount">标题的字符数,一个汉字按照两个字符计算。传入“0”则表示不截取标题。</param>
/// <param name="DateFormat">时间格式。比如“yyyy-MM-dd HH:mm:ss dddd”</param>
/// <returns>返回BaseTitle结构的数组。URL,标题,时间,人气</returns>
public CusTitle[] RunSqlStructCusTitle(string SQL, string SQLForCount)
{
string strRowCount = RunSqlGetID(SQLForCount);
if (strRowCount == null)
return null;
int DataCount = Int32.Parse(strRowCount);
if (DataCount < 1)
return null;
return RunSqlStructCT(SQL, DataCount);
}
#endregion
#region 函数实现 — — RunSqlStructCusTitle
/// <summary>
/// 运行SQl语句返回结构数组 CusTitle
/// </summary>
/// <param name="SQL">查询语句。比如select myName from tableName</param>
/// <param name="SQLForCount">用于统计记录数的SQL语句。如果传入数字的话,则直接使用数字作为记录数。</param>
/// <param name="TitleCount">标题的字符数,一个汉字按照两个字符计算。传入“0”则表示不截取标题。</param>
/// <param name="DateFormat">时间格式。比如“yyyy-MM-dd HH:mm:ss dddd”</param>
/// <returns>返回BaseTitle结构的数组。URL,标题,时间,人气</returns>
public CusTitle[] RunSqlStructCusTitle(string SQL, int DataCount)
{
if (DataCount < 1)
return null;
return RunSqlStructCT(SQL, DataCount);
}
#endregion
#region 函数实现 — — RunSqlStructCT
/// <summary>
/// 运行SQl语句返回结构数组 CusTitle
/// </summary>
/// <param name="SQL">查询语句。比如select myName from tableName</param>
/// <param name="SQLForCount">用于统计记录数的SQL语句。如果传入数字的话,则直接使用数字作为记录数。</param>
/// <param name="TitleCount">标题的字符数,一个汉字按照两个字符计算。传入“0”则表示不截取标题。</param>
/// <param name="DateFormat">时间格式。比如“yyyy-MM-dd HH:mm:ss dddd”</param>
/// <returns>返回BaseTitle结构的数组。URL,标题,时间,人气</returns>
private CusTitle[] RunSqlStructCT(string SQL, int DataCount)
{
//返回ID 传入查询语句,返回第一条记录的第一的字段的值
SetCommand(SQL, 1); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
CusTitle[] strValue = new CusTitle[DataCount];
SqlDataReader r = cm.ExecuteReader();
int i = 0;
int ArrLength = r.FieldCount - 2;
while (r.Read())
{
//ID
strValue[i].ID = r[0].ToString();
//标题
strValue[i].Title = r[1].ToString();
//其他
strValue[i].str = new string[ArrLength];
for (int j = 0; j < ArrLength; j++)
strValue[i].str[j] = r.GetValue(j + 2).ToString();
i++;
}
return strValue;
}
catch (Exception ex)
{
SetErrorMsg("RunSqlStrs", SQL, ex.Message); //处理错误
return null;
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
//===========================end==============================
//存储过程的参数部分
#region 存储过程的参数部分——清除和添加参数
#region 清除参数
/// <summary>
/// 清除SqlCommand的存储过程的参数。
/// </summary>
public void ClearParameter()
{ cm.Parameters.Clear(); }
#endregion
//int: tinyint、smallint
//bigint:
//bool: bit
//double: float、real
//string: char、nchar、varchar、nvarchar、uniqueidentifier、smalldatetime、datetime
//string: ntext、text
//decimal:从 -10^38 +1 到 10^38 –1 的固定精度和小数位的数字数据。
//numeric:功能上等同于 decimal。
//decimal: smallmoney、money
//二进制
// binary、varbinary、image
#region 输入型的参数 int 、double、decimal、nvarChar、、、
#region int
/// <summary>
/// 添加int型的参数。
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <param name="ParameterValue">参数值</param>
public void addNewParameter(string ParameterName, int ParameterValue)
{
cm.Parameters.Add(ParameterName, SqlDbType.Int, 4); //添加存储过程的参数
cm.Parameters[ParameterName].Value = ParameterValue; //负值
//设置方向取默认值——输入
}
#endregion
#region double
/// <summary>
/// 添加小数参数,double
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <param name="ParameterValue">参数值</param>
public void addNewParameter(string ParameterName, double ParameterValue)
{
cm.Parameters.Add(ParameterName, SqlDbType.Float); //添加存储过程的参数
cm.Parameters[ParameterName].Value = ParameterValue; //负值
}
#endregion
#region decimal
/// <summary>
/// 添加金额参数,方向是输入(input)。decimal
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <param name="ParameterValue">参数值</param>
public void addNewParameter(string ParameterName, decimal ParameterValue)
{
cm.Parameters.Add(ParameterName, SqlDbType.Decimal); //添加存储过程的参数
cm.Parameters[ParameterName].Value = ParameterValue; //负值
}
#endregion
#region nvarChar
/// <summary>
/// 添加nvarChar型的参数。方向是输入(input)
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <param name="ParameterValue">参数值</param>
/// <param name="size">参数大小</param>
public void addNewParameter(string ParameterName, string ParameterValue, int size)
{
cm.Parameters.Add(ParameterName, SqlDbType.NVarChar, size); //添加存储过程的参数
cm.Parameters[ParameterName].Value = ParameterValue; //负值
}
#endregion
#region nText
/// <summary>
/// 添加nText型的参数。方向是输入(input)
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <param name="ParameterValue">参数值</param>
public void addNewParameter(string ParameterName, string ParameterValue)
{
cm.Parameters.Add(ParameterName, SqlDbType.NText); //添加存储过程的参数
cm.Parameters[ParameterName].Value = ParameterValue; //负值
}
#endregion
#region bit
/// <summary>
/// 添加bit型的参数。方向是输入(input)
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <param name="ParameterValue">参数值</param>
public void addNewParameter(string ParameterName, bool ParameterValue)
{
cm.Parameters.Add(ParameterName, SqlDbType.Bit); //添加存储过程的参数
cm.Parameters[ParameterName].Value = ParameterValue; //负值
}
#endregion
#endregion
#region 输出型的参数
/// <summary>
/// 添加输出型的参数。只支持常用的几个参数类型,如果需要可以扩充。
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <param name="ParameterValue">参数的类型</param>
public void addNewParameter(string ParameterName, JYK.ParameterKind kind)
{
switch (kind)
{
case ParameterKind.Int:
cm.Parameters.Add(ParameterName, SqlDbType.Int); //添加存储过程的参数
break;
case ParameterKind.Double:
cm.Parameters.Add(ParameterName, SqlDbType.Float); //添加存储过程的参数
break;
case ParameterKind.Decimal:
cm.Parameters.Add(ParameterName, SqlDbType.Decimal); //添加存储过程的参数
break;
case ParameterKind.NVarChar:
cm.Parameters.Add(ParameterName, SqlDbType.NVarChar, 4000); //添加存储过程的参数
break;
case ParameterKind.Bit:
cm.Parameters.Add(ParameterName, SqlDbType.Bit); //添加存储过程的参数
break;
}
cm.Parameters[ParameterName].Direction = ParameterDirection.Output; //设置方向
}
#endregion
#endregion
#region 存储过程的参数部分——取参数的返回值
/// <summary>
/// 按序号返回参数值,一般在执行完存储过程后使用
/// </summary>
/// <param name="ParameterIndex">序号</param>
/// <returns>返回参数的内容</returns>
public string getParameter(int ParameterIndex)
{
return cm.Parameters[ParameterIndex].Value.ToString();
}
/// <summary>
/// 按名称返回参数值,一般在执行完存储过程后使用
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
/// <returns>返回参数的内容</returns>
public string getParameter(string ParameterName)
{
return cm.Parameters[ParameterName].Value.ToString();
}
#endregion
#region 存储过程的参数部分——修改参数值
/// <summary>
/// 按序号修改参数值,一般在一次添加多条记录时用。
/// </summary>
/// <param name="ParameterIndex">序号</param>
public void setParameter(int ParameterIndex, string parameterValue)
{ cm.Parameters[ParameterIndex].Value = parameterValue; }
/// <summary>
/// 按名称修改参数值,一般在一次添加多条记录时用
/// </summary>
/// <param name="ParameterName">参数名称。比如 @UserName</param>
public void setParameter(string ParameterName, string parameterValue)
{ cm.Parameters[ParameterName].Value = parameterValue; }
#endregion
//存储过程部分
#region 运行存储过程返回记录(DataSet、DataTable、不返回记录集)
/// <summary>
/// 运行存储过程返回DataSet。DataSet里面可以是多个表(DateTable)
/// </summary>
/// <param name="StoredProcedureName">存储过程名称</param>
/// <returns>返回DataSet</returns>
#region 函数实现 — — RunStoreDataSet
public DataSet RunStoreDataSet(string StoredProcedureName)
{
SetCommand(StoredProcedureName, 2); //设置command
SqlDataAdapter da = new SqlDataAdapter(cm);
try
{
DataSet DS = new DataSet();
da.Fill(DS);
return DS;
}
catch (Exception ex)
{
SetErrorMsg("RunStoreDataSet", StoredProcedureName, ex.Message); //处理错误
return null;
}
finally
{
da.Dispose();
}
}
#endregion
/// <summary>
/// 运行存储过程返回DataTable。
/// </summary>
/// <param name="StoredProcedureName">存储过程名称</param>
/// <returns>返回DataTable</returns>
#region 函数实现 — — RunStoreDataTable
public DataTable RunStoreDataTable(string StoredProcedureName)
{
SetCommand(StoredProcedureName, 2); //设置command
SqlDataAdapter da = new SqlDataAdapter(cm);
try
{
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
catch (Exception ex)
{
SetErrorMsg("RunStoreDataTable", StoredProcedureName, ex.Message); //处理错误
return null;
}
finally
{
da.Dispose();
}
}
#endregion
/// <summary>
/// 运行存储过程 不返回记录集,用于添加、修改、删除等操作
/// </summary>
/// <param name="ParameterName">存储过程名称</param>
/// <returns></returns>
public void RunStore(string StoredProcedureName)
{
SetCommand(StoredProcedureName, 2); //设置command
try
{
if (cm.Connection.State == ConnectionState.Broken || cm.Connection.State == ConnectionState.Closed)
cm.Connection.Open();
cm.ExecuteNonQuery();
}
catch (Exception ex)
{
SetErrorMsg("RunStore", StoredProcedureName, ex.Message); //处理错误
}
finally
{
if (!isUseTrans)
cm.Connection.Close();
}
}
#endregion
}
}
- DataAccessLayer
- MvcAppEmployeesFromDb.DataAccessLayer
- 论坛App_Code DataAccessLayer(1)
- java assert的使用
- Xshell不能按退格、删除键和中文乱码的解决方案
- 为dedecms后台管理的列表加上编号(非id,一页中条目顺序编号)
- STL中List 的sort 比较 用法示例
- 经典C/C++面试题(转载)
- DataAccessLayer
- 笑话
- 转:arcmap.exe运行错误的解决方法
- csdn叫我太生气了。
- CRectTracker类的一个使用心得
- android画统计图的chart engine
- [收集] 经典C/C++面试题(转载) 续
- 关于软件测试中BUG的定义
- HttpModule与HttpHandler