谢谢大伙的赏脸,请先看代码:以下这几个类组成一个通用的数据层
using System;
using System.Data;
public interface Adb
{
    public static void Main(string[] args)
    {
        IDbConnection CreateConn();
        IDbCommand CreateCmd();
        IDbDataAdapter CreateDa();
        //略....
    }
}using System;
using System.Data;
using System.Data.SqlClient;
public class Bdb : Adb
{
    public IDbConnection CreateConn()
    {
        return new SqlConnection();
    }
    public IDbCommand CreateCmd()
    {
        return new SqlCommand();
    }
    public IDbDataAdapter CreateDa()
    {
        return new SqlDataAdapter();
    }
    //略....
}using System;
using System.Data;
using System.Data.OleDb;
public class Cdb : Adb
{
    public IDbConnection CreateConn()
    {
        return new OleDbConnection();
    }
    //略....
}using System;
using System.Data;
public class Func
{
    public DataSet fun(string tableName)
    {
        DataSet ds = new DataSet();
        IDbConnection conn = new Bdb.CreateConn();
        IDbCommand cmd = new Bdb.CreateCmd();
        IDbDataAdapter da = new Bdb.CreateDa();
        conn.ConnectionText = connStr;//(略)数据库连接串
        conn.Open();
        string sql = "SELECT * FROM " + tableName;
        cmd.CommandText = sql;
        da.SelectCommand = cmd;
        da.Fill(ds);//关键问题?
        conn.Close();
        return ds;
    }
//........
}***********************
关键问题:由于Func.fun()里 da 是从IDbDataAdapter派生的,因此这里的da.Fill()方法里没有重载,即 不能像平常代码里这样:
//示例
System.Data.xxx.DataAdapter da = new System.Data.xxx.DataAdapter();
da.Fill();
da.Fill(DataSet ds);
da.Fill(DataSet ds, int startIndex, int count, string table);
//...这里的da.Fill()能实现多个重载,就是我所求的
以上示例之所有能实现Fill()的多个重载,其实是继承了System.Data.Common.DbDataAdapter
而System.Data.Common.DbDataAdapter 是个抽象类,并不是接口
请问,我的接口或类里,要如何才能实现与之关联,从而得到da.Fill(xx, xx, xx, xx)等多个重载的方法?该问题在于研究、分析和讨论,分不在多,
若能把功能完全实现者,我会另开贴送分,
或加本人QQ:771621 日后可多多指教。

解决方案 »

  1.   

    不好意思,上面的 接口类在草稿里贴错了,应该是:
    using System;
    using System.Data;
    public interface Adb
    {
        IDbConnection CreateConn();
        IDbCommand CreateCmd();
        IDbDataAdapter CreateDa();
        //略....
    }
      

  2.   

    经朋友指点,找到了 thinkingforever的两篇文章,在此得谢谢他了。
    http://dev.csdn.net/article/36/36949.shtm
    http://dev.csdn.net/article/37/37878.shtm
      

  3.   

    楼主可以考虑在interface Adb中声明所需的各种Fill()啊:using System;
    using System.Data;
    public interface Adb
    {
        public static void Main(string[] args)
        {
            IDbConnection CreateConn();
            IDbCommand CreateCmd();
            IDbDataAdapter CreateDa();
            //略....
            
            /// <summary>
            /// 执行查询。
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <returns>DataTable</returns>
            DataTable Fill(string sql);
            
            /// <summary>
            /// 执行查询。
            /// </summary>
            /// <param name="sql">SQL语句</param>
            /// <param name="paramsArray">参数数组</param>
            /// <returns>DataTable</returns>
            DataTable Fill(string sql,IDataParameter[] paramsArray); /// <summary>
    /// 执行查询
    /// </summary>
    /// <param name="sql">SQL语句</param>
    /// <param name="paramsArray">参数数组</param>
    /// <param name="commandType">命令类型(可为SQL文本、存储过程、表)              </param>
    /// <returns></returns>
    DataTable Fill(string sql,IDataParameter[] paramsArray,CommandType   commandType);
        }
    }
      

  4.   

    楼上的朋友似乎有点离题了吧,呵呵
    首先定义的Fill已经不是int的了
    再则定义的Fill又怎能被IDbDataAdapter所调用呢
    请赐教
      

  5.   

    不是很明白你的思路
    疑问。。
    using System.Data.SqlClient;
    public class Bdb : Adb
    {}
    这个Bdb意思应该是sqlserver的处理类吧?
    为什么里面的方法不是  
         public SqlDataAdapter CreateDa()
        {
            return new SqlDataAdapter();
        }
    觉得你的接口没有设计好
      

  6.   

    yuezhong:public class Bdb 是实现 Adb接口的
    具体请看通用数据库抽象工厂的代码
    http://www.csdn.net/develop/article/26/26098.shtm
    http://www.csdn.net/develop/article/26/26099.shtm
    http://www.csdn.net/develop/article/26/26100.shtm
      

  7.   

    没办法只能单独在每个工厂中写个方法了/// <summary>
    /// 自定义分页函数
    /// </summary>
    /// <param name="strConn">数据库连接字符串</param>
    /// <param name="strSql">SQL语句</param>
    /// <param name="startRecord">记录集开始索引</param>
    /// <param name="maxRecords">最大载入的记录集</param>
    /// <param name="srcTable">表名</param>
    /// <returns>DataSet对象</returns>
    public DataSet dsFill(string strConn, string strSql, int startRecord, int maxRecords, string srcTable)
    {
    DataSet ds = new DataSet();
    OleDbConnection conn = new OleDbConnection(strConn);
    OleDbTransaction ts;
    OleDbCommand cmd = new OleDbCommand();
    OleDbDataAdapter dda = new OleDbDataAdapter();
    conn.Open();
    ts = conn.BeginTransaction();
    cmd.Transaction = ts;
    cmd.Connection = conn;
    cmd.CommandText = strSql;
    dda.SelectCommand = cmd;
    try
    {
    dda.Fill(ds, startRecord, maxRecords, srcTable);
    ts.Commit();
    }
    catch
    {
    ts.Rollback();
    ds.Clear();
    throw;
    }
    finally
    {
    cmd.Dispose();
    conn.Close();
    }
    return ds;
    }