.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#
*/
- .Net的DataSet直接与SQL2005交互
- Net的DataSet直接与SQL2005交互
- DataSet与XML的交互
- ADO.NET访问数据-(2) DataSet本地缓存与数据库的交互过程,以及应用
- Flex使用Weborb与.NET交互的问题:使用DataSet出现"提供的索引超出范围"异常
- .net网站与sql2005的连接方法
- 【C#属性理解】--与SQL交互用到的 【DataSet】相关
- net[datatable与dataset]
- ASP.NET中把xml转为dataset与xml字符串转为dataset及dataset转为xml的代码
- [VB.NET]dataset 与xml
- .Net 中DataSet和DataTable的 区别与联系
- ASP.NET中DataTable与DataSet之间的转换
- ASP.NET中DataTable与DataSet之间的转换
- (ASP.NET)DataTable与Dataset的互相转换
- .Net 中DataSet和DataTable的 区别与联系
- javascript 与 asp.net 的交互
- javascript 与 asp.net 的交互
- javascript与asp.net的交互
- 工作备忘录
- 无缝的缓存读取:双存储缓存策略
- bochuxt的JAVA自学之路
- 丶杂绪丨
- 广电总局太强了
- .Net的DataSet直接与SQL2005交互
- [Windows编程] 监视DLL装载/卸载
- 浏览器的几个感悟
- 双管道实现进程数据通信
- 什么是泛型编程——Generic Programming
- 微软抠动扳机,对手应声倒下
- ORACLE分页存储过程
- 09年最新的最有才的100句话,不服不行!!
- 理解JavaScript的caller,callee,call,apply