Копирование реляционных данных от базы данных до базы данных

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
5
задан Kevin Fairchild 17 November 2008 в 21:43
поделиться

11 ответов

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

Наборы данных сделают довольно легким циклично выполниться через данные иерархически и обновить PKs от базы данных после того, как вставят.

0
ответ дан 15 December 2019 в 06:38
поделиться

Я думаю утилита SQL Server, tablediff.exe мог бы быть тем, что Вы ищете.

См. также этот поток.

2
ответ дан 15 December 2019 в 06:38
поделиться

Выведите подход XML и используйте мастер импорта / SSIS.

0
ответ дан 15 December 2019 в 06:38
поделиться

Во-первых, позвольте мне сказать, что SSIS является Вашим лучшим выбором. Но, для ответа на вопрос Вы спросили...

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

Лучшее, которое можно получить, каждый вставляет оператор для таблицы. Вот пример кода, чтобы сделать SELECTs для получения Вас данные из Вашего Образца XML:

declare @xml xml 
set @xml='<People Key="1" FirstName="Bob" LastName="Smith">
  <PeopleAddresses PeopleKey="1" AddressesKey="1">
    <Addresses Key="1" Street="123 Main" City="St Louis" State="MO" ZIP="12345" />
  </PeopleAddresses>
</People>
<People Key="2" FirstName="Harry" LastName="Jones">
  <PeopleAddresses PeopleKey="2" AddressesKey="2">
    <Addresses Key="2" Street="555 E 5th St" City="Chicago" State="IL" ZIP="23456" />
  </PeopleAddresses>
</People>
<People Key="3" FirstName="Sally" LastName="Smith">
  <PeopleAddresses PeopleKey="3" AddressesKey="1">
    <Addresses Key="1" Street="123 Main" City="St Louis" State="MO" ZIP="12345" />
  </PeopleAddresses>
</People>
<People Key="4" FirstName="Sara" LastName="Jones">
  <PeopleAddresses PeopleKey="4" AddressesKey="2">
    <Addresses Key="2" Street="555 E 5th St" City="Chicago" State="IL" ZIP="23456" />
  </PeopleAddresses>
</People>
'

select t.b.value('./@Key', 'int') PeopleKey,
    t.b.value('./@FirstName', 'nvarchar(50)') FirstName,
    t.b.value('./@LastName', 'nvarchar(50)') LastName
from @xml.nodes('//People') t(b)

select t.b.value('../../@Key', 'int') PeopleKey,
    t.b.value('./@Street', 'nvarchar(50)') Street,
    t.b.value('./@City', 'nvarchar(50)') City,
    t.b.value('./@State', 'char(2)') [State],
    t.b.value('./@Zip', 'char(5)') Zip
from 
@xml.nodes('//Addresses') t(b)

То, что это делает, является Узлами взятия от XML и синтаксического анализа данные. Для получения реляционного идентификатора от людей, мы используем../../для восстановления работоспособности цепочки.

1
ответ дан 15 December 2019 в 06:38
поделиться

Безусловно самым легким путем являются Данные SQL Красного Логического элемента, Выдерживают сравнение. Можно настроить его, чтобы сделать, что Вы описали за минуту или два.

0
ответ дан 15 December 2019 в 06:38
поделиться

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

Если перекрестная база данных серверы, queries/linked являются опцией, Вы могли бы сделать это с хранимой процедурой, которая копирует записи с родителя/ребенка в DB во временные таблицы на DB B и затем добавляет столбец для нового первичного ключа во временной дочерней таблице, что Вы обновили бы после вставки заголовков.

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

0
ответ дан 15 December 2019 в 06:38
поделиться

Я создал то же самое с рядом хранимых процедур.

База данных B будет иметь свои собственные первичные ключи, но сохранит первичные ключи A Базы данных, для того, чтобы отладить цели. Это означает, что у меня может быть больше чем одна База данных A!

Данные копируются через связанный сервер. Не слишком быстро; SSIS быстрее. Но SSIS не для новичков, и не легко кодировать что-то, что работает с изменением исходных таблиц.

И легко назвать хранимую процедуру от C#.

0
ответ дан 15 December 2019 в 06:38
поделиться

Вы очищаете конечные таблицы каждый раз и затем запускаетесь снова? Это будет иметь большое значение к решению, которое необходимо реализовать. При выполнении полного переимпорта каждый раз затем, Вы могли бы сделать что-то как следующее:

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

Вставьте данные родительской таблицы в место назначения и используйте ВЫХОДНОЙ пункт, чтобы получить новый идентификатор и вставить их со старыми идентификаторами во временную таблицу.Примечание: Используя вывод пункт эффективен и позволяет Вам делать вставку оптом, не циклически повторяясь через каждую запись, которая будет вставлена.

Вставьте данные дочерней таблицы. Соедините с временной таблицей для получения нового требуемого внешнего ключа.

Вышеупомянутый процесс мог быть сделан с помощью Сценария T-SQL, кода C# или SSIS. Мое предпочтение было бы для SSIS.

0
ответ дан 15 December 2019 в 06:38
поделиться

Я написал бы сценарий его в Хранимой процедуре, использование Вставляет, чтобы сделать тяжелую работу. Ваш код возьмет PKs от Таблицы A (по-видимому, через @@ Scope_Identity) - я предполагаю, что PK для Таблицы A является полем Identity?

Вы могли использовать временные таблицы, курсоры, или Вы могли бы предпочесть использовать CLR - он мог бы предоставить себя этому виду операции.

Я был бы удивлен найти инструмент, который мог сделать это с полки с любой a) предопределенные ключи, или b) поля идентификационных данных (ясно Tables B & C не имеют их).

0
ответ дан 15 December 2019 в 06:38
поделиться

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

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

0
ответ дан 15 December 2019 в 06:38
поделиться

При контакте с подобными задачами я просто создал ряд хранимых процедур, чтобы сделать задание.

Поскольку задача, которую Вы указали, является довольно пользовательской, Вы вряд ли найдете "готовыми использовать" решение.

Только дать Вам некоторые подсказки:

  • Если базы данных находятся на различных связанных серверах использования серверов, таким образом, можно получить доступ и к исходным и конечным таблицам просто через TSQL

В хранимой процедуре:

  • Определите родительские элементы, которые должны быть скопированы - Вы сказали, что первичные ключи отличаются, таким образом, необходимо использовать ограничения на уникальность данных вместо этого (необходимо смочь определить их, если таблицы нормализованы),
  • Определите дочерние объекты, которые должны быть скопированы на основе определенных родителей, чтобы проверить, находятся ли некоторые из них уже в целевом употреблении дб, ограничения на уникальность данных приближаются снова
  • Определите объекты внука (та же логика как с родительским ребенком)
  • Данные копии по запуску с самого низкого уровня (внуки, дети, родители)

Нет никакой потребности в курсорах и т.д., просто сохраните непосредственные результаты во временной таблице (или табличная переменная при работе в рамках одной хранимой процедуры)

Тот подход работал на меня вполне прилично.

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

Сообщите мне, имеет ли это какую-либо справку.

0
ответ дан 15 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: