.Net的DataSet直接与SQL2005交互

来源:互联网 发布:淘宝改后台是什么意思 编辑:程序博客网 时间:2024/05/01 11:55

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)'

 fromsyscolumns 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

 

/********测试存储过程功能:追加、更新两个功能**/

 

--测试环境:MicrosoftSQL 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#

 

*/