【www.gdgbn.com--面向对象编程】
.net c# datatable和dataset对象详解
a、对于1.6.1之前的版本,获得命令的方式可以通过requestscope的idbcommand属性,但是1.6.1版本的idbcommand属性返回的是ibatisnet.datamapper.commands.dbcommanddecorator对象,您可以注释代码验证一下。
b、网上有些文章贴的方法返回的dbcommand对象都是对于拼接sql语句而言,没有实现获取存储过程的dbcommand(有参数无参数的都要考虑)。本文在原有资料的基础上,尝试着做出改进,目前支持sql语句和存储过程。
///
/// 获取dbcommand,主要是针对存储过程
///
///
///
/// 参数
/// 参数字段
/// parameterdirection字典
///
///
protected virtual idbcommand getdbcommand(isqlmapper sqlmapper, string statementname, object paramobject, idictionary dictparam, idictionarydictparmdirection, commandtype cmdtype)
{
if (cmdtype == commandtype.text)
{
return getdbcommand(sqlmapper, statementname, paramobject);
}istatement statement = sqlmapper.getmappedstatement(statementname).statement;
imappedstatement maps教程tatement = sqlmapper.getmappedstatement(statementname);
isqlmapsession session = new sqlmapsession(sqlmapper);if (sqlmapper.localsession != null)
{
session = sqlmapper.localsession;
}
else
{
session = sqlmapper.openconnection();
}requestscope request = statement.sql.getrequestscope(mapstatement, paramobject, session);
mapstatement.preparedcommand.create(request, session as isqlmapsession, statement, paramobject);
idbcommand cmd = session.createcommand(cmdtype);
cmd.commandtext = request.idbcommand.commandtext;
if (cmdtype != commandtype.storedprocedure || dictparam == null)
{
return cmd;
}
foreach (dictionaryentry de in dictparam) //存储过程
{
string key = de.key.tostring();
idbdataparameter dbparam = cmd.createparameter();
dbparam.parametername = key;
dbparam.value = de.value;if (dictparmdirection != null && dictparmdirection.containskey(key))
{
dbparam.direction = dictparmdirection[key]; //parameterdirection
}
cmd.parameters.add(dbparam);
}
return cmd;
}
返回dataset对象
public dataset getdsperson(int id)
{
string sql = this.getruntimesql(this.sqlmapper, this.getstatementname("getdsperson"), id);
return this.queryfordataset(this.sqlmapper, this.getstatementname("getdsperson"), id);
}
xml配置:
客户端的调用:
int id = 1;
dataset ds = servicefactory.createpersonservice().getdsperson(id);
console.writeline(ds.getxml());
3、返回datatable对象
通过含output参数的存储过程
///
/// 查询返回datatable,对于包括output参数的存储过程同样适用
///
///
///
/// 参数
/// 参数字典
/// parameterdirection字典
/// 返回的output参数值哈希表
///
protected virtual datatable queryfordatatable(isqlmapper sqlmapper, string statementname, object paramobject, idictionary dictparam, idictionarydictparamdirection, out hashtable htoutputparameter)
{
dataset ds = new dataset();
bool issessionlocal = false;
isqlmapsession session = sqlmapper.localsession;
if (session == null)
{
session = new sqlmapsession(sqlmapper);
session.openconnection();
issessionlocal = true;
}idbcommand cmd = getdbcommand(sqlmapper, statementname, paramobject, dictparam, dictparamdirection, commandtype.storedprocedure); //存储过程
try
{
cmd.connection = session.connection;
idbdataadapter adapter = session.createdataadapter(cmd);
adapter.fill(ds);
}
finally
{
if (issessionlocal)
{
session.closeconnection();
}
}
htoutputparameter = new hashtable();
foreach (idataparameter parameter in cmd.parameters)
{
if (parameter.direction == parameterdirection.output)
{
htoutputparameter[parameter.parametername] = parameter.value;
}
}
return ds.tables[0];
}
测试的存储过程如下:
use [testdb]
go
--根据id查询某人 并返回所有人中,最大体重,最小身高
create procedure [dbo].[usp_getpersonbyid]
@maxweight float output,
@minheight float output,
@id int
as
begin
select
id,
firstname,
lastname,
weight,
height
from
person
where id=@id
set @maxweight= (select max(weight) from person)
set @minheight= (select min(height) from person)
end