+ -
当前位置:首页 → 问答吧 → 这个委托怎么写比较好呢?如果用泛型委托 该怎么做下 谢谢了

这个委托怎么写比较好呢?如果用泛型委托 该怎么做下 谢谢了

时间:2011-12-19

来源:互联网

 
是这样的 我有一个数据库导入的方法 主要是把Xls数据导入到SQL里边的,但是这个方法不是通用的 我现在想把这个方法 
改成通用的就想到了用委托去实现

C# code
// public delegate int AddDatasetToSQL(object obj); 这个是起初想法 后来换成下边

        public delegate int AddDatasetToSQL<T>(T obj);

        /// <summary>
        /// 将上传文件中的数据读取到数据库中
        /// </summary>
        /// <param name="fileName">上传的文件的地址</param>
        public static void ImportXlsData(string fileName, AddDatasetToSQL<object> AddData, Object obj)
        {
                               
 
            try
            {
                if (fileName == string.Empty)
                {
                    throw new ArgumentNullException("Excel文件上传失败!");
                }

                string oleDBConnString = String.Empty;
                oleDBConnString = "Provider=Microsoft.Jet.OLEDB.4.0;";
                oleDBConnString += "Data Source=";
                oleDBConnString += fileName;
                oleDBConnString += ";Extended Properties=Excel 8.0;";
                OleDbConnection oleDBConn = null;
                OleDbDataAdapter oleAdMaster = null;
                DataTable m_tableName = new DataTable();
                DataSet ds = new DataSet();

                oleDBConn = new OleDbConnection(oleDBConnString);
                oleDBConn.Open();
                m_tableName = oleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if (m_tableName != null && m_tableName.Rows.Count > 0)
                {

                    m_tableName.TableName = m_tableName.Rows[0]["TABLE_NAME"].ToString();

                }

                string sqlMaster;
                sqlMaster = " SELECT *  FROM [" + m_tableName.TableName + "]";
                oleAdMaster = new OleDbDataAdapter(sqlMaster, oleDBConn);
                oleAdMaster.Fill(ds, "m_tableName");
                oleAdMaster.Dispose();
                oleDBConn.Close();
                oleDBConn.Dispose();

                if (!obj.Equals(null))
                {
                    //委托添加数据库
                    AddData(obj);
                    
                }

               
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


以上都不能达到我想要的结果;问题是 AddDatasetToSQL 这个委托不能确定 其参数类型 所以我第一次订为 object 后来发现不行
 就用 AddDatasetToSQL<T>(T obj); 但同样在ImportXlsData方法中 还是不能订这个 T类型,如果要实现这个功能 该怎么做?

---------------------------------------------------------------
想了一个方法 发现不怎么好用 就是 写一个为空基类(BaseClass 这里是实体层)去继承它,
这个 public delegate int AddDatasetToSQL(object obj); 的object就可以换成BaseClass,然后BLL层的也去继承用到的实体层,但总觉得的这个方法不好。
如果用泛型委托 该怎么做下 谢谢了

作者: e8love   发布时间: 2011-12-19

你那个obj是什么东西?如果仅仅是导入数据,根本用不到委托,因为方法是可以定死的。至于类型,你也不需要确定,使用DataTable类型不是更好?这里完全没必要用实体类,DataTable加载了外部数据,然后解析DataTable的列结构,往数据库里插入,如此简单思路都没想到吗?

作者: qldsrx   发布时间: 2011-12-19

是这样的 我的意思是

导入数据时 要同时插入数据到数据库

所以要有个方法 

比如 导入 

student 表 有个方法是 Add(student Std)
User 表 有个方法是 Add(User Users)

其他都类似 如果不用委托 该用什么去做比较好点 要做个 比较通用的

作者: e8love   发布时间: 2011-12-19

根本不是用委托,这里只是操作实体类的话,可以定制一个接口来操作,或者用反射,因为你方法是固定的,而实体类的类型不定,其实就是里面的属性不定,因此只涉及到反射。

作者: qldsrx   发布时间: 2011-12-19

相关阅读 更多

热门下载

更多