Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.06;
Скачать: CL | DM;

Вниз

Совместное использование 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
7-15343
Lizard
2002-10-23 11:31
2003.01.06
Помогите совместить два исходника в один.


3-14925
Senka
2002-12-11 18:56
2003.01.06
Как в QuickRep увеличить число страниц - у меня всегда одна


3-14926
dimis
2002-12-09 16:17
2003.01.06
Наследник DBGrid


7-15344
Rem
2002-10-26 16:52
2003.01.06
Установка своей графической оболочки (вместо explorer.exe)


1-15158
SaperXL
2002-12-23 22:55
2003.01.06
Install Shield