PDA

View Full Version : دسترسی به آیدی جدول اصلی در یک برنامه تحت شبکه



arefba
دوشنبه 21 مرداد 1392, 06:15 صبح
سلام دوستان
من دارم یک برنامه فروشگاه تحت شبکه آماده می کنم
من دو تا جدول با مشخصات زیر دارم

TblSellDocument
IDDocSell int Unchecked key and IDentity
IDAccount int Unchecked
IDOC int Unchecked
IDUser int Unchecked
IDCustomer int Unchecked
Datein datetime Unchecked
SumPrice bigint Unchecked
Status bit Unchecked

TblSellProduct
IDsell int Unchecked key and IDentity
IDDocSell int Unchecked foreign key
IDStuff int Unchecked
Number int Unchecked
SellPrice bigint Unchecked
Discount bigint Unchecked
SellMultiplePrice bigint Unchecked

حالا یه فرم طراحی کردم که کاربر میاد و کالا هایی رو که میخواد اضافه می کنه وقتی که دکمه ثبت رو میزنه من باید اطلاعات رو تو جدول TblSellProduct وارد کنم حالا مشکل اینجاست من چجوری آیدی اون سند رو پیدا کنم و ثبت کنم
این آیدی نباید توسط کاربر دیگه ازش استفاده شده باشه

Reza_Yarahmadi
دوشنبه 21 مرداد 1392, 09:02 صبح
وقتی توی جدول TblSellDocument ثبت میکنید با استفاده از تابع ()Scope_Identity مقدار فیلد IDDocSell رو بدست بیارید و توی جدول TblSellProduct و به ازا هر کالا ذخیره کنید

arefba
دوشنبه 21 مرداد 1392, 10:14 صبح
ممنون که سرنخ قضیه رو دادید من کد زیر رو نوشتم بابت تابعی که گفتین null میداد و بابت @@IDENTITY عددی رو که ثبت کرده میده ولی چرا اونی که شما گفتین برام null بر می گردونه



INSERT INTO [DBStore].[dbo].[TblSellDocuments]
([IDAccount]
,[IDOC]
,[IDUser]
,[IDCustomer]
,[Datein]
,[SumPrice]
,[Status])
VALUES
(
1,1,1,1,'2013-02-02',200,0
)
GO


GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO

arefba
دوشنبه 21 مرداد 1392, 10:17 صبح
@@IDENTITY

It returns the last identity value generated for any table in the current session, across all scopes.
Let me explain this... suppose we create an insert trigger on table which inserts a row in another table with generate an identity column, then @@IDENTITY returns that identity record which is created by trigger.
SCOPE_IDENTITY

It returns the last identity value generated for any table in the current session and the current scope.
Let me explain this... suppose we create an insert trigger on table which inserts a row in another table with generate an identity column, then SCOPE_IDENTITY result is not affected but if a trigger or a user defined function is affected on the same table that produced the value returns that identity record then SCOPE_IDENTITY returns that identity record which is created by trigger or a user defined function.
IDENT_CURRENT

It returns the last identity value generated for a specific table in any session and any scope.
In other words, we can say it is not affected by scope and session, it only depends on a particular table and returns that table related identity value which is generated in any session or scope.

Reza_Yarahmadi
دوشنبه 21 مرداد 1392, 13:08 عصر
با مثال زیر تفاوت SCOPE_IDENTITY و IDENTITY@@ مشخص میشه
CREATE TABLE TBL_1(ID INT IDENTITY, NAME NVARCHAR(50))
CREATE TABLE TBL_2(ID INT IDENTITY, NAME NVARCHAR(50))

GO

INSERT INTO TBL_1 (NAME) VLAUES ('DATA1')

SELECT SCOPE_IDENTITY()
SELECT @@IDENTITY

GO

CREATE TRIGGER TG_TBL_1
FOR TBL_1
AFTER INSERT
AS
BEGIN
INSERT INTO TBL_2 (NAME) VLAUES SELECT NAME FROM INSERTED
END

GO

INSERT INTO TBL_1 (NAME) VLAUES ('DATA2')

SELECT SCOPE_IDENTITY()
SELECT @@IDENTITY

IDENT_CURRENT آخرین مقدار تخصیص داده شده به فیلد IDENTITY یک جدول رو برمیگردونه (این مقدار ممکنه بدلیل ROLLBACK شدن درون جدول ذخیر نشده باشه
مثال زیر رو توجه کنید
INSERT INTO TBL_1(NAME) VALUES (1/0)

SELECT IDENT_CURRENT('TBL_1')
SELECT IDENT_CURRENT('TBL_2')