@@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ после оператора INSERT всегда возвращаются 0

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

13
задан Anthony Potts 21 June 2010 в 19:26
поделиться

12 ответов

1) объедините ВСТАВКУ, и оператор SELECT (свяжите использование"";) в команду

2 на 1 дб), используют SCOPE_IDENTITY () вместо @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ

INSERT INTO blabla...; ВЫБЕРИТЕ таблицу OID FROM, ГДЕ OID = SCOPE_IDENTITY ()

- обновляет:

как оказалось, что вопрос был связан с ДОСТУПОМ MS, я нашел эта статья , которая предлагает, чтобы просто многократное использование первой команды и установка ее CommandText для "ВЫБОРА @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ" были достаточны.

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

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

В Studio управления SQL Server, можно найти это путем щелчка правой кнопкой по серверу в Обозревателе объектов, выбрать Свойства и затем перейти к странице Connections. Посмотрите на настройки для "Опций соединения по умолчанию"

0
ответ дан 1 December 2019 в 20:58
поделиться

Разве большинство отвечающих сторон не забывающий, что автор вопроса не использует SQL Server?

<забастовка>, По-видимому, Access 2000 MS и позже не поддерживает @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ . альтернатива "Использует событие RowUpdated, можно определить, произошла ли ВСТАВКА, получите последнее @@ значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ и место это в столбце идентификационных данных локальной таблицы в DataSet".

И да, это для встроенного VBA в DB Доступа. Это является все еще вызываемым за пределами Доступа через Библиотеку объектов Доступа.

Редактирование: хорошо, это поддерживается, жаль о любящем выпить раннем утреннем ответе. Но остальная часть этого ответа могла бы помочь.

0
ответ дан 1 December 2019 в 20:58
поделиться

Поскольку Вы используете Доступ, смотрите на эта статья от aspfaq, прокручиваете вниз приблизительно к половине пути ниже на страницу. Код в классическом ASP, но надо надеяться принципы должны все еще стоять.

<час>

ВЫБОР @@ Идентификационные данные заканчивают тем, что рассматривались как отдельный контекст выполнения, я верю. Код, который должен работа, был бы:

public int ExecuteInsertStatement(string statement)
{
    InitializeAndOpenConnection();

    IDbCommand cmdInsert = connection.CreateCommand();
    cmdInsert.CommandText = statement + "; SELECT @@Identity";
    object result = cmdInsert.ExecuteScalar();

    if (object == DBNull.Value)
    {
       return -1;
    }
    else
    {
       return Convert.ToInt32(result);
    }
}

Вы, вероятно, хотели бы/нуждались бы убрать конкатенацию, которая добавляет 'ВЫБОР @@ Идентификационные данные' на конец кода все же.

-1
ответ дан 1 December 2019 в 20:58
поделиться

Есть ли, кто-либо включает Вашу таблицу, которая могла бы вставлять в другие таблицы? Обычно мы отговариваемся от использования @@ Идентификационные данные в пользу IDENT_CURRENT так, чтобы можно было гарантировать, что возвращенные идентификационные данные для таблицы, в которую Вы просто вставили.

0
ответ дан 1 December 2019 в 20:58
поделиться

Я думаю, что у Вас должен быть Выбор @@, идентификационные данные с первым создают команду - пытаются добавить его через"; ВЫБЕРИТЕ @@ Идентификационные данные" и.ExecuteScalar оператор

вставки
1
ответ дан 1 December 2019 в 20:58
поделиться

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

необходимо также всегда использовать SCOPE_IDENTITY () не @@ идентификационные данные. Ссылка здесь

необходимо добавить

SELECT SCOPE_IDENTITY() 

После вставки.

4
ответ дан 1 December 2019 в 20:58
поделиться

Вы используете Струю (не SQL Server), и Струя может только обработать один SQL-оператор на команду, поэтому необходимо выполниться SELECT @@IDENTITY в отдельной команде, очевидно, удостоверившись, что это использует то же соединение в качестве INSERT.

4
ответ дан 1 December 2019 в 20:58
поделиться

Microsoft. Струя. Поставщик OLEDB.4.0 поддерживает Струю v3 и Струю v4 механизмы базы данных, однако ИЗБРАННЫЕ @@, ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ не поддерживаются для Струи v3.

MSAccess 97 является Струей v3 и не поддерживает ВЫБОР @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ; Это поддерживало на 2000 MSAccess и выше.

7
ответ дан 1 December 2019 в 20:58
поделиться

Я думаю, что @@ идентификационные данные допустимы только в пределах команды - в Вашем случае при выполнении "оператора".

Изменяют Ваш "оператор" так, чтобы сама хранимая процедура возвратилась @@ значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ прямо после оператора INSERT, и читать его как код возврата выполнения хранимой процедуры.

0
ответ дан 1 December 2019 в 20:58
поделиться

Если вы хотите получить значение автоматически выполняемого номера транзакции, которую вы вставляете, и вашей среды, следующей за 1. База данных - MsAccess. 2. Драйвер - это Jet4 с такой строкой подключения, как "Provider = Microsoft.Jet.OLEDB.4.0; Password = {0}; Data Source = {1}; Persist Security Info = True" 3. используйте Oledb

. Мой пример можно применить к вашему коду

OleDbConnection connection =  String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Password={0};Data Source={1};Persist Security Info=True",dbinfo.Password,dbinfo.MsAccessDBFile);
connection.Open();
OleDbTransaction transaction = null;
try{
    connection.BeginTransaction();
    String commandInsert = "INSERT INTO TB_SAMPLE ([NAME]) VALUES ('MR. DUKE')";
    OleDbCommand cmd = new OleDbCommand(commandInsert , connection, transaction);
    cmd.ExecuteNonQuery();
    String commandIndentity = "SELECT @@IDENTITY";
    cmd = new OleDbCommandcommandIndentity, connection, transaction);
    Console.WriteLine("New Running No = {0}", (int)cmd.ExecuteScalar());
    connection.Commit();
}catch(Exception ex){
    connection.Rollback();
}finally{
    connection.Close();
}   
0
ответ дан 1 December 2019 в 20:58
поделиться
CREATE procedure dbo.sp_whlogin
(
 @id nvarchar(20),
 @ps nvarchar(20),
 @curdate datetime,
 @expdate datetime
)

AS
BEGIN
 DECLARE @role nvarchar(20)
 DECLARE @menu varchar(255)
 DECLARE @loginid int

 SELECT     @role = RoleID
 FROM         dbo.TblUsers
 WHERE    UserID = @id AND UserPass = @ps

 if @role is not null 
 BEGIN
  INSERT INTO TblLoginLog (UserID, LoginAt, ExpireAt, IsLogin) VALUES (@id, @curdate, @expdate, 1);
  SELECT @loginid = @@IDENTITY;
  SELECT @loginid as loginid, RoleName as role, RoleMenu as menu FROM TblUserRoles WHERE RoleName = @role
 END
 else
 BEGIN
  SELECT '' as role, '' as menu
 END
END
GO
-2
ответ дан 1 December 2019 в 20:58
поделиться
Другие вопросы по тегам:

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