2009-02-18 5 views
1

Мы создали приложение, которому требуется локальная копия таблицы из другой базы данных. Я хотел бы написать процедуру ado.net, которая будет поддерживать локальную таблицу в синхронизации с мастером. Использование .net 2.0, C# и ADO.NET.
Обратите внимание, что я действительно не контролирую основную таблицу, которая находится в стороннем приложении, в котором я не хочу общаться.Ведение локальной копии таблицы из таблицы внешней базы данных, ADO.NET

Например Здесь есть основные данные таблицы:

ProjectCodeId Varchar(20) [PK] 
ProjectCode  Varchar(20) 
ProjectDescrip Varchar(50) 
OtherUneededField int 
OtherUneededField2 int 

Локальная таблица мы должны держать в синхронизации ...

ProjectCodeId Varchar(20) [PK] 
ProjectCode  Varchar(20) 
ProjectDescrip Varchar(50) 

Возможно, лучший подход к этому вопросу является то, что у вас сделанные в прошлом для этого типа проблемы? Что лучше всего сработало для вас или его следует избегать любой ценой?

Моя цель с этим вопросом - определить хороший способ справиться с этим. Поэтому я часто объединяю данные из двух или более несвязанных источников данных. По этой причине я не включил платформы баз данных, это действительно не имеет значения. В этой текущей ситуации обе базы данных являются MSSQL, но я предпочитаю, чтобы решение не использовало связанные базы данных или DTS и т. Д.

Уверен, усечение локальной таблицы и ее повторное наполнение каждый раз от мастера является опцией, но с тысячами строк Я не думаю, что это очень эффективно. Вы?

ответ

0

Я бы нажал в том направлении, в котором приложение, в которое вставляются данные, будет вставляться в одну таблицу db/table, а другую в ту же функцию. Заставьте приложение выполнить работу, db будет нажата уже.

+0

Я не думаю, что вы поняли мой вопрос/запрос. Мне нужно сохранить локальную копию таблицы, расположенной в другой базе данных. Мое приложение должно выполнить эту работу, я должен создать код для этого. Спасибо, что нашли время подать. – Brettski

0

Некоторые вопросы - какая платформа db? как вы используете данные?

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

Если у вас чертовски много данных, накладные расходы для этого должны быть довольно маленькими.

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

+0

Локальная таблица - это SQL, но мастер - это другой источник данных. Перезагрузка таблицы каждый раз является вариантом, но с тысячами строк непрактична. Меня интересовал бы ваш «экзотический» подход. Спасибо за ответ. – Brettski

+0

Из вашей структуры это не похоже, что мастер дает вам много данных для работы, поэтому синхронизация даже не кажется вариантом. В любом случае - 1000 строк не на самом деле так много, чтобы снести. Может быть, вы не хотите делать это каждый раз, когда вы используете данные, но каждые 10 минут или около того было бы хорошо. – nailitdown

+0

Возможно, это лучший вариант, и я просто передумал это или искал эту неизвестную функцию ado.net, чтобы сделать работу :) Спасибо, что обратились к нам. – Brettski

0

Можете ли вы использовать репликацию SQL? Это было бы предпочтительнее писать код, чтобы сделать это нет?

+0

Предпочтительный, уверенный; но это требование за пределами базы данных. Благодарю за ваш ответ. – Brettski

1

EDIT: Во-первых, признайте, что то, что вы делаете, это ручная репликация, а репликация никогда не бывает простой. Вам необходимо отслеживать и применять все изменения состояния CRUD. Тем не менее, ADO.NET может это сделать.

Для отслеживания изменений в источнике вы можете использовать уведомление о запросах с исходной базой данных. Это требует специального разрешения для базы данных, поэтому владельцу исходной базы данных необходимо будет принять меры для включения этого решения. Я не использовал эту технику самостоятельно, но вот описание ее.

См "уведомления Query Notifications in SQL Server (ADO.NET)"

Запрос были введены в Microsoft SQL Server 2005 и пространство имен System.Data.SqlClient в ADO.NET 2.0. Построено на основе сервиса Инфраструктура брокера, запрос уведомления позволяют приложениям быть уведомлены, когда данные были изменены. Эта функция особенно полезна для приложений, которые обеспечивают кэш информации из базы данных, таких как веб-приложением, и должны быть уведомление, когда исходные данные изменились.

Чтобы применить изменения из таблицы источника БД вам необходимо извлечь данные из таблицы БД целевой, применить изменения целевых строк и после изменения обратно в целевой БД.

Чтобы применить изменения, вы можете либо 1) Удалить и повторно вставить все строки (простые), или 2) Слияние последовательно-строчных изменений (жестких).

Удалить и повторно вставить пояснительную записку, поэтому я не буду подробно разбираться в этом.

Для отслеживания изменений строки за строкой здесь используется подход. (Я предполагаю, что здесь Query Notification не дает информации об изменении строка за строкой, так что вы должны вычислить его.)

  • Вам нужно определить, какие строки были изменены и идентифицировать вставленные и удаленные строки. Создайте DataView с сортировкой для каждой таблицы, чтобы получить метод Find, который вы можете использовать для поиска совпадающих строк по ID.
  • Определите измененные строки, используя столбец datetime/timestamp, или сравнив все значения полей. Скопируйте измененные значения в целевую строку.
  • Идентифицируйте добавленные и удаленные строки, перейдя по соответствующей таблице DataViews и используя метод Find другого DataView для идентификации строк, которые не отображаются в первой таблице. Вставьте или удалите строки из целевой таблицы по мере необходимости. (Метод Delete не удаляет строку, но помечает ее для удаления с помощью обновления TableAdapter.)

    Удачи!

+ Том

Смежные вопросы