代码之家  ›  专栏  ›  技术社区  ›  VarunGupta

.NET在最少的查询数中保持多个对象

  •  0
  • VarunGupta  · 技术社区  · 14 年前

    我有一个需要持久化到SQL Server数据库表中的对象列表,其中每个对象都作为单个记录持久化。例如,对象列表导致插入多个记录。

    保存对象的简单方法是循环列表,并为保存该记录而触发查询/存储过程等。但这会导致多个数据库交互。

    有没有一种方法可以在较少的数据库交互中保持对象列表?

    4 回复  |  直到 14 年前
        1
  •  2
  •   gbn    14 年前

    具有多个XML(2005)或表值(2008)参数的单个存储过程

    这就是我们要做的(2005年)

    来自Erland Sommarskog的最终文章 2005 2008

        2
  •  1
  •   Matt Hamilton    14 年前

    您使用的是SQL Server 2008吗?你可以使用 table-valued parameters 将一组值(行)传递给单个参数中的命令。

        3
  •  0
  •   TomTom    14 年前

    即使不这样做,您也可以将多个SQL语句放入一个调用中(即批处理)。没有什么能阻止您使用30-60 opr,甚至更普通的insert语句,并将它们立即提交到SQL Server。SQL字符串可以很大——其中一个字符串中可以有多个语句。

    这里的诀窍是通过往返减少延迟。即呼叫/等待应答对。表值参数和“批处理”都可以做到这一点。

        4
  •  0
  •   Mike    14 年前

    我过去所做的,如果对象是可序列化的,而您的SQL Server是2005或更高版本,那么使用XML可序列化,然后将对象保存在XML字段中。如果要将对象分解为Indivual记录,则仍可以传入XML并使用XML进行查询。

    例如

    DECLARE @X XML 
    
    SET @X ='<ListOfEmployees>
    <Employee ID="5">
    <Name>Mike</Name>
    <Salary>67000</Salary>
    </Employee> 
    <Employee ID="6">
        <Name>Bob</Name>
        <Salary>40000</Salary>
    </Employee> 
    </ListOfEmployees>'
    
    
    SELECT 
    T.c.value('Name[1]', 'varchar(50)'), -- The [1] tells Sql get the first Node Name     under the ListOfEmployees/Employee mandatory
    T.c.value('Salary[1]','money'),
    T.c.value('@ID','int')
    FROM @X.nodes('ListOfEmployees/Employee') T(c)
    

    功能节点和值区分大小写

    将对象转换为XML

     XmlSerializer x = new XmlSerializer(classObject.GetType());
            MemoryStream stream = new MemoryStream();
            x.Serialize(stream, classObject);
    
            return Encoding.ASCII.GetString(stream.ToArray());
    

    所有列表实际上都将转换为<arrayof classname>所有其他变量都将是属性名