Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Вниз

Совместное использование IDENTITY в MSSQL и TDataSet   Найти похожие ветки 

 
AlexL   (2002-12-12 05:27) [0]

Народ!
Общая ситуация:
Есть таблица в MSSQL с ключевым полем Id, имеющим тип int IDENTITY(1, 1) (Primary Index), и есть TDataSet по этой таблице.
Возникла следующая проблема:
При попытке добавления данных в указанный TDataSet возникает ошибка, что полю Id нельзя присвоить значение. Менял тип указанного поля в TDataSet на ptIncrement - результат тот же.


 
KSergey   (2002-12-12 09:23) [1]

А этому полю программно присваивается значение?


 
Shaman   (2002-12-12 10:15) [2]

Я недавно сам с этим парился, здесь спрашивал, но никто ничего так и не сказал. Похоже ситуация штатным путем не решается. Перестроил программу так, что записи добавляются SQL-запросом. Как вариант можно открывать DataSet как SQL-запрос и в числе выбираемых полей Id не указывать, тогда при добавлении записей ошибки не возникает, но не всегда такой вариант приемлем.
Ежели че другое придумаешь, дай знать.


 
wicked   (2002-12-12 11:50) [3]

как вариант - сменить FieldKind поля Id с fkData на fkInternalCalc... у меня такое срабатывало с TBetterADODataSet, возможно, сработает и с другими DataSet"ами....
естественно, речь идёт НЕ о BDE....


 
Севостьянов Игорь   (2002-12-12 12:32) [4]

Что-то я не пойму автора вопроса
Интересно как ты в ДатаСет добавляешь запись - не принцип, а код ?

И еще объясни мне - зачем существет понятие IDENTITY (@@IDENTITY) ?
Насколько мне известно - это поле должно формироваться самим SQL Server"ом

@@IDENTITY
Returns the last-inserted identity value.

Syntax
@@IDENTITY

Return Types
numeric

Remarks
After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY contains the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL. If multiple rows are inserted, generating multiple identity values, @@IDENTITY returns the last identity value generated. If the statement fires one or more triggers that perform inserts that generate identity values, calling @@IDENTITY immediately after the statement returns the last identity value generated by the triggers. The @@IDENTITY value does not revert to a previous setting if the INSERT or SELECT INTO statement or bulk copy fails, or if the transaction is rolled back.

@@IDENTITY, SCOPE_IDENTITY, and IDENT_CURRENT are similar functions in that they return the last value inserted into the IDENTITY column of a table.

@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session. However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope.

IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT returns the identity value generated for a specific table in any session and any scope. For more information, see IDENT_CURRENT.

Examples
This example inserts a row into a table with an identity column and uses @@IDENTITY to display the identity value used in the new row.

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ("Accountant",12,125)
SELECT @@IDENTITY AS "Identity"



See Also

CREATE TABLE

IDENT_CURRENT

INSERT

SCOPE_IDENTITY

SELECT

System Functions


 
Севостьянов Игорь   (2002-12-12 12:37) [5]

Ну нельзя добавлять IDENTITY И все тут

Единственный способ все-таки добавить такую запись это -

SET IDENTITY_INSERT Таблица ON -- отключить

INSERT INTO Таблица (поля) VALUES (значения)

SET IDENTITY_INSERT Таблица OFF -- включить


 
Севостьянов Игорь   (2002-12-12 12:37) [6]

И не забудь об уникальности ключа ...


 
wicked   (2002-12-12 12:41) [7]

2 Севостьянов Игорь ©
хех, а никто и не говорит, что сам добавляет туда значения....
говорится о том, что датасет сам при сохранении вставленой записи присваивает некое значение этому полю... и хорошо еще, что mssql ole db провайдер не пропускает такие штуки... с jet"ом в 100 раз хуже - он забивал туда значение, переданное из приложения...
приходилось выкручиваться с помощью fkInternalCalc...


 
Cheshit   (2002-12-13 18:22) [8]

Поставьте в TDataSet AutoRefresh=True



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.036 c
14-15273
Blacki
2002-12-14 13:29
2003.01.06
Чем собрать инсталяшку


3-14914
old_mole
2002-12-12 11:52
2003.01.06
Помогите с Report`ом


1-14972
LORD
2002-12-23 23:16
2003.01.06
как задействовать процедуру объявленную в другом модуле


1-15031
Gamar
2002-12-24 13:07
2003.01.06
Разница между двумя датами в миллисекундах


4-15359
TankMan
2002-11-09 22:29
2003.01.06
Я уже спрашивал... но спрошу переформулировав вопрос...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский