谢谢大伙的赏脸,请先看代码:以下这几个类组成一个通用的数据层
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 日后可多多指教。
using System;
using System.Data;
public interface Adb
{
IDbConnection CreateConn();
IDbCommand CreateCmd();
IDbDataAdapter CreateDa();
//略....
}
http://dev.csdn.net/article/36/36949.shtm
http://dev.csdn.net/article/37/37878.shtm
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);
}
}
首先定义的Fill已经不是int的了
再则定义的Fill又怎能被IDbDataAdapter所调用呢
请赐教
疑问。。
using System.Data.SqlClient;
public class Bdb : Adb
{}
这个Bdb意思应该是sqlserver的处理类吧?
为什么里面的方法不是
public SqlDataAdapter CreateDa()
{
return new SqlDataAdapter();
}
觉得你的接口没有设计好
具体请看通用数据库抽象工厂的代码
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
/// 自定义分页函数
/// </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;
}