现在的位置: 首页 > 综合 > 正文

Net的DataSet直接与SQL2005交互

2014年09月08日 ⁄ 综合 ⁄ 共 2611字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.