再问个老问题,就是我写了一个接口,然后做了两个实现,一个是oracle,一个是sqlserver

时间:2021-02-19 23:28:43
再问个老问题,就是我写了一个接口,然后做了两个实现,一个是oracle,一个是sqlserver,是为了处理与数据库无关的数据库连接程序,connection可以用IDbConnection来抽象,可是返回是一个DataReader的时候,SqlDataReader与OracleDataReader并不能用一个抽象基类来表示,害的我现在只能用DataSet来模拟,但是这不是个办法,有没有办法能实现几个DataREader的抽象?
源代码我就不贴了,就几句话而已

17 个解决方案

#1


Oracle那一套没有用过
不过SqlDataReader是实现了System.Data.IDataReader接口的
按照.net的思想
Orcale中的DataReader应该同样实现这个接口
你查查看
应该可以直接用IDataReader

#2


我这里没有OracleData的安装,所以你自己看看,大体是按照下面的思路
看用OracleDataReader是不是从IDataReader实现的(我猜90%是)。如果是的话,可以用下面的方法。

IDbCommand myCommand = myConn.CreateCommand();
myCommand.CommandText = "SELECT * FROM Customers";
IDataReader myReader = myCommand.ExecuteReader();

while (myReader.Read())
  Console.WriteLine("{0}\t{1}", myReader.GetString(0), myReader.GetString(1));

#3


不需要自己实现接口

包括IDataReader、IDataAdapter等等接口,.Net类库里面已经设计了一整套,所以你直接用就行,不需要自己再封装一遍

#4


IDataAdapter 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDataAdapterMembersTopic.htm

IDataReader 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDataReaderMembersTopic.htm

IDbCommand 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDbCommandMembersTopic.htm

IDbConnection 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDbConnectionMembersTopic.htm

IDbTransaction 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDbTransactionMembersTopic.htm

IDataParameter 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemdataidataparameterclasstopic.htm



#5


我试验IDataReader是不行的,有没有人运行成功告诉我一声?

#6


为什么不成功?

编译不通过?

#7


????

你什么意思啊?如果你用接口那么当你接口引用的时候只能引用接口中

有的方法而不管具体实现如:

interfac ImyConncation//你的接口
{
   datareader  myConncation();
}

当你要继承接口实现类的时候,如以实现sqlconncation  Oracleconncation

那么你的接口只能使用myConncation()如:

ImyConncation myC=new sqlconncation();

myC.myConnaction();//你只能使用这个方法,因为你的接口中只有这个方法的定义

#8


我下载了一个看了看,的确实实现了IDataReader接口。如何不行,出什么错误信息,请说说。
[C#]
public sealed class OracleDataReader : MarshalByRefObject,
   IDataReader, IDisposable, IDataRecord, IEnumerable

#9


interface IData
{
IDataReader GetReader(string sql);
}
public class SqlData:IData
{
public SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public OracleDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}
----------------------------------------------
------ 已启动生成:项目:datareader, 配置:Debug .NET ------

正在准备资源...
正在更新引用...
正在执行主编译...
d:\yu\project.net\idatareader\datareader\form1.cs(107,15): error CS0536: “datareader.SqlData”不会实现接口成员“datareader.IData.GetReader(string)”。“datareader.SqlData.GetReader(string)”或者是静态、非公共的,或者有错误的返回类型。
d:\yu\project.net\idatareader\datareader\form1.cs(106,43):(相关位置)d:\yu\project.net\idatareader\datareader\form1.cs(108,35):(相关位置)d:\yu\project.net\idatareader\datareader\form1.cs(118,15): error CS0536: “datareader.OracleData”不会实现接口成员“datareader.IData.GetReader(string)”。“datareader.OracleData.GetReader(string)”或者是静态、非公共的,或者有错误的返回类型。
d:\yu\project.net\idatareader\datareader\form1.cs(106,43):(相关位置)d:\yu\project.net\idatareader\datareader\form1.cs(119,38):(相关位置)
生成完成 -- 2 个错误,0 个警告
正在生成附属程序集...



---------------------- 完成 ---------------------

    生成:0 已成功, 1 已失败, 0 已跳过


#10


public SqlDataReader GetReader(string sql)
->
public IDataReader GetReader(string sql)


public OracleDataReader GetReader(string sql)
->
public IDataReader GetReader(string sql)

#11


public IDataReader GetReader(string sql)
d:\yu\project.net\idatareader\datareader\form1.cs(99,22): error CS0106: 修饰符“public”对该项无效

#12


大家再看看有没有办法,或者我哪里写错了,过一会结贴了

#13


这样写没有问题
你重新试试

这是你的代码
using System.Data;
using System.Data.SqlClient;
interface IData
{
IDataReader GetReader(string sql);
}
public class SqlData:IData
{
public IDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
我编译了,没有问题

#14


没道理
你把所有代码贴出来看看

#15


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Data.OracleClient;
namespace datareader
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// button1
// 
this.button1.Location = new System.Drawing.Point(72, 104);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(136, 64);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
// 
// Form1
// 
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
  this.button1});
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{

}


}
interface IData
{
public IDataReader GetReader(string sql);
}
public class SqlData:IData
{
public SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public OracleDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}

}

#16


interface IData
{
public IDataReader GetReader(string sql);
}

改成:

public interface IData
{
IDataReader GetReader(string sql);
}

#17


接口声明可以声明零个或多个成员。接口的成员必须是方法、属性、事件或索引器。接口不能包含常数、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。

所有接口成员都隐式地具有 public 访问权限。接口成员声明包含任何修饰符属于编译时错误。具体地说,接口成员包含下列任何修饰符属于编译时错误:abstract、public、protected、internal、private、virtual、override 或 static。


reference:
ms-help://MS.VSCC/MS.MSDNVS.2052/csspec/html/vclrfcsharpspec_13_2.htm

interface IData
{
public IDataReader GetReader(string sql);
}
改成
interface IData
{
IDataReader GetReader(string sql);
}

public class SqlData:IData
{
public SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public OracleDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}

改成
public class SqlData:IData
{
public IDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public IDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}

#1


Oracle那一套没有用过
不过SqlDataReader是实现了System.Data.IDataReader接口的
按照.net的思想
Orcale中的DataReader应该同样实现这个接口
你查查看
应该可以直接用IDataReader

#2


我这里没有OracleData的安装,所以你自己看看,大体是按照下面的思路
看用OracleDataReader是不是从IDataReader实现的(我猜90%是)。如果是的话,可以用下面的方法。

IDbCommand myCommand = myConn.CreateCommand();
myCommand.CommandText = "SELECT * FROM Customers";
IDataReader myReader = myCommand.ExecuteReader();

while (myReader.Read())
  Console.WriteLine("{0}\t{1}", myReader.GetString(0), myReader.GetString(1));

#3


不需要自己实现接口

包括IDataReader、IDataAdapter等等接口,.Net类库里面已经设计了一整套,所以你直接用就行,不需要自己再封装一遍

#4


IDataAdapter 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDataAdapterMembersTopic.htm

IDataReader 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDataReaderMembersTopic.htm

IDbCommand 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDbCommandMembersTopic.htm

IDbConnection 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDbConnectionMembersTopic.htm

IDbTransaction 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataIDbTransactionMembersTopic.htm

IDataParameter 接口:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemdataidataparameterclasstopic.htm



#5


我试验IDataReader是不行的,有没有人运行成功告诉我一声?

#6


为什么不成功?

编译不通过?

#7


????

你什么意思啊?如果你用接口那么当你接口引用的时候只能引用接口中

有的方法而不管具体实现如:

interfac ImyConncation//你的接口
{
   datareader  myConncation();
}

当你要继承接口实现类的时候,如以实现sqlconncation  Oracleconncation

那么你的接口只能使用myConncation()如:

ImyConncation myC=new sqlconncation();

myC.myConnaction();//你只能使用这个方法,因为你的接口中只有这个方法的定义

#8


我下载了一个看了看,的确实实现了IDataReader接口。如何不行,出什么错误信息,请说说。
[C#]
public sealed class OracleDataReader : MarshalByRefObject,
   IDataReader, IDisposable, IDataRecord, IEnumerable

#9


interface IData
{
IDataReader GetReader(string sql);
}
public class SqlData:IData
{
public SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public OracleDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}
----------------------------------------------
------ 已启动生成:项目:datareader, 配置:Debug .NET ------

正在准备资源...
正在更新引用...
正在执行主编译...
d:\yu\project.net\idatareader\datareader\form1.cs(107,15): error CS0536: “datareader.SqlData”不会实现接口成员“datareader.IData.GetReader(string)”。“datareader.SqlData.GetReader(string)”或者是静态、非公共的,或者有错误的返回类型。
d:\yu\project.net\idatareader\datareader\form1.cs(106,43):(相关位置)d:\yu\project.net\idatareader\datareader\form1.cs(108,35):(相关位置)d:\yu\project.net\idatareader\datareader\form1.cs(118,15): error CS0536: “datareader.OracleData”不会实现接口成员“datareader.IData.GetReader(string)”。“datareader.OracleData.GetReader(string)”或者是静态、非公共的,或者有错误的返回类型。
d:\yu\project.net\idatareader\datareader\form1.cs(106,43):(相关位置)d:\yu\project.net\idatareader\datareader\form1.cs(119,38):(相关位置)
生成完成 -- 2 个错误,0 个警告
正在生成附属程序集...



---------------------- 完成 ---------------------

    生成:0 已成功, 1 已失败, 0 已跳过


#10


public SqlDataReader GetReader(string sql)
->
public IDataReader GetReader(string sql)


public OracleDataReader GetReader(string sql)
->
public IDataReader GetReader(string sql)

#11


public IDataReader GetReader(string sql)
d:\yu\project.net\idatareader\datareader\form1.cs(99,22): error CS0106: 修饰符“public”对该项无效

#12


大家再看看有没有办法,或者我哪里写错了,过一会结贴了

#13


这样写没有问题
你重新试试

这是你的代码
using System.Data;
using System.Data.SqlClient;
interface IData
{
IDataReader GetReader(string sql);
}
public class SqlData:IData
{
public IDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
我编译了,没有问题

#14


没道理
你把所有代码贴出来看看

#15


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Data.OracleClient;
namespace datareader
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// button1
// 
this.button1.Location = new System.Drawing.Point(72, 104);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(136, 64);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
// 
// Form1
// 
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
  this.button1});
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{

}


}
interface IData
{
public IDataReader GetReader(string sql);
}
public class SqlData:IData
{
public SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public OracleDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}

}

#16


interface IData
{
public IDataReader GetReader(string sql);
}

改成:

public interface IData
{
IDataReader GetReader(string sql);
}

#17


接口声明可以声明零个或多个成员。接口的成员必须是方法、属性、事件或索引器。接口不能包含常数、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。

所有接口成员都隐式地具有 public 访问权限。接口成员声明包含任何修饰符属于编译时错误。具体地说,接口成员包含下列任何修饰符属于编译时错误:abstract、public、protected、internal、private、virtual、override 或 static。


reference:
ms-help://MS.VSCC/MS.MSDNVS.2052/csspec/html/vclrfcsharpspec_13_2.htm

interface IData
{
public IDataReader GetReader(string sql);
}
改成
interface IData
{
IDataReader GetReader(string sql);
}

public class SqlData:IData
{
public SqlDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public OracleDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}

改成
public class SqlData:IData
{
public IDataReader GetReader(string sql)
{
SqlConnection conn = new SqlConnection("server=yuaiwu\\yuaiwu;uid=sa;pwd=sa1234;database=oilwell");
SqlCommand command = new SqlCommand(sql,conn);
conn.Open();
SqlDataReader reader = command.ExecuteReader();
return reader;
}
}
public class OracleData:IData
{
public IDataReader GetReader(string sql)
{
OracleConnection conn = new OracleConnection("data source=oilwell;user id=oilwell;password=oilwell");
OracleCommand command = new OracleCommand(sql,conn);
conn.Open();
OracleDataReader reader = command.ExecuteReader();
return reader;
}
}