sqlhelper.cs
来自「我的sqlhelper 大家一起研究一下」· CS 代码 · 共 636 行 · 第 1/2 页
CS
636 行
using System;
using System.Data.SqlClient;
using System.Collections;
using System.Data;
using System.Configuration;
namespace XNet
{
/// <summary>
/// 该类简化了与连结数据库的操作.用存储过程的
/// </summary>
public class SqlHelper
{
#region 成员
/// <summary>
/// 程序配置文件中的数据库连接字符串
/// </summary>
private const string XNetSqlHelperConnString = "XNetSqlHelperConnString";
/// <summary>
/// 执行数据语句
/// </summary>
private SqlCommand mySqlCommand = null ;
/// <summary>
/// 当前与数据库的连接
/// </summary>
private SqlConnection Conn = null;//
// private string connString;//数据连结字符串
/// <summary>
/// 执行存储时使用参数的类型 : 按顺序存储存储过程的参数的顺序存储值
/// </summary>
private ArrayList valueNoName = new ArrayList();
/// <summary>
/// 执行存储时使用参数的类型: 存储存储过程参数的名称和值
/// </summary>
private SortedList valueHaveName = new SortedList();
/// <summary>
/// 存储存储过程的返回值
/// </summary>
private SortedList outValue = new SortedList();
/// <summary>
/// 叛断执行存储时使用参数的类型是否使用顺序执行
/// </summary>
private Boolean useNoNmae = false;
/// <summary>
/// 判断是否有返回值
/// </summary>
private Boolean haveOutValue = false;
/// <summary>
/// 数据集,用于存储SqlHelper执行后的数据
/// </summary>
private DataSet DbSet = new DataSet();
/// <summary>
/// 当前执行的存储过程名称
/// </summary>
private string myProName = "";
/// <summary>
/// 执行搜索存储过程时,存储在DataSet中的表
/// </summary>
private DataTable dataTableRetunParameters = null;
#endregion
#region 构造函数
/// <summary>
/// 实例化类时提供数据连结字符串
/// </summary>
/// <param name="connString">数据连结字符串</param>
public SqlHelper( string connString)
{
Conn= new SqlConnection(connString);
}
/// <summary>
/// 实例化类时,由程序配置文件提供数据连结字符串(XNetSqlHelperConnString );
/// </summary>
public SqlHelper()
{
Conn = new SqlConnection(ConfigurationSettings.AppSettings[XNetSqlHelperConnString]);
}
#endregion
#region 属性
/// <summary>
/// 获取或设置数据连结字符串
/// </summary>
public string SqlConnectionString
{
get
{
return Conn.ConnectionString;
}
set
{
Conn.ConnectionString = value;
}
}
/// <summary>
/// 获取一个Boolean值,叛断所执行的存储过程是否有返回值
/// </summary>
public Boolean HaveOutValue
{
get
{
return haveOutValue;
}
}
/// <summary>
/// 获取存储参数值的数量
/// </summary>
public int ValueCount
{
get
{
return this.useNoNmae== true? this.valueNoName.Count:this.valueHaveName.Count;
}
}
/// <summary>
/// 获取或设置当前要运行的存储过程的名称
/// </summary>
public string ProcedureName
{
get
{
return myProName;
}
set
{
myProName = value;
}
}
/// <summary>
/// 获取储存过程返回值的数量
/// </summary>
public int OutValueCount
{
get
{
return this.outValue.Count;
}
}
#endregion
#region 添加存储过程值
/// <summary>
/// 在不知道存储过程参数的名称,但是知道参数的顺序可以使用此方法添加参数的值,必须按参数的顺序添加.
/// 用多字符串形式添加所执行的存储过程的参数的值
/// </summary>
/// <param name="values">参数的值.添加方法:AddValueByString("a","b","c")</param>
public void AddValueByString(params object[] values)
{
valueNoName.AddRange(values);
}
/// <summary>
/// 在不知道存储过程参数的名称,但是知道参数的顺序可以使用此方法添加参数的值,必须按参数的顺序添加
/// 不可与 "AddValueByName" 共用,可与 "InsertValueByIndex"、"AddValueByString" 共用
/// </summary>
/// <param name="values">存储过程的值</param>
public void AddValueByIndex(object values)
{
valueNoName.Add(values);
this.useNoNmae=true;
}
/// <summary>
/// 在知道存储过程名称的情况下,可以通过此方法来添加所运行的存储过程的参数值.
/// </summary>
/// <param name="name">存储过程的名称,格式:"@name"必须以"@"开头</param>
/// <param name="values">存储过程的值</param>
public void AddValueByName(string name,object values)
{
this.valueHaveName.Add(name,values);
this.useNoNmae= false;
}
/// <summary>
/// 在不知道存储过程参数的名称,但是知道参数的顺序可以使用此方法添加参数的值,必须按参数的顺序添加
/// 添加存储过程参数值到指的索引处,不可与 "AddValueByName" 共用,可与 "AddValueByIndex"、"AddValueByString" 共用
/// </summary>
/// <param name="index">在添加参数值的索引位置</param>
/// <param name="values">要添加的参数值</param>
public void InsertValueByIndex(int index,object values)
{
this.valueNoName.Insert(index,values);
this.useNoNmae = false;
}
#endregion
#region 清除当前执行的存储过程的值
/// <summary>
/// 清除传递给存储过程参数的值
/// </summary>
public void ClearValue()
{
this.valueNoName.Clear();
this.valueHaveName.Clear();
this.mySqlCommand.Parameters.Clear();
}
#endregion
#region 得到返回的值
/// <summary>
/// 通过索引得到返回参数值的名称
/// </summary>
/// <param name="index">参数索引</param>
/// <returns>返回 string 类型</returns>
public string GetOutValuesNameByIndex(int index)
{
return Convert.ToString(this.outValue.GetKey(index));
}
/// <summary>
/// 通过索引得到返回参数的值
/// </summary>
/// <param name="index">参数索引</param>
/// <returns>返回 object 类型</returns>
public object GetOutValuesValueByIndex(int index)
{
return this.outValue.GetByIndex(index);
}
/// <summary>
/// 通过参数的名称得到返回参数的值
/// </summary>
/// <param name="name">参数名称</param>
/// <returns>返回 object 类型</returns>
public object GetOutValuesValueByName(string name)
{
return this.outValue[name];
}
#endregion
#region 添加存储过程参数(保护方法)
/// <summary>
/// 添加存储过程参数
/// </summary>
/// <param name="proName">要值行的存储过程的名称</param>
private SqlCommand BeginAddParameters(string proName)
{
this.myProName= proName;
string selectProcInfo = "";
// ProcName = 存储过程名称
// Name = 参数名
// TypeName = 参数类型
// Colid = 参数在存储过程的顺序
// Isoutparam = 输入类型(输出或输入)
selectProcInfo = "select specific_name as ProcName,parameter_Name as Name,Data_Type as TypeName,ORDINAL_POSITION as Colid,parameter_Mode as Isoutparam from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME='" + proName + "' order by ORDINAL_POSITION";
//返回的SqlCommand
this.Conn.Open();
SqlCommand returnSqlCommand = new SqlCommand(selectProcInfo,this.Conn);
SqlDataAdapter myDP = new SqlDataAdapter(returnSqlCommand);
this.dataTableRetunParameters = new DataTable();
myDP.Fill(this.dataTableRetunParameters);//等到当前存储过程的信息:参数,参数的顺序, 参数的类型,参数的传递
returnSqlCommand.CommandText = proName;
returnSqlCommand.CommandType = CommandType.StoredProcedure;
if (this.dataTableRetunParameters.Rows.Count>0)
{
for(int i = 0;i <= this.dataTableRetunParameters.Rows.Count - 1;i++)
{
//当前参数的值类型
SqlDbType sqlDbType = SqlDbType.VarChar;
switch (Convert.ToString(this.dataTableRetunParameters.Rows[i]["TypeName"]))
{
case "image":
{
sqlDbType = SqlDbType.Image;
}
break;
case "text":
{
sqlDbType = SqlDbType.Text;
}
break;
case "uniqueidentifier":
{
sqlDbType = SqlDbType.UniqueIdentifier;
}
break;
case "tinyint":
{
sqlDbType = SqlDbType.TinyInt;
}
break;
case "smallint":
{
sqlDbType = SqlDbType.SmallInt;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?