Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > ID после INSERT


Автор: lemax 11.2.2009, 23:51
У меня не работает ни один пример с "SELECT @@IDENTITY".

Запрос "SELECT @@IDENTITY" всегда возвращает НОЛЬ.

Даже не работает http://msdn.microsoft.com/en-us/library/ks9f57t0(vs.71).aspx (Для Access+C#).
Код

using System;
using System.Data;
using System.Data.OleDb;

public class Sample
{
  static OleDbConnection nwindConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" +
                                                  @"Data Source=c:\Program Files\Microsoft Office\Office\Samples\northwind.mdb;");

  public static void Main() 
  {
    // Use the DataAdapter to fill and update the DataSet.
    OleDbDataAdapter catDA = new OleDbDataAdapter("SELECT CategoryID, CategoryName FROM Categories ORDER BY CategoryID", nwindConn);

    catDA.InsertCommand = new OleDbCommand("INSERT INTO Categories (CategoryName) Values(?)", nwindConn);
    catDA.InsertCommand.CommandType = CommandType.Text;

    catDA.InsertCommand.Parameters.Add("@CategoryName", OleDbType.Char, 15, "CategoryName");

    nwindConn.Open();
 
    // Fill the DataSet.
    DataSet catDS = new DataSet();
    catDA.Fill(catDS, "Categories");

    // Add a new row.
    DataRow newRow = catDS.Tables["Categories"].NewRow();
    newRow["CategoryName"] = "New Category";
    catDS.Tables["Categories"].Rows.Add(newRow);

    // Include an event to fill in the Autonumber value.
    catDA.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated);

    // Update the DataSet.
    catDA.Update(catDS, "Categories");

    nwindConn.Close();
  }

  protected static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args)
  {
    // Include a variable and a command to retrieve the identity value from the Access database.
    int newID = 0;
    OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);

    if (args.StatementType == StatementType.Insert)
    {
      // Retrieve the identity value and store it in the CategoryID column.
      newID = (int)idCMD.ExecuteScalar();
      args.Row["CategoryID"] = newID;
    }
  }
}



Как надо создать таблицу "Categories" из примера, что бы пример заработал?

Мои варианты создания таблиц
Код

1) CREATE TABLE Categories(CategoryID IDENTITY, CategoryName VARCHAR)

2) CREATE TABLE Categories(CategoryID IDENTITY(1,1) PRIMARY KEY, CategoryName VARCHAR)

3) CREATE TABLE Categories(CategoryID AUTOINCREMENT PRIMARY KEY, CategoryName VARCHAR)

4) CREATE TABLE Categories(CategoryID AUTOINCREMENT , CategoryName VARCHAR)

с этим примером не работает. 

Автор: emmanuil 12.2.2009, 06:21
Цитата(lemax @  11.2.2009,  21:51 Найти цитируемый пост)
Как надо создать таблицу "Categories" из примера, что бы пример заработал?Мои варианты создания таблицКодincludeSyntax('sql');1) CREATE TABLE Categories(CategoryID IDENTITY, CategoryName VARCHAR)2) CREATE TABLE Categories(CategoryID IDENTITY(1,1) PRIMARY KEY, CategoryName VARCHAR)3) CREATE TABLE Categories(CategoryID AUTOINCREMENT PRIMARY KEY, CategoryName VARCHAR)4) CREATE TABLE Categories(CategoryID AUTOINCREMENT , CategoryName VARCHAR)highlightSyntax('sql_YjM4Nz','sql');с этим примером не работает. 

В Sql Server вот так:
Код

create table Categories (
    CategoryID int primary key identity,
    CategoryName varchar(15)
)

В Sql Server лучше использовать select scope_identity(), незнаю есть ли в акцессе, с ним не работал.
Если это пример, то какой-то он сомнительный.
Лучше не храни коннекшин в статическом поле, можешь хранить строку подключения. Используй using везде, где возможно. Можно после catDA.Update(catDS, "Categories"); сделать селект на получение последнего инкремента, но только последнего. Когда работаешь с адаптером, то он вроде как инкрементальные поля сам заполняет. Можно сделать проверку catDS.HasChanges(DataRowState.Added); были ли добавления ну и так далее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)