今天看了一下asp.net连接oracle数据库的方法,得到了如下代码。这段代码打开了mytable表,并把操作员的名字列出。字段类型是oraclestring。读取的时候用的是字段编号,我不知道怎么使用字段名来读取某字段的内容。 下面是代码: //首先添加两条引用 using sy
今天看了一下asp.net连接oracle数据库的方法,得到了如下代码。这段代码打开了mytable表,并把操作员的名字列出。字段类型是oraclestring。读取的时候用的是字段编号,我不知道怎么使用字段名来读取某字段的内容。
下面是代码:
//首先添加两条引用
using system.data.oracleclient;
using system.data;
//在窗体上添加一个按钮,叫button1,双击button1,输入以下代码
private void button1_click(object sender, system.eventargs e)
{
string connectionstring=data source=sky;user=system;password=manager;;//写连接串
oracleconnection conn=new oracleconnection(connectionstring);//创建一个新连接
try
{
conn.open();
oraclecommand cmd=conn.createcommand();
cmd.commandtext=select * from mytable;//在这儿写sql语句
oracledatareader odr=cmd.executereader();//创建一个oracledatereader对象
while(odr.read())//读取数据,如果odr.read()返回为false的话,就说明到记录集的尾部了
{
response.write(odr.getoraclestring(1).tostring());//输出字段1,这个数是字段索引,具体怎么使用字段名还有待研究
}
odr.close();
}
catch(exception ee)
{
response.write(ee.message); //如果有错误,输出错误信息
}
finally
{
conn.close(); //关闭连接
}
}
=====================================
oracle9i连接asp.net方法及注意点
推荐方式
public void oledboracle_dataset()
{
string connectionstring=data source=mine;user=sys;password=sys;; //写连接串
oracleconnection conn=new oracleconnection(connectionstring); //创建一个新连接
oraclecommand cmd= new oraclecommand(select * from fjdl.t_rights,conn);
dataset ds = new dataset();
oracledataadapter oda=new oracledataadapter();
oda.selectcommand=cmd;
oda.fill(ds);
conn.close();
datagrid1.datasource=ds.tables[0].defaultview;
datagrid1.databind();
}
以下为用dataset和datareader,oledb和oralceclient的四种方法
public void oledboracle_datareader()
{
system.data.oledb.oledbconnection oledb1=new system.data.oledb.oledbconnection();
string sqltext=select * from scott.tadmin;
system.data.oledb.oledbdatareader reader;
oledb1.connectionstring=provider=/oraoledb.oracle.1/;user id=system;password=system;data source=rick;;
system.data.oledb.oledbcommand com=new system.data.oledb.oledbcommand(sqltext,oledb1);
com.connection.open();
reader=com.executereader();
datagrid1.datasource=reader;
datagrid1.databind();
//this.response.write(oledbconnection1.connectionstring);
reader.close();
com.connection.close();
}
public void oledboracle_dataset()
{
system.data.oledb.oledbconnection oledb1=new system.data.oledb.oledbconnection(provider=/oraoledb.oracle.1/;user id=system;password=system;data source=rick;);
string sqltext=select * from scott.tadmin;
system.data.dataset set1=new dataset();
system.data.oledb.oledbdataadapter ada1=new system.data.oledb.oledbdataadapter (sqltext,oledb1);
ada1.fill(set1,data1);
this.datagrid2.datasource=set1.tables[data1].defaultview;
this.datagrid2.databind();
}
public void oracle_dataset()
{
system.data.oracleclient.oracleconnection oracle1=new system.data.oracleclient.oracleconnection(user id=system;data source=rick;password=system);
string sqltext=select * from scott.tadmin;
system.data.dataset set1=new dataset();
system.data.oracleclient.oracledataadapter ada1=new system.data.oracleclient.oracledataadapter(sqltext,oracle1);
ada1.fill(set1,oracle_data1);
this.datagrid3.datasource=set1.tables[oracle_data1].defaultview;
this.datagrid3.databind();
}
public void oracle_datareader()
{
system.data.oracleclient.oracleconnection oracle2=new system.data.oracleclient.oracleconnection();
string sqltext=select * from scott.tadmin;
system.data.oracleclient.oracledatareader reader;
oracle2.connectionstring=user id=system;user id=system;data source=rick;password=system;
system.data.oracleclient.oraclecommand com=new system.data.oracleclient.oraclecommand(sqltext,oracle2);
com.connection.open();
reader=com.executereader();
datagrid4.datasource=reader;
datagrid4.databind();
//this.response.write(oledbconnection1.connectionstring);
reader.close();
com.connection.close();
}
注意点:
如果不设置远程数据的本级网络配置
ora-00162: external dbid length 18 is greater than maximum (16)
连接名称不能超过16个字符
修改方法
configuration and migration tools->net configuration assistant中配置
===========================================
在.net中调用oracle9i存储过程经验总结
在.net中调用oracle9i存储过程可以用多个数据提供者,比如oralceclient,oledb。本文将用oralceclient为例。.net语言用c#。
一、调用一个带输入、输出参数的存储过程
首先,在oralce中创建存储过程如下:
create or replace procedure getrecords(name_out out varchar2,age_in in varchar2) as
begin
select name into name_out from test where age = age_in;
end;
然后,在c#项目中作如下调用:
string connectionstring = data source=yxzhang;user id=yxzhang;password=yxzhang;
string querystring = getrecords;
oracleconnection cn = new oracleconnection(connectionstring);
oraclecommand cmd = new oraclecommand(querystring,cn);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(name_out,oracletype.varchar,20);
cmd.parameters[name_out].direction = parameterdirection.output;
cmd.parameters.add(age_in,21);
try
{
cn.open();
cmd.executenonquery();
console.writeline(name is:{0},cmd.parameters[name_out].value.tostring());
cn.close();
}
catch( oracleexception ex )
{
console.writeline(exception occurred!);
console.writeline(the exception message is:{0},ex.message.tostring());
}
finally
{
console.writeline(------------------end-------------------);
}
小结:
以上是很平常的调用方法,但是我在做这个示例程序的时候,却不是那么一帆风顺。这里要指出oracleclient的一个不尽如人意之处,就是对于参数名称,必须和存储过程定义中的参数同名,否则就会报错。比如将代码中的“name_out”改为别的名称的话,就会报异常。但我试着用oledb代替oralceclient,却没有这个问题。不知道在新版本的数据提供程序中会否改进这一点?
二、调用不返回数据的存储过程
首先,在oralce中创建存储过程如下:
create or replace procedure insertrecord(userid in varchar2,
username in varchar2,
userage in varchar2) is
begin
insert into test values (userid, username, userage);
end;
然后,在c#项目中作如下调用:
string connectionstring = data source=yxzhang;user id=yxzhang;password=yxzhang;
string querystring = insertrecord;
oracleconnection cn = new oracleconnection(connectionstring);
oraclecommand cmd = new oraclecommand(querystring,cn);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(userid,007);
cmd.parameters.add(username,dell);
cmd.parameters.add(userage,40);
try
{
cn.open();
cmd.executenonquery();
console.writeline(record inserted!);
cn.close();
}
catch( oracleexception ex )
{
console.writeline(exception occurred!);
console.writeline(the exception message is:{0},ex.message.tostring());
}
finally
{
console.writeline(------------------end-------------------);
}
小结:
不返回数据的存储过程一般有delete, insert, update等。虽然它们的sql语句不同,但是调用方面都是一样的。只要传入正确的参数,一般不会出什么问题。不过还是要注意,在使用oralceclient作为数据提供者的时候,参数名称一定要和存储过程定义中的一致!至于参数添加的顺序倒是无所谓的,因为有参数名称作为区别。
三、identity 和 sequence
sql server中,定义一个列为递增列很容易,但我在oracle中却怎么也找不到设置的方法。不过查了点资料后知道oracle中有个叫sequence的对象,产生一个唯一的序列号,类似于sql server中的identity。于是,我做了如下实验:
首先,在oracle中创建了一个名为test_seq的sequence对象,sql语句如下:
create sequence test_seq
minvalue 100
maxvalue 999
start with 102
increment by 1
nocache;
语法应该是比较易懂的,最小最大值分别用minvalue,maxvalue表示,初始值是102(这个数字是动态变化的,我创建的时候设的是100,后因插入了2条数据后就自动增加了2),increment当然就是步长了。在pl/sql中可以用test_seq.nextval访问下一个序列号,用test_seq.currval访问当前的序列号。
定义完了sequence,接下来就是创建一个存储过程insertrecordwithsequence:
--这次我修改了test表的定义,和前面的示例不同。其中,userid是pk。
create or replace procedure insertrecordwithsequence(userid out number,
username in varchar2,
userage in number)
is
begin
insert into test(id, name, age) --插入一条记录,pk值从sequece获取
values(test_seq.nextval, username, userage);
/*返回pk值。注意dual表的用法*/
select test_seq.currval into userid from dual;
end insertrecordwithsequence;
接下来,就是在c#中进行调用了:
string connectionstring = data source=yxzhang;user id=yxzhang;password=yxzhang;
string querystring = insertrecordwithsequence;
oracleconnection cn = new oracleconnection(connectionstring);
oraclecommand cmd = new oraclecommand(querystring,cn);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(userid,oracletype.number);
cmd.parameters[userid].direction = parameterdirection.output;
cmd.parameters.add(username,jack);
cmd.parameters.add(userage,40);
try
{
cn.open();
int rowaffected = cmd.executenonquery();
console.writeline({0}行已插入。,rowaffected);
console.writeline(插入行的id为:{0},cmd.parameters[userid].value.tostring());
cn.close();
}
catch( oracleexception ex )
{
console.writeline(exception occurred!);
console.writeline(the exception message is:{0},ex.message.tostring());
}
finally
{
console.writeline(------------------end-------------------);
}
小结:
使用sequece对象可以很容易地创建唯一序列,在存储过程中的调用也十分方便,只要sequence_name.nextval以及sequence.currval就能得到下一个以及当前的序列值。倒是dual表值得注意。
四、使用datareader读取返回的结果集
为了让存储过程返回结果集,必须定义一个游标变量作为输出参数。这和sql server中有着很大的不同!并且还要用到oracle中“包”(package)的概念,似乎有点繁琐,但熟悉后也会觉得很方便。
关于“包”的概念,有很多内容可以参考,在此就不赘述了。首先,我创建了一个名为testpackage的包,包头是这么定义的:
create or replace package testpackage is
type mycursor is ref cursor; -- 定义游标变量
procedure getrecords(ret_cursor out mycursor); -- 定义过程,用游标变量作为返回参数
end testpackage;
包体是这么定义的:
create or replace package body testpackage is
/*过程体*/
procedure getrecords(ret_cursor out mycursor) as
begin
open ret_cursor for select * from test;
end getrecords;
end testpackage;
已经万事具备了,让我们前台调用试试:
string connectionstring = data source=yxzhang;user id=yxzhang;password=yxzhang;
string querystring = testpackage.getrecords; //注意调用方法
oracleconnection cn = new oracleconnection(connectionstring);
oraclecommand cmd = new oraclecommand(querystring,cn);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(ret_cursor,oracletype.cursor); //注意这里的类型
cmd.parameters[ret_cursor].direction = parameterdirection.output;
try
{
cn.open();
oracledatareader dr = cmd.executereader();
int i = 1;
while( dr.read() )
{
console.writeline(record {0}:,i++);
console.writeline(id:{0} name:{1} age:{2},
dr.getoraclenumber(0),
dr.getoraclestring(1),
dr.getoraclenumber(2));
console.writeline();
}
dr.close(); //用完datareader对象要记得及时关闭
cn.close(); //datareader对象未关闭之前,不能关闭连接
}
catch( oracleexception ex )
{
console.writeline(exception occurred!);
console.writeline(the exception message is:{0},ex.message.tostring());
}
finally
{
console.writeline(------------------end-------------------);
}
请看结果:
record 1:
id:100 name:tony age:23
record 2:
id:101 name:jack age:40
------------------end-------------------
小结:
包是oracle特有的概念,sql server中找不到相匹配的东西。在我看来,包有点像vc++的类,包头就是.h文件,包体就是.cpp文件。包头只负责定义,包体则负责具体实现。如果包返回多个游标,则datareader会按照您向参数集合中添加它们的顺序来访问这些游标,而不是按照它们在过程中出现的顺序来访问。可使用datareader的nextresult()方法前进到下一个游标。
五、用返回的结果集填充dataset
ado.net舍弃了原来ado中recordset的概念,而使用全新的dataset来替代。dataset可以提供更加强大的功能!有了前面的基础,利用ado.net从oralce返回dataset也是非常简单的。主要思想就是用dataadapter接收返回的游标,再用dataadapter的fill()方法填充数据集。在下面的例子中,我仍用了前一个例子中建好的testpackage包。
下面是前台调用主要代码:
string connectionstring = data source=yxzhang;user id=yxzhang;password=yxzhang;
string querystring = testpackage.getrecords;
oracleconnection cn = new oracleconnection(connectionstring);
oraclecommand cmd = new oraclecommand(querystring,cn);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(ret_cursor,oracletype.cursor);
cmd.parameters[ret_cursor].direction = parameterdirection.output;
try
{
cn.open();
oracledataadapter da = new oracledataadapter(cmd);
dataset ds = new dataset();
da.fill(ds,testtable);
cn.close();
for( int i = 0;i
{
string id = ds.tables[testtable].rows[i][id].tostring();
string name = ds.tables[testtable].rows[i][name].tostring();
string age = ds.tables[testtable].rows[i][age].tostring();
console.writeline(record {0}:,i+1);
console.writeline(id:{0}/tname:{1}/tage:{2}/n,id,name,age);
}
}
catch( oracleexception ex )
{
console.writeline(exception occurred!);
console.writeline(the exception message is:{0},ex.message.tostring());
}
finally
{
console.writeline(------------------end-------------------);
}
小结:
程序调用后的结果和刚才用datareader调用的结果一样。这里只说明怎样利用ado.net调用oracle存储过程,以及怎样填充至数据集中。至于怎样操纵dataset,不是本文的讨论范围。有兴趣的读者可以参考msdn以及相关书籍。
六、用dataadapter更新数据库
通常用dataadapter取回dataset,将会对dataset进行一些修改,继而更新数据库(如果只是为了获取数据,微软推荐使用datareader代替dataset)。然而,通过存储过程更新数据库,并不是那么简单,不能简单地通过dataadapter的update()方法进行更新。必须手动为dataadapter添加insertcommand, deletecommand, updatecommand,因为存储过程对这些操作的细节是不知情的,必须人为给出。
为了达成这个目标,我完善了之前的testpackage包,包头如下:
create or replace package testpackage is
type mycursor is ref cursor;
procedure updaterecords(id_in in number,newname in varchar2,newage in number);
procedure selectrecords(ret_cursor out mycursor);
procedure deleterecords(id_in in number);
procedure insertrecords(name_in in varchar2, age_in in number);
end testpackage;
包体如下:
create or replace package body testpackage is
procedure updaterecords(id_in in number, newname in varchar2, newage in number) as
begin
update test set age = newage, name = newname where id = id_in;
end updaterecords;
procedure selectrecords(ret_cursor out mycursor) as
begin
open ret_cursor for select * from test;
end selectrecords;
procedure deleterecords(id_in in number) as
begin
delete from test where id = id_in;
end deleterecords;
procedure insertrecords(name_in in varchar2, age_in in number) as
begin
insert into test values (test_seq.nextval, name_in, age_in);
--test_seq是一个已建的sequence对象,请参照前面的示例
end insertrecords;
end testpackage;
前台调用代码如下,有点繁琐,请耐心阅读:
string connectionstring = data source=yxzhang;user id=yxzhang;password=yxzhang;
string querystring = testpackage.selectrecords;
oracleconnection cn = new oracleconnection(connectionstring);
oraclecommand cmd = new oraclecommand(querystring,cn);
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(ret_cursor,oracletype.cursor);
cmd.parameters[ret_cursor].direction = parameterdirection.output;
try
{
cn.open();
oracledataadapter da = new oracledataadapter(cmd);
dataset ds = new dataset();
da.fill(ds,testtable);
cn.close();
int count = ds.tables[testtable].rows.count;
/*打印原始记录*/
console.writeline(old records is:);
for( int i = 0;i
{
string id = ds.tables[testtable].rows[i][id].tostring();
string name = ds.tables[testtable].rows[i][name].tostring();
string age = ds.tables[testtable].rows[i][age].tostring();
console.writeline(record {0}:,i+1);
console.writeline(id:{0}/tname:{1}/tage:{2}/n,id,name,age);
}
da.selectcommand = cmd; //为dataadapter指定selectcommand
oraclecommand updatecmd = new oraclecommand(testpackage.updaterecords,cn);
updatecmd.commandtype = commandtype.storedprocedure;
updatecmd.parameters.add(id_in,oracletype.number,3,id);
updatecmd.parameters.add(newname,oracletype.varchar,20,name);
updatecmd.parameters.add(newage,oracletype.number,3,age);
da.updatecommand = updatecmd; //为dataadapter指定updatecommand
oraclecommand deletecmd = new oraclecommand(testpackage.deleterecords,cn);
deletecmd.commandtype = commandtype.storedprocedure;
deletecmd.parameters.add(id_in,oracletype.number,3,id);
da.deletecommand = deletecmd; //为dataadapter指定deletecommand
oraclecommand insertcmd = new oraclecommand(testpackage.insertrecords,cn);
insertcmd.commandtype = commandtype.storedprocedure;
insertcmd.parameters.add(name_in,oracletype.varchar,20,name);
insertcmd.parameters.add(age_in,oracletype.number,3,age);
da.insertcommand = insertcmd; //为dataadapter指定insertcommand
datatable newtable = ds.tables[testtable];
/*修改第一条记录*/
newtable.rows[0][age] = 22;
newtable.rows[0][name] = john;
/*删除一条记录*/
newtable.rows[2].delete();
/*插入一条记录*/
datarow newrow = newtable.newrow();
newrow[name] = bob;
newrow[age] = 99;
newtable.rows.add(newrow);
cn.open();
da.update(newtable); //将更改更新到数据库
newtable.clear(); //清空datatable
da.fill(newtable); //获取更改后的数据
cn.close();
/*打印新记录*/
console.writeline(new records is:);
for( int i = 0;i
{
string id = newtable.rows[i][id].tostring();
string name = newtable.rows[i][name].tostring();
string age = newtable.rows[i][age].tostring();
console.writeline(record {0}:,i+1);
console.writeline(id:{0}/tname:{1}/tage:{2}/n,id,name,age);
}
}
catch( oracleexception ex )
{
console.writeline(exception occurred!);
console.writeline(the exception message is:{0},ex.message.tostring());
}
finally
{
console.writeline(------------------end-------------------);
}
运行结果如下:
old records is:
record 1:
id:100 name:tony age:23
record 2:
id:101 name:jack age:34
record 3:
id:103 name:newadd age:100
new records is:
record 1:
id:100 name:john age:22
record 2:
id:101 name:jack age:34
record 3:
id:104 name:bob age:99
------------------end-------------------
小结:
使用update()方法更新数据库是非常有用的,但是只局限于单个表,对于表连接的情况,还是直接用oraclecommand的excutenonquery()方法去执行更新操作比较方便。
真是要命!连些最基本的都记不住......谢谢整理该份资料的作者!(要是有2.0下的就更好了 )
一.用sqlconnection连接sql server
1..加入命名空间
using system.data.sqlclient;
2.连接数据库
sqlconnection myconnection = new sqlconnection();
myconnection.connectionstring = user id=sa;password=sinofindb;initial catalog=test;data source=127.0.0.1;connect timeout=30;
myconnection.open();
改进(更通用)的方法:
string mysqlconnection=user id=sa;password=sinofindb;database =test;data source=127.0.0.1;connect timeout=30;
sqlconnection myconnection = new sqlconnection(mysqlconnection);
myconnection.open();
二。用oledbconnection连接
1.加入命名空间
using system.data.oledb;
2.连接sql server
string mysqlconnection=provider=sqloledb;data source=localhost;initial catalog=test;integrated security=sspi;;
sqlconnection myconnection = new sqlconnection(mysqlconnection);
myconnection.open();
3.连接access(可通过建立.udl文件获得字符串)
string mysqlconnection=provider=microsoft.jet.oledb.4.0;data source=c:/db2000.mdb;
persist security info=false;
4.连接oracle(也可通过oracleconnection连接)
string mysqlconnection=provider=msdaora;data source=db; user id=sa;password=sinofindb;
三.创建command对象
1.sqlcommand 构造函数
①初始化 sqlcommand 类的新实例。public sqlcommand();
sqlcommand mycommand = new sqlcommand();
②初始化具有查询文本的 sqlcommand 类的新实例。public sqlcommand(string);
string myselectquery = select * from mindata;
sqlcommand mycommand = new sqlcommand(myselectquery);
③初始化具有查询文本和 sqlconnection 的sqlcommand类实例。
public sqlcommand(string, sqlconnection);
string myselectquery = select * from mindata;
string myconnectstring = user id=sa;password=;database=test;server=mysqlserver;
sqlconnection myconnection = new sqlconnection(myconnectstring);
sqlcommand mycommand = new sqlcommand(myselectquery,myconnection);
④初始化具有查询文本、sqlconnection 和 transaction 的 sqlcommand 类实例。
public sqlcommand(string, sqlconnection, sqltransaction);
sqltransaction mytrans = myconnection.begintransaction();
string myselectquery = select * from mindata;
string myconnectstring = user id=sa;password=;database=test;server=mysqlserver;
sqlconnection myconnection = new sqlconnection(myconnectstring);
sqlcommand mycommand = new sqlcommand(myselectquery,myconnection, mytrans);
2.建立sqlcommand与sqlconnection的关联。
mycommand.connection = myconnection;
或者:sqlcommand mycommand = myconnection.createcommand;
3.设置sqlcommand的查询文本。
mycommand.commandtext = select * from mindata;
或者第2种构造:sqlcommand mycommand = new sqlcommand(myselectquery);
给sqlcommand对象提供两个查询字符串,每个查询字符串访问不同的表,返回不同的结果集。
两个查询语句用分号分隔。
4. 执行命令。
executereader
返回一行或多行
executenonquery
对 connection 执行 transact-sql 语句并返回受影响的行数(int)
executescalar
返回单个值(如一个聚合值).返回结果集中第一行的第一列。忽略额外的列或行
executexmlreader
将 commandtext 发送到 connection 并生成一个 xmlreader 对象。
sqldatareader myreader = mycommand.executereader();
或sqldatareader myreader = mycommand.executereader(commandbehavior.closeconnection);
while(myreader.read()) //循环读取数据
{
console.writeline(myreader.getstring(0));// 获取指定列的字符串形式的值
console.writeline(myreader. getvalue(1));// 获取以本机格式表示的指定列的值
}
commandtext = select count(*) as numberofregions from region;
int count = (int) mycommand.executescalar();
关于oledbcommand对象的使用。
四.datareader的使用
1.遍历结果集
while (myreader.read())
console.writeline(/t{0}/t{1}, myreader.getint32(0), myreader.getstring(1));
myreader.close();
2.使用序数索引器。
while (myreader.read())
console.writeline(/t{0}/t{1}, myreader[0].tostring(), myreader[1].tostring());
myreader.close();
3.使用列名索引器。
while (myreader.read())
console.writeline(/t{0}/t{1}, myreader[code].tostring(), myreader[name].tostring());
myreader.close();
4.使用类型访问器。
public char getchar(int i); 获取指定列的单个字符串形式的值
public datetime getdatetime(int i); 获取指定列的 datetime 对象形式的值
public short getint16(int i); 获取指定列的 16 位有符号整数形式的[c#]
public string getstring(int i); 获取指定列的字符串形式的值
5.得到列信息。
myreader.fieldcount 获取当前行中的列数
myreader.getfieldtype(序号) 获取是对象的数据类型的 type
myreader.getdatatypename(序号) 获取源数据类型的名称
myreader.getname(序号) 获取指定列的名称
myreader.getordinal(序号) 在给定列名称的情况下获取列序号
6.得到数据表的信息。
myreader.getschematable() 返回一个 datatable
7.操作多个结果集。
myreader.nextresult() 使数据读取器前进到下一个结果集
do
{
while (myreader.read())
console.writeline(/t{0}/t{1}, myreader.getint32(0), myreader.getstring(1));
}
while(myreader.nextresult());
五.dataadapter
1.创建sqldataadapter
初始化 sqldataadapter 类的新实例。
public sqldataadapter();
将指定的 sqlcommand 作为selectcommand 属性,初始化 sqldataadapter 类的新实例。
public sqldataadapter(sqlcommand);
用 selectcommand字符串 和 sqlconnection对象初始化sqldataadapter 类的新实例。
public sqldataadapter(string, sqlconnection);
用 selectcommand字符串 和 一个连接字符串 初始化sqldataadapter 类的新实例。
public sqldataadapter(string, string);
2.dataadapter和sqlconnection,sqlcommand建立关联。
1.dataadapter在构造参数时建立
2.sqldataadapter adapter = new sqldataadapter();
adapter.selectcommand = new sqlcommand(query, conn);
3.dataadapter.fill()方法。
在 dataset 中添加或刷新行以匹配使用 dataset 名称的数据源中的行,并创建一个名为“table”的 datatable。
public override int fill(dataset);
在 dataset 中添加或刷新行以匹配使用 dataset 和 datatable 名称的数据源中的行。
public int fill(dataset, string);
在 dataset 的指定范围中添加或刷新行以匹配使用 dataset 和 datatable 名称的数据源中的行。
public int fill(dataset, int, int, string);
在 datatable 中添加或刷新行以匹配使用 datatable 名称的数据源中的行。
public int fill(datatable);
在 datatable 中添加或刷新行以匹配使用指定 datatable 和 idatareader 名称的数据源中的行。
protected virtual int fill(datatable, idatareader);
在 datatable 中添加或刷新行以匹配使用 datatable 名称、指定的 sql select 语句和 commandbehavior 的数据源中的行。
protected virtual int fill(datatable, idbcommand, commandbehavior);
六.datatable 类
七.datacolumn 类
八.datarow 类
九.dataset 类
1.创建dataset 对象
初始化 dataset 类的新实例。
public dataset();
用给定名称初始化 dataset 类的新实例。
public dataset(string);
2.用dataadapter填充dataset
dataset myds=new dataset();
adapter.fill(myds)
adapter.fill(myds,”表名”); 用一个表去填充dataset.
十. datatablecollection 类。 表示 dataset 的表的集合。
datatablecollection dtc = ds.tables;
datatable table = dtc[“表名”];
string strexpr = id > 5;
string strsort = name desc;
datarow[] foundrows = customertable.select( strexpr, strsort,);
进行动态的筛选和排序。
datatable.select() 方法 : 获取 datarow 对象的数组,
①获取所有 datarow 对象的数组。
public datarow[] select();
②按主键顺序(如没有主键,则按照添加顺序),获取与筛选条件相匹配的所有 datarow 对象的数组。
public datarow[] select(string);
③获取按照指定的排序顺序且与筛选条件相匹配的所有 datarow 对象的数组。
public datarow[] select(string, string);
④获取与排序顺序中的筛选器以及指定的状态相匹配的所有 datarow 对象的数组。
public datarow[] select(string, string, dataviewrowstate);
十一。dataview 类 : 是datatable内容的动态视图。
1. 创建对象
初始化 dataview 类的新实例。
public dataview();
用指定的 datatable 初始化 dataview 类的新实例。
public dataview(datatable);
用指定的 datatable、rowfilter、sort 和 dataviewrowstate 初始化 dataview 类的新实例。
public dataview(datatable, string, string, dataviewrowstate);
dataview myview = new dataview(ds.tables[suppliers], id > 5, name desc,
dataviewrowstate.currentrows);
2 .得到dataview的行数据。
foreach (datarowview myrowview in myview)
{
for (int i = 0; i console.write(myrowview [i] + /t);
console.writeline();
}
trackback: http://tb.blog.csdn.net/trackback.aspx?postid=1440589
以下为oracle方面的内容补充:
oracle段:
首先在oracle建立package和package body,将在这里面定义函数和存储过程返回结果集。
1:建立package:
create or replace package scott.pk_wt
is
type mytype is ref cursor;
procedure p_wt(mycs out mytype);
function f_get(str in varchar2)
return varchar2;
end;
/
说明:其实package只是个声明罢了。我们在这里定义了一个存储过程返回结集和一个函数,返回字符串。
2:建立package body:
create or replace package body scott.pk_wt
is
procedure p_wt(mycs out mytype)
is
begin
open mycs for select * from test;
end p_wt;
function f_get(str varchar2)
return varchar2
is
str_temp varchar2(100) := 'good luck!';
begin
str_temp := str_temp || str;
return str_temp;
end f_get;
end pk_wt;
/
说明:这里建立package body是具体的说明和使用,将采用什么方式实现。。
c#段:
在c#中代码将分为两部分,一部分是使用函数,另外一部分是使用结果集。
定义一个连接,从webconfig里去取得:
private oracleconnection orcn=new oracleconnection(system.configuration.configurationsettings.appsettings[scott]);
c#调用oracle函数:
oraclecommand cmd=new oraclecommand(pk_wt.f_get,orcn);
cmd.commandtype=commandtype.storedprocedure;
oracleparameter p1=new oracleparameter(str,oracletype.varchar,10);
p1.direction=system.data.parameterdirection.input;
p1.value=this.textbox1.text;
oracleparameter p2=new oracleparameter(result,oracletype.varchar,100);
p2.direction=system.data.parameterdirection.returnvalue;
cmd.parameters.add(p1);
cmd.parameters.add(p2);
orcn.open();
cmd.executenonquery();
orcn.close();
this.button_function.text=p2.value.tostring();
其中result是系统自定义的函数返回变量,特别要注意的是,函数的参数的返回类型要指定,另外就是command类型也需要指定,另外和一般的存储过程没什么差别。
c#调用oracle返回结果集:
oraclecommand cmd=new oraclecommand(pk_wt.p_wt,orcn);
cmd.commandtype=commandtype.storedprocedure;
oracleparameter p1=new oracleparameter(mycs,oracletype.cursor);
p1.direction=system.data.parameterdirection.output;
cmd.parameters.add(p1);
oracledataadapter da=new oracledataadapter(cmd);
dataset ds=new dataset();
da.fill(ds,test);
this.datagrid1.datasource=ds;
this.datagrid1.databind();
创建oracle存储过程
=====================================================================================================
oracle package // create oracle package on the oracle server
-------------------------------------------------------
create or replace package curspkg as
type t_cursor is ref cursor;
procedure open_one_cursor (n_empno in number,
io_cursor in out t_cursor);
procedure open_two_cursors (empcursor out t_cursor,
deptcursor out t_cursor);
end curspkg;
-------------------------------------------------------
oracle package body //create oracle package body on the oracle server
-------------------------------------------------------
create or replace package body curspkg as
procedure open_one_cursor (n_empno in number,
io_cursor in out t_cursor)
is
v_cursor t_cursor;
begin s
then
open v_cursor for
select emp.empno, emp.ename, dept.deptno, dept.dname
from emp, dept
where emp.deptno = dept.deptno
and emp.empno = n_empno;
else
open v_cursor for
select emp.empno, emp.ename, dept.deptno, dept.dname
from emp, dept
where emp.deptno = dept.deptno;
end if;
io_cursor := v_cursor;
end open_one_cursor;
procedure open_two_cursors (empcursor out t_cursor,
deptcursor out t_cursor)
is
v_cursor1 t_cursor;
v_cursor2 t_cursor;
begin
open v_cursor1 for select * from emp;
open v_cursor2 for select * from dept;
empcursor := v_cursor1;
deptcursor := v_cursor2;
end open_two_cursors;
end curspkg;
/
=====================================================================================================
sqldataadapter使用存储过程的示例代码(一)
datatable cmicdt=new datatable();
sqlcommand cmiccmd=new sqlcommand(getdatemoney,tempcn);
cmiccmd.commandtype=commandtype.storedprocedure;
cmiccmd.parameters.add(new sqlparameter(@starttime,sqldbtype.datetime));
cmiccmd.parameters[@starttime].value=tempstarttime;
cmiccmd.parameters.add(new sqlparameter(@endtime,sqldbtype.datetime));
cmiccmd.parameters[@endtime].value=tempendtime;
sqldataadapter cmicda=new sqldataadapter(cmiccmd);
cmicda.fill(cmicdt);
--------------------------------------------------------------------------------
sqldataadapter使用存储过程示例(二)
===========================================================
public dataset getproduct(int smallclassid)
{
sqlconnection myconnection = new sqlconnection(configurationsettings.appsettings[connectionstring]);
sqldataadapter mydataadapter = new sqldataadapter(getproduct,myconnection);
mydataadapter.selectcommand.commandtype = commandtype.storedprocedure;
sqlparameter mysmallclassid = new sqlparameter(@smallclassid,sqldbtype.int,4);
mysmallclassid.value = smallclassid;
mydataadapter.selectcommand.parameters.add(mysmallclassid);
dataset myproduct = new dataset();
mydataadapter.fill(myproduct);
return myproduct;
}
--------------------------------------------------------------------------------
oracledataadapter执行存储过程示例(三)
====================================================================
oracleconnection conn = new oracleconnection(data source=oracle8i;integrated security=yes);
conn.open;
oraclecommand cmd = conn.createcommand();
cmd.commandtext = sp_pkg.getdata;
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add(new oracleparameter(a1, oracletype.cursor)).direction = parameterdirection.output;
cmd.parameters.add(new oracleparameter(a2, oracletype.cursor)).direction = parameterdirection.output;
dataset ds = new dataset();
oracledataadapter adapter = new oracledataadapter(cmd);
adapter.fill(ds);
