数据库为: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,out error); ??????????????????? break; ??????????????? case "dataset": ??????????????????? result = (T)(IListSource)DBUtil.GetDataSetSp(_icon_entity,out error); ??????????????????? break; ??????????????? default: ??????????????????? if (typeof(Dictionary<string,string>[]).Name.ToLower() == typeName) ??????????????????? { ??????????????????????? IDataReader r = DBUtil.GetDataReaderSp(_icon_entity,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文件在我的资源中,大家可以去下载。此方法能大大的简化调用存储过程。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|