Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ID после INSERT, не работает пример из msdn 
:(
    Опции темы
lemax
Дата 11.2.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 14.10.2007

Репутация: нет
Всего: 1



У меня не работает ни один пример с "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)

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

Это сообщение отредактировал(а) lemax - 11.2.2009, 23:53
PM MAIL   Вверх
emmanuil
Дата 12.2.2009, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Цитата(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); были ли добавления ну и так далее.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.