.NET | Сохранять несколько объектов в минимальном количестве запросов - PullRequest
0 голосов
/ 02 апреля 2010

У меня есть список объектов, которые необходимо сохранить в таблице базы данных SQL Server, где каждый объект сохраняется как отдельная запись. то есть список объектов приводит к вставке нескольких записей.

Тривиальным способом сохранения объектов является циклический перебор списка и запуск запроса / хранимой процедуры / и т.д. для сохранения этой записи. Но это приводит к нескольким взаимодействиям с базой данных.

Есть ли способ сохранить список объектов при меньшем количестве взаимодействий с базой данных?

Ответы [ 4 ]

2 голосов
/ 02 апреля 2010

Один сохраненный процесс с несколькими параметрами XML (2005) или табличного значения (2008)

Это то, что мы делаем (2005)

Основные статьи Эрланда Соммарскога для 2005 и 2008

1 голос
/ 02 апреля 2010

Используете ли вы SQL Server 2008? Вы можете использовать табличные параметры для передачи набора значений (строк) в команду в одном параметре.

0 голосов
/ 02 апреля 2010

То, что я делал в прошлом, если объект сериализуемый, а ваш sql-сервер 2005 или более поздней версии, это использовать xml Serializable, а затем сохранить объект в поле xml.Если вы хотите разбить объект на отдельные записи, вы все равно можете передать 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());

Весь список будет фактически переведен каквсе остальные ваши переменные будут именами свойств

0 голосов
/ 02 апреля 2010

Даже не делая этого, вы можете поместить несколько SQL-операторов в один вызов (т.е. пакет). Ничто не мешает вам использовать 30-60 или даже более нормальные операторы INSERT и сразу же отправлять их на SQL Server. Строки SQL могут быть большими, и в одном из них может быть несколько операторов.

Хитрость в том, чтобы уменьшить задержку за счет круговых поездок. То есть вызов / ожидание пар ответа. Табличные значения Параметры, а также «пакетная обработка» делают это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...