• .Net的DataSet直接与SQL2005交互


    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#

     

    */

  • 相关阅读:
    COM组件
    【游戏引擎架构】入门(一)
    UNICODE字符串
    Python随笔10
    Python随笔9-函数
    Python随笔7
    Python随笔6
    Python随笔5
    Python随笔4
    Python随笔3
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204844.html
Copyright © 2020-2023  润新知