首页 > 开发 > 综合 > 正文

SQLServer2000数据访问基类

2024-07-21 02:29:47
字体:
来源:转载
供稿:网友

using system;
using system.io;
using system.data;
using system.data.sqlclient;
using system.configuration;
using system.collections;

namespace sqlserverbase
{
    /// <summary>
    ///内部类:存储过程的返回值记录类
    /// </summary>
    public class sqlresult
    {       
        public bool succeed;            //存储过程是否执行成功.
        public hashtable outputvalues;    // 存储过程output值,放在(hashtable)表outputvalues里.           
        public datatable datatable;        //存储过程返回的结果集,放在(datatable)表datatable里.
        public dataset dataset;            //存储过程返回的结果集,放在dataset表中
        public string errormessage;        //访问数据库失败
        public int inflecntnum;
        public sqlresult()
        {
            succeed = false;
            outputvalues = new hashtable();
            datatable=new datatable();
            dataset=new dataset();
            errormessage = "";
        }
    }
    /// <summary>
    /// ====================***调用存储过程和sql的基类***============================
    /// abstract:该类不能被实例化,只能通过派生子类来使用它
    /// </summary>
    public abstract class spsql_base : idisposable
    {
        public spsql_base() : this("","")
        {
        }
        //重载
        public spsql_base(string sp_name,string sql_name)
        {
            this.procedurename = sp_name;
            this.sqlname = sql_name;
        }
        //私有成员变量
        private string sp_name;
        private string sql_name;
        private sqlconnection myconnection;
        private sqlcommand mycommand;
        private sqlparameter myparameter;//存储过程参数
       
        //公共属性
        public string procedurename//获取和设置存储过程名
        {
            get
            {
                return this.sp_name;
            }
            set
            {
                this.sp_name = value;
            }
        }
        //公共属性
        public string sqlname//获取和设置存储过程名
        {
            get
            {
                return this.sql_name;
            }
            set
            {
                this.sql_name = value;
            }
        }
        /// <summary>
        /// 调用存储过程
        /// </summary>
        /// <param name="parameters">参数集合</param>
        /// <returns></returns>
        public  sqlresult call_sp(params object[] parameters)
        {
            string strconn=configurationsettings.appsettings["connectionstring"];
            //存储过程的返回值记录类
            sqlresult result = new sqlresult();
            myconnection  = new sqlconnection(strconn);           
            mycommand = new sqlcommand(this.procedurename, myconnection);
            mycommand.commandtype = commandtype.storedprocedure;           
            sqldataadapter myadapter = new sqldataadapter(mycommand);   
            myconnection.open();
            //将参数添加到存储过程的参数集合
            getprocedureparameter(result,parameters);
            //开始事物
            using(sqltransaction trans = myconnection.begintransaction())
            {
                try
                {                   
                    if(trans!=null)
                    {
                        mycommand.transaction = trans;
                    }
                    //填充数据,将结果填充到sqlresult集中
                    myadapter.fill(result.dataset);
                    if(result.dataset.tables.count>0)
                        result.datatable=result.dataset.tables[0].copy();
                    //将输出参数的值添加到result的outputvalues
                    getoutputvalue(result);
                    //提交事物
                    trans.commit();
                }
                catch(exception e)
                {
                    result.errormessage = e.message;
                    //事物回滚
                    trans.rollback();
                }
                //如果捕捉了异常,但仍会执行包括在 finally 块中的输出语句
                finally
                {
                    myadapter.dispose();
                    mycommand.dispose();
                    myconnection.close();
                    myconnection.dispose();
                }
            }
            return result;
        }
        /// <summary>
        /// 将参数添加到存储过程的参数集合
        /// </summary>
        /// <param name="parameters"></param>
        private void getprocedureparameter(sqlresult result,params object[] parameters)
        {
            sqlcommand mycommand2 = new sqlcommand();
            mycommand2.connection = this.myconnection;
            mycommand2.commandtext = "select * from information_schema.parameters where specific_name='" +this.procedurename+ "' order by ordinal_position";
            sqldatareader reader = null;
            try
            {
                reader = mycommand2.executereader();
                int i = 0;
                while(reader.read())
                {
                    myparameter = new sqlparameter();
                    myparameter.parametername = reader["parameter_name"].tostring();
                    myparameter.direction = reader["parameter_mode"].tostring()=="in"?parameterdirection.input:parameterdirection.output;
                
                    switch(reader["data_type"].tostring())
                    {
                            //bigint
                        case "bigint":
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.toint64(parameters[i]);
                            myparameter.sqldbtype = sqldbtype.bigint;
                            break;
                            //binary

                            //bit
                        case "bit" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.toboolean(parameters[i]);
                            myparameter.sqldbtype = sqldbtype.bit;
                            break;
                            //char
                        case "char" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (string)parameters[i];
                            myparameter.size = convert.toint32(reader["character_maximum_length"]);
                            myparameter.sqldbtype = sqldbtype.char;
                            break;
                            //datetime
                        case "datetime" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.todatetime(parameters[i]);
                            myparameter.sqldbtype = sqldbtype.datetime;
                            break;
                            //decimal
                        case "decimal" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (decimal)parameters[i];
                            myparameter.sqldbtype = sqldbtype.decimal;
                            myparameter.precision = (byte)reader["numeric_precision"];
                            myparameter.scale = byte.parse(reader["numeric_scale"].tostring());
                            break;
                            //float
                        case "float" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (float)parameters[i];
                            myparameter.sqldbtype = sqldbtype.float;
                            break;
                            //image
                        case "image" :
                            if(myparameter.direction == parameterdirection.input)
                            {
                                myparameter.value=(byte[])parameters[i];                           
                            }
                            myparameter.sqldbtype = sqldbtype.image;
                            break;
                            //int
                        case "int" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.toint32(parameters[i].tostring());
                            myparameter.sqldbtype = sqldbtype.int;
                            break;
                            //money
                        case "money":
                            if(myparameter.direction==parameterdirection.input)
                                myparameter.value=convert.todecimal(parameters[i]);
                            myparameter.sqldbtype=sqldbtype.money;
                            break;
                            //nchar
                        case "nchar" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (string)parameters[i];
                            myparameter.size = convert.toint32(reader["character_maximum_length"]);
                            myparameter.sqldbtype = sqldbtype.nchar;
                            break;
                            //ntext
                        case "ntext" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (string)parameters[i];
                            myparameter.sqldbtype = sqldbtype.ntext;
                            break;
                            //numeric
                        case "numeric" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (decimal)parameters[i];
                            myparameter.sqldbtype = sqldbtype.decimal;
                            myparameter.precision = (byte)reader["numeric_precision"];
                            myparameter.scale = byte.parse(reader["numeric_scale"].tostring());
                            break;
                            //nvarchar
                        case "nvarchar" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.tostring(parameters[i]);
                            myparameter.size = convert.toint32(reader["character_maximum_length"]);
                            myparameter.sqldbtype = sqldbtype.nvarchar;
                            break;
                            //real
                        case "real":
                            if(myparameter.direction==parameterdirection.input)
                                myparameter.value=convert.tosingle(parameters[i]);
                            myparameter.sqldbtype = sqldbtype.real;
                            break;   
                            //smalldatetime
                        case "smalldatetime" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.todatetime(parameters[i]);
                            myparameter.sqldbtype = sqldbtype.datetime;
                            break; 
                            //smallint
                        case "smallint" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.toint16(parameters[i].tostring());
                            myparameter.sqldbtype = sqldbtype.smallint;
                            break;
                            //smallmoney
                        case "smallmoney":
                            if(myparameter.direction==parameterdirection.input)
                                myparameter.value=convert.todecimal(parameters[i]);
                            myparameter.sqldbtype=sqldbtype.smallmoney;
                            break;
                            //sql_variant

                            //text
                        case "text" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (string)parameters[i];
                            myparameter.sqldbtype = sqldbtype.text;
                            break;
                            //timestamp

                            //tinyint
                        case "tinyint":
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = convert.tobyte(parameters[i]);
                            myparameter.sqldbtype = sqldbtype.tinyint;
                            break;
                            //uniqueidentifier

                            //varbinary
                        case "varbinary":
                            if(myparameter.direction==parameterdirection.input)
                                myparameter.value=(byte[])parameters[i];
                            myparameter.sqldbtype = sqldbtype.varbinary;
                            break;
                            //varchar
                        case "varchar" :
                            if(myparameter.direction == parameterdirection.input)
                                myparameter.value = (string)parameters[i];
                            myparameter.size = convert.toint32(reader["character_maximum_length"]);
                            myparameter.sqldbtype = sqldbtype.varchar;
                            break;
                        default :
                            break;
                    }
                    i++;
                    mycommand.parameters.add(myparameter);
                }
            }
            catch(exception e)
            {
                result.errormessage = e.message;
            }
            finally
            {
                if(reader!=null)
                {
                    reader.close();
                }
                mycommand2.dispose();
            }
        }
        /// <summary>
        /// 将输出的值添加到result的outputvalues
        /// </summary>
        /// <param name="result"></param>
        private void getoutputvalue(sqlresult result)
        {
            if(result.succeed==false)
            {
                result.succeed=true;
            }
            foreach(sqlparameter parameter in mycommand.parameters)
            {
                if(parameter.direction == parameterdirection.output)
                {
                    //hashtab表是一个键值对
                    result.outputvalues.add(parameter.parametername, parameter.value);
                }
            }
        }
        public void dispose()
        {
            dispose(true);
            gc.suppressfinalize(true);
        }
        protected virtual void dispose(bool disposing)
        {
            if (! disposing)
                return;
            if(myconnection != null)
            {
                myconnection.dispose();
            }
        }
        //=======end======

        //=======begin====
        /// <summary>
        /// 调用sql的基类
        /// </summary>
        /// <param name="parameters">参数集合</param>
        /// <returns></returns>
        public sqlresult call_sql()
        {
            string strconn=configurationsettings.appsettings["connectionstring"];
            //存储过程的返回值记录类
            sqlresult result = new sqlresult();
            myconnection = new sqlconnection(strconn);
            mycommand = new sqlcommand(this.sql_name, myconnection);
            mycommand.commandtype = commandtype.text;
            sqldataadapter myadapter = new sqldataadapter(mycommand);       
            myconnection.open();
            using(sqltransaction trans  = myconnection.begintransaction())
            {
                try
                {
                    if(trans!=null)
                    {
                        mycommand.transaction = trans;
                    }           
                    //填充数据,将结果填充到sqlresult集中
                    myadapter.fill(result.datatable);
                    result.succeed = true;
                    //提交事物
                    trans.commit();
                }
                catch(exception e)
                {
                    result.succeed = false;
                    result.errormessage = e.message;
                }
                //如果捕捉了异常,但仍会执行包括在 finally 块中的输出语句
                finally
                {                   
                    myadapter.dispose();
                    mycommand.dispose();
                    myconnection.close();
                    myconnection.dispose();               
                }
            }
            return result;
        }
        //=======end=========
    }
}

继承此类后直接调用,如下:db:northwind
public class datest : spsql_base
    {
        public datest()
        {}
        public sqlresult sqltest()
        {
            base.sqlname="select employeeid,lastname from dbo.employees";
            return base.call_sql();
        }
        public sqlresult sptest()
        {
            base.procedurename="custorderhist";
            return base.call_sp("alfki");
        }
    }配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appsettings>
    <add key="connectionstring" value="server=bim-7c67612053c;database=northwind;uid=sa;pwd=;" />
</appsettings>
</configuration>显示查询结果:
private void datashow_load(object sender, system.eventargs e)
        {
            datest da=new datest();
            if(da.sptest().succeed && da.sqltest().succeed)
            {
                this.datasp.datasource=da.sptest().datatable;
               
                this.datasql.datasource=da.sqltest().datatable;
            }
        }   

此类还有待完善,诸如存储过程参数为//binary、//sql_variant、//timestamp、//uniqueidentifier这些类型时还不能执行查询,其余bug请大家多多指正~~

感谢以前一起在二炮工作过的师兄们提供源代码,小弟只是做简单修改,谢谢各位师兄!

出处:shanvenleo blog

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表