数据库为:MS SQLServer。
假设现在有一个存储过程:GetNewID,
那么这个实体类是:
using System; using System.Data; using System.Collections.Generic; using System.Data.SqlClient; using System.ComponentModel; using SSystem.Database; namespace Entity { public class GetNewID { private IDbConnection _icon_entity = null; public IDbConnection ICon_Entity { get { return _icon_entity; } set { _icon_entity = value; } } private int _newid = 0; private string _tablename = string.Empty; private readonly int _maxLen_newid = 4; private readonly int _maxLen_tablename = 254; ///<summary> /// @NewID /// INT(4) /// Output /// </summary> public int @NewID { get { return _newid; } set { _newid = value; } } ///<summary> /// @TableName /// VARCHAR(254) /// Input /// </summary> public string @TableName { get { return _tablename; } set { _tablename = value; } } ///<summary> ///执行一个存储过程 /// </summary> ///<typeparam name="T">只支持如下类型: object,IDataReader,DataSet,Dictionary<string,string>[] /// <para>object:返回第一行第一列的值;</para> /// <para>IDataReader:返回一个只读器,关闭这个对象则同时关闭数据库连接;注意,此方式无法获取标示为output的参数</para> /// <para>DataSet:返回一个离线数据集合</para> /// <para>Dictionary<string,string>[]:返回一个泛型的散列表</para> ///</typeparam> ///<param name="error">return a error message</param> ///<returns></returns> public T Exec<T>(out string error) { error = ""; List<IDataParameter> sets = new List<IDataParameter>(2); IDataParameter p1 = null; p1 = new SqlParameter("@NewID", SqlDbType.Int, _maxLen_newid); p1.Value = @NewID; p1.Direction = ParameterDirection.Output; sets.Add(p1); IDataParameter p2 = null; p2 = new SqlParameter("@TableName", SqlDbType.VarChar, _maxLen_tablename); p2.Value = @TableName; sets.Add(p2); string typeName = typeof(T).Name.ToLower(); T result = default(T); switch (typeName) { case "object": result = (T)DBUtil.ExecuteScalarSp(_icon_entity, this.GetType().Name, sets, out error); break; ; case "idatareader": result = (T)DBUtil.GetDataReaderSp(_icon_entity, this.GetType().Name, sets, out error); break; case "dataset": result = (T)(IListSource)DBUtil.GetDataSetSp(_icon_entity, this.GetType().Name, sets, out error); break; default: if (typeof(Dictionary<string, string>[]).Name.ToLower() == typeName) { IDataReader r = DBUtil.GetDataReaderSp(_icon_entity, this.GetType().Name, sets, out error); List<Dictionary<string, string>> dyn = new List<Dictionary<string, string>>(); while (r.Read()) { Dictionary<string, string> tmp = new Dictionary<string, string>(r.FieldCount); for (int i = 0; i < r.FieldCount; i++) { tmp.Add(r.GetName(i), Convert.ToString(r.GetValue(i))); } dyn.Add(tmp); } r.Close(); result = (T)(object)dyn.ToArray(); } break; } this._newid = Convert.ToInt32(p1.Value); return result; } } } 上面这个代码是通过CodeSmith自动生成的。这个实体类的调用方式:
GetNewID obj=new GetNewID();
obj.@TableName="User";
string error;
object oID = obj.Exec<object>(out error);
如果调用存储过程不抛出异常,则oID就能获取一个新的主键。
生成存储过程实体类的Codesmith文件在我的资源中,大家可以去下载。此方法能大大的简化调用存储过程。