Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Я думаю, скорее всего, что я собираюсь использовать, введенные наборы данных. Это не будет обобщенное решение; мы должны будем повторно создать их, если какая-либо из таблиц изменяется. Но на основе того, что мне сказали, это не проблема; таблицы, как ожидают, не изменятся очень.
Наборы данных сделают довольно легким циклично выполниться через данные иерархически и обновить PKs от базы данных после того, как вставят.
Я думаю утилита SQL Server, tablediff.exe мог бы быть тем, что Вы ищете.
См. также этот поток.
Выведите подход XML и используйте мастер импорта / SSIS.
Во-первых, позвольте мне сказать, что SSIS является Вашим лучшим выбором. Но, для ответа на вопрос Вы спросили...
Я не полагаю, что Вы сможете сойти с рук создание нового идентификатора все вокруг, хотя Вы могли, но Вы должными быть взять исходные идентификаторы для использования для поисков.
Лучшее, которое можно получить, каждый вставляет оператор для таблицы. Вот пример кода, чтобы сделать SELECT
s для получения Вас данные из Вашего Образца 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 и синтаксического анализа данные. Для получения реляционного идентификатора от людей, мы используем../../для восстановления работоспособности цепочки.
Безусловно самым легким путем являются Данные SQL Красного Логического элемента, Выдерживают сравнение. Можно настроить его, чтобы сделать, что Вы описали за минуту или два.
Я люблю SQL Красного Логического элемента, Выдерживают сравнение, и Данные Выдерживают сравнение также, но он не будет отвечать его требованиям для изменяющихся первичных ключей насколько я могу сказать.
Если перекрестная база данных серверы, queries/linked являются опцией, Вы могли бы сделать это с хранимой процедурой, которая копирует записи с родителя/ребенка в DB во временные таблицы на DB B и затем добавляет столбец для нового первичного ключа во временной дочерней таблице, что Вы обновили бы после вставки заголовков.
Мой вопрос состоит в том, если записи не имеют того же первичного ключа, как Вы говорите, является ли это новая запись? Есть ли некоторый другой ключ-кандидат? Если это новые таблицы, почему у них не может быть того же первичного ключа?
Я создал то же самое с рядом хранимых процедур.
База данных B будет иметь свои собственные первичные ключи, но сохранит первичные ключи A Базы данных, для того, чтобы отладить цели. Это означает, что у меня может быть больше чем одна База данных A!
Данные копируются через связанный сервер. Не слишком быстро; SSIS быстрее. Но SSIS не для новичков, и не легко кодировать что-то, что работает с изменением исходных таблиц.
И легко назвать хранимую процедуру от C#.
Вы очищаете конечные таблицы каждый раз и затем запускаетесь снова? Это будет иметь большое значение к решению, которое необходимо реализовать. При выполнении полного переимпорта каждый раз затем, Вы могли бы сделать что-то как следующее:
Составьте временную таблицу или табличную переменную для записи старых и новых первичных ключей для родительской таблицы.
Вставьте данные родительской таблицы в место назначения и используйте ВЫХОДНОЙ пункт, чтобы получить новый идентификатор и вставить их со старыми идентификаторами во временную таблицу.Примечание: Используя вывод пункт эффективен и позволяет Вам делать вставку оптом, не циклически повторяясь через каждую запись, которая будет вставлена.
Вставьте данные дочерней таблицы. Соедините с временной таблицей для получения нового требуемого внешнего ключа.
Вышеупомянутый процесс мог быть сделан с помощью Сценария T-SQL, кода C# или SSIS. Мое предпочтение было бы для SSIS.
Я написал бы сценарий его в Хранимой процедуре, использование Вставляет, чтобы сделать тяжелую работу. Ваш код возьмет PKs от Таблицы A (по-видимому, через @@ Scope_Identity) - я предполагаю, что PK для Таблицы A является полем Identity?
Вы могли использовать временные таблицы, курсоры, или Вы могли бы предпочесть использовать CLR - он мог бы предоставить себя этому виду операции.
Я был бы удивлен найти инструмент, который мог сделать это с полки с любой a) предопределенные ключи, или b) поля идентификационных данных (ясно Tables B & C не имеют их).
Если Вы добавляете каждый раз затем, Вы, возможно, должны сохранить постоянную таблицу для отслеживания отношений между исходными первичными ключами базы данных и первичными ключами целевой базы данных (по крайней мере, для родительской таблицы). Если бы необходимо было сохранить этот вид данных из целевой базы данных, то Вы могли бы заставить SSIS хранить/получать его от некоторой базы данных входа или даже плоского файла.
Вы могли, вероятно, избежать вышеупомянутого сценария, если существует комбинация полей в родительской таблице, которая может использоваться, чтобы однозначно определить ту запись и поэтому "найти" первичный ключ для той записи в целевой базе данных.
При контакте с подобными задачами я просто создал ряд хранимых процедур, чтобы сделать задание.
Поскольку задача, которую Вы указали, является довольно пользовательской, Вы вряд ли найдете "готовыми использовать" решение.
Только дать Вам некоторые подсказки:
В хранимой процедуре:
Нет никакой потребности в курсорах и т.д., просто сохраните непосредственные результаты во временной таблице (или табличная переменная при работе в рамках одной хранимой процедуры)
Тот подход работал на меня вполне прилично.
Можно, конечно, добавить параметр к основной хранимой процедуре, таким образом, можно или скопировать все новые записи или только, которые Вы указываете.
Сообщите мне, имеет ли это какую-либо справку.