Как определить, имеет ли таблица столбец идентификационных данных

Следует отметить две вещи:

  1. Оператор import не влияет на поведение класса во время выполнения. Никакой код не генерируется для оператора импорта. И если вы просто импортируете класс A в класс B, то загрузка класса B не приводит к загрузке класса A.

  2. Время загрузки класса и время инициализации класса различаются.

Жизненный цикл класса заключается в том, что он загружается, связывается и инициализируется перед использованием (см. Глава 12 JLS ).

  • Загрузка выполняется загрузчиком классов и включает в себя поиск файла класса, чтение его в byte[] и вызов ClassLoader::defineClass.

  • Связывание выполняется с помощью основного кода JVM и состоит из проверки, подготовки и разрешения символических ссылок. В JLS 12.3 говорится следующее:

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

    blockquote>

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

  • Инициализация происходит после того, как все соответствующие классы были связаны. В соответствии с JLS 12.4.1 :

    Класс T или интерфейсный тип T будут инициализированы непосредственно перед первым появлением любого из следующего:

      [ 1145] T является классом, и создается экземпляр T.
    • Вызывается статический метод, объявленный T.
    • Статическое поле, объявленное T, присваивается.
    • Используется статическое поле, объявленное T, и поле не является постоянной переменной (§4.12.4).
    blockquote>

Согласно JLS (см. Выше), мы не можем точно сказать, когда B будет загружен и связан. Все, что мы можем сказать, это то, что это происходит до инициализации B ... если она инициализирована. (Вы можете получить представление о порядке загрузки классов, включив некоторые журналы JVM. Однако, порядок может варьироваться в зависимости от поставщика и версии JVM.)

В соответствии с инициализацией JLS (см. Выше) [115 ] будет происходить (обычно), когда первый экземпляр B создается вашим методом main. Предполагая, что object в вашем Вопросе было инициализировано для экземпляра B, инициализация уже произошла до теста instanceof. Если нет, то B не будет инициализирован тестом instanceof.

На первый взгляд, нет необходимости загружать класс A. (Это зависит от того, действительно ли и как класс B использует класс A, и от того, как / как другие части вашей кодовой базы используют A.)

29
задан Pranay Rana 4 May 2012 в 18:45
поделиться

4 ответа

Я знаю, что это давно, но я нашел это полезным

, попробуйте это:

IF EXISTS (SELECT * from syscolumns where id = Object_ID(@TABLE_NAME) and colstat & 1 = 1)
BEGIN
   -- Do your things
END
14
ответ дан Wahid Bitar 28 November 2019 в 01:17
поделиться
IF (OBJECTPROPERTY(OBJECT_ID('TABLE_NAME'), 'TableHasIdentity') = 1) 

ObjectProperty доступен начиная с SQL Server 2008 Ссылка: OBJECTPROPERTY

9
ответ дан DiskJunky 28 November 2019 в 01:17
поделиться

Один из способов сделать это - использовать хранимую процедуру sp_help. I.e:

sp_help MyTable

Это вернет DataSet, в котором есть вся необходимая информация на столе. Существует конкретная таблица, в которой есть информация о личности.

Т.е.:

Если оно не содержит поле идентификатора, столбец Идентичности скажет: «Столбец идентификации не определен».

3
ответ дан Kyle Rozendo 28 November 2019 в 01:17
поделиться

Это запрос, который возвращает имя столбца identity;

create procedure GetIdentity 
@tablename varchar(50)
begin
    SELECT   OBJECT_NAME(OBJECT_ID) AS TABLENAME, 
             NAME AS COLUMNNAME, 
             SEED_VALUE, 
             INCREMENT_VALUE, 
             LAST_VALUE, 
             IS_NOT_FOR_REPLICATION 
    FROM     SYS.IDENTITY_COLUMNS 
    WHERE OBJECT_NAME(OBJECT_ID) = @tablename
end

Затем сформируйте код.

Вызовите эту хранимую процедуру, используя роль datareader, затем проверьте datareader.hasrows(). Если значение условия истинно (1), то таблица имеет столбец identity, если он установлен. Если нет, то столбец идентичности отсутствует.

21
ответ дан 28 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

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