DataSet在无适配器的情况下需要与SQL2005数据库交互,可以通过SQL语句分解DataSet序列化之后的xml来生成查询结果集,然后去批量更新或者追加数据。
测试代码如下
--------------------------------------------------------------------------------
if object_id ( 'test_proc' ) is not null drop proc test_proc
go
create proc [dbo]. test_proc(
@DataSetName varchar ( 256),
@DataSetNameSpace varchar ( 256),
@DataTableName varchar ( 256),
@DataSetXml xml
)
/*
转载请保留以下信息:
作者 jinjazz( 近身剪 )
感谢 liangCK ,帮我解决了 sql2005 中的 xmlns 问题
blog http://blog.csdn.net/jinjazz
*/
as
begin
-- 构建 sql 语句
declare @sql nvarchar ( max );
declare @node varchar ( max )
declare @query varchar ( max )
declare @value varchar ( max )
if nullif ( @DataSetNameSpace, '' ) is not null
set @value= N';WITH XMLNAMESPACES(DEFAULT @xmlns)'
set @value= isnull ( @value, '' )+ N'
select'
set @query= N' from(select'
set @node= N' From
@data.nodes(''/' + @DataSetName+ '/' + @DataTableName+ ''') As T(Records))T1'
select @value= @value+ '
D' + cast ( colid as varchar ( 3))+ '.data.value(''.'', ''' +(
select top 1 case when name in ( 'char' , 'varchar' , 'nchar' , 'nvarchar' , 'datetime' )
then 'varchar(8000)' else name end
from systypes where xtype= a. xtype)
+ ''') As ' + name + ',' , @query= @query+ '
T.Records.query(''' + name + ''')' + name + ',' , @node= @node+ '
outer Apply T1.' + name + '.nodes(''' + name + ''') As D' + cast ( colid as varchar ( 3))+ '(data)'
from syscolumns a where object_id ( @DataTableName)= id
set @value=left( @value, len ( @value)- 1)
set @query=left( @query, len ( @query)- 1)
set @sql= @value+ @query+ @node
-- 动态执行 sql 语句
declare @pdef nvarchar ( 500);
set @pdef= N'@data xml,@xmlns varchar(256)'
--print @sql
exec sp_executesql @sql, @pdef, @data = @DataSetXml, @xmlns= @DataSetNameSpace;
end
go
/******** 测试存储过程功能:追加、更新两个功能 **/
-- 测试环境: Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)
set nocount on
create table testTable( id int , name varchar ( 100))
go
print ( '1 、测试追加 : 批量添加两条记录 ' )
insert into testTable
exec test_proc 'DataSet' ,null, 'testTable' ,
'<DataSet>
<testTable>
<id>1</id>
<name>jinjazz</name>
</testTable>
<testTable>
<id>2</id>
<name>csdn</name>
</testTable>
</DataSet>'
select * from testTable
print ( '2 、测试更新 : 删除条已存在,添加条新的数据 ' )
declare @t table ( id int , name varchar ( 100))
insert into @t
exec test_proc 'DataSet' ,null, 'testTable' ,
'<DataSet>
<testTable>
<id>2</id>
<name>.Net</name>
</testTable>
<testTable>
<id>3</id>
<name>c#</name>
</testTable>
</DataSet>'
delete from testTable where exists( select 1 from @t where id= testTable. id)
insert into testTable select * from @t
select * from testTable
-- 删除测试环境
go
drop table testTable
set nocount off
/* 测试结果
1 、测试追加 : 批量添加两条记录
id name
----------- ----------
1 jinjazz
2 csdn
2 、测试更新 : 删除条已存在,添加条新的数据
id name
----------- --------
1 jinjazz
2 .Net
3 c#
*/
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinjazz/archive/2009/04/02/4044988.aspx