Лучший способ загрузить записи таблицы SQL Server из базы данных и отправить их через вызов WCF - PullRequest
1 голос
/ 01 декабря 2011

В основном мне нужно переместить таблицы базы данных с одного компьютера на другой.

ВАЖНО: сервер доступен ТОЛЬКО через WCF, поэтому я не могу использовать зеркальное отображение SQL Server или другие методы прямого SQL Server.

Мне нужно загрузить всю таблицу на клиенте и подготовить ее, чтобы я мог оптимизировать ее отправку через WCF.

Клиент (и сервер) основаны на C #, и я мог бы использовать любую технику, доступную на клиенте (EF4, Linq2SQL ...), для загрузки и подготовки данных.

На сервере я также использую C #, но могу получать строки таблицы только через WCF.

Еще раз, я могу получить доступ к серверу только через WCF, поэтому в настоящее время другие опции недоступны.

Вопросы:
1) Итак, как лучше всего загрузить эти таблицы в клиент и подготовить их к вызову WCF?

2) И что более важно, что бы параметры WCF передавали записи таблицы .. как бы выглядели ??

Спасибо.

Ответы [ 4 ]

1 голос
/ 01 декабря 2011

Если вы не можете использовать какие-либо методы работы с базами данных, возможно, оптимальным вариантом будет сделать это порциями, используя аргументы TAKE и SKIP linq с Entity Framework.

Но на самом деле, если бы требовалось копировать таблицы, я бы серьезно посмотрел на использование инструментов базы данных (для Sql Server - BCP) и переместил данные в файл, а затем в промежуточную таблицу на другом сервере. , Затем используйте MERGE для перемещения данных из промежуточного этапа в рабочий.

1 голос
/ 01 декабря 2011

На самом деле неважно, как вы получаете данные из БД - используйте все, что быстро и легко, например, предварительно скомпилированный запрос Linq to SQL или обычный ADO.Net.

( РЕДАКТИРОВАТЬ: Или выгрузить его в файл, как упомянуто @Джон Рейнор)

Если у вас есть очень большие объемы данных для перемещения, я бы в первую очередь рассмотрел потоковую передачу, а не стандартную буферизацию WCF (возможно, только для начальной передачи - зависит от размера данных) Это позволит избежать чрезмерного использования ресурсов клиентом и сервером, поскольку им не придется буферизовать все данные за один раз.

Хорошее руководство по потоковой передаче с WCF здесь:

http://msdn.microsoft.com/en-us/library/ms733742.aspx

Если брандмауэры не являются проблемой, вы должны использовать TCP вместо HTTP, поскольку он более компактен.

Другая вещь, которую следует учитывать, - это тип используемой кодировки. Поскольку вы контролируете обе стороны системы (клиента и сервера), вы можете использовать двоичную кодировку. Стандартный .Net в порядке, но если вы можете потратить немного денег, я нашел кодировку Fast Infoset от noemax отличной.

http://www.noemax.com/products/fastinfoset/index.html

0 голосов
/ 01 декабря 2011

WCF может сериализовать System.Data.DataTable.Вы можете в основном:

[ServiceContract]
public interface ITableReader
{
  [OperationContract]
  DataTable GetTable();
}

И прочитать всю таблицу в DataTable с ADO.NET.

Если таблицы действительно большие, вы можете разбить их на несколько калполучить куски таблицы, но WCF не будет иметь проблем с отправкой обратно пару десятков мегабайт в случае необходимости.Вам просто нужно увеличить размеры сообщений в конфигурации привязки.

0 голосов
/ 01 декабря 2011

Ну, EF - рекомендованный Microsoft метод доступа к данным.Вы можете использовать linq для сущностей, чтобы выполнить запрос к ef без каких-либо условий и вернуть его в ваш метод WCF.Хотя я должен это сказать, и это немного очевидно, чем больше записей в вашей таблице, тем медленнее будет работать служба WCF, поскольку все данные должны быть сериализованы.

Вот ссылка, которая может помочь вам начать работать с EF и WCF вместе

http://msdn.microsoft.com/en-us/magazine/ee336128.aspx

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