PDA

View Full Version : تشخیص عدد داده شده به یک فیلد از نوع AutoNumber



ariadpg
سه شنبه 08 اسفند 1391, 10:57 صبح
سلام
یک جدول با دو فیلد به شرح زیر را در نظر بگیرید:
IdCod(AutoNumber)
NameFamily(Nvarchar)
فرض بفرمائید در برنامه دلفی توسط کدهای SQL رکوردی در این جدول اضافه نمائیم:
Insert into Employee (NameFamily) Values (:P1)
بعد از اضافه شدن این کد یک عددی بصورت اتوماتیک به فیلد Idcod توسط نرم افزار بانک اطلاعاتی اختصاص داده می شود ، چطور می توان کدی نوشت که این عدد اختصاص داده شده به برنامه دلفی برگشت داده شود. یعنی همان کاری که کد Set @RequestId = @@Identity در StoreProcedure انجام می دهد.
ضمناً این برنامه دلفی تحت شبکه کار میکنه و ممکن است همزمان چند رکورد در جدول اضافه شود پس کلک اینکه بزرگترین Idcod یعنی Select Max Idcod..... را بگیریم جواب گو نیست.

ariadpg
چهارشنبه 09 اسفند 1391, 08:20 صبح
سلام دوستان.
بالاخره جوابشو پیدا کردم. این هم نمونه کدش:
var
LastID: Integer;
// Query: TADOQuery;
// oder
// Query: TQuery;
begin
Query.Active := False;
Query.SQL.Clear;
Query.SQL.Append('INSERT INTO Table (Spalte) VALUES (Value)');
Query.ExecSQL;
LastID := GetLastID(Query);
end;

function GetLastID(var Query: TADOQuery {or TQuery}): Integer;
begin
result := -1;
try
Query.SQL.clear;
Query.SQL.Add('SELECT @@IDENTITY');
Query.Active := True;
Query.First;
result := Query.Fields.Fields[0].AsInteger;
finally
Query.Active := False;
Query.SQL.clear;
end;
end;

سعید صابری
چهارشنبه 09 اسفند 1391, 14:57 عصر
اگر بعد از درج در جدول با همون کامپوننتی که عمل درج انجام دادی(مثلا Query که خودت نوشتی) شماره ID بخونی چون کرسر بطور اتوماتیک به این رکورد انتقال داده شده پس شماره رکورد برگشت داده شده برابر با شماره ID رکورد درج شده شما است.
اونوقت جوابت یک خط میشه 10-15 خطی که خودت بدون تگ گذاشتی!


ADOTable1.FieldByName('id').Value

hp1361
چهارشنبه 09 اسفند 1391, 20:46 عصر
سلام

اگه تعداد Insert ها در هرثانیه چندین رکورد باشه چی؟باز هم این روش کاربرد داره؟

سعید صابری
چهارشنبه 09 اسفند 1391, 22:23 عصر
صرف نظر از قوانین دیتابیس ها، عناصر کار با بانک اطلاعاتی این قانون طبیعی وجود داره که وقتی یک تغییر قراره ایجاد بشه باید مکانما به اونجا بره تغییر ایجاد کنه حالا درج باشه یا ویرایش و حذف.پس وقتی شما تعداد زیاد رکورد درج می کنه مکانما همیشه به آخرین رکورد درج شده توسط همون سیستم اشاره می کنه.

hp1361
چهارشنبه 09 اسفند 1391, 23:32 عصر
سلام

میشه با استفاده از Stored procedure یک مثال بزنید؟

تا جایی که یادم میاد کار با مقدار بازگشتی توی #C خیلی راحت بود!

هرچی گشتم یک مثال خوب برای استفاده از SCOPE_IDENTITY() توی دلفی نیافتم

این کد Stored Procedur توی MS SQL SEREVR


USE [Test]
GO
/****** Object: StoredProcedure [dbo].[InsertGet] Script Date: 02/27/2013 13:02:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Name
-- Create date:
-- Description:
-- =============================================
ALTER PROCEDURE [dbo].[InsertGet]
-- Add the parameters for the stored procedure here
@Fname nvarchar(50) = 0
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT INTo tbl_Insert(Fname) VALUES(@Fname)
RETURN SCOPE_IDENTITY()
END


آیا Stored Proc رو درست نوشتم ؟حالا چطور از نتیجه این توی دلفی استفاده کنم؟

ممنون

یوسف زالی
پنج شنبه 10 اسفند 1391, 17:29 عصر
سلام.
از Identity@@ استفاده کنید.
خروجی در پارامتر Return_Value@ شی SP برگردونده می شه.

ariadpg
شنبه 12 اسفند 1391, 11:42 صبح
با سلام خدمت همه دوستان
با تشکر از راهنمائی دوستان
جناب آقای سعید صابری با تشکر از جوابیه شما و عذر تقصیر به علت اینکه کد را در داخل تگ قرار ندادم ، مجددا کد را داخل تگ قرار میدهم



var
LastID: Integer;
// Query: TADOQuery;
// oder
// Query: TQuery;
begin
Query.Active := False;
Query.SQL.Clear;
Query.SQL.Append('INSERT INTO Table (Spalte) VALUES (Value)');
Query.ExecSQL;
LastID := GetLastID(Query);
end;

function GetLastID(var Query: TADOQuery {or TQuery}): Integer;
begin
result := -1;
try
Query.SQL.clear;
Query.SQL.Add('SELECT @@IDENTITY');
Query.Active := True;
Query.First;
result := Query.Fields.Fields[0].AsInteger;
finally
Query.Active := False;
Query.SQL.clear;
end;
end;

خدمت شماه عرض کن که کد شما صحیح بود ولی منظور من استفاده از adotable نبود بلکه من در فرمی از Adoquery استفاده می نمودم و در آن فرم نیز هیچ Dbgrid جهت نمایش اطلاعات نگذاشته بودم.

دوست عزیز HP1361: یک نمونه کد StoreProcedure مربوطه را در زیر قرار میدهم






CREATE PROCEDURE stpInsertUser

@UserId int Out ,
@UserName nvarchar(50) = NULL,
@UserPass nvarchar(50) = NULL,
@UserAdmin bit
As
Insert into tblUsers (UserName,UserPass,UserAdmin)
values (@UserName,@UserPass,@UserAdmin)

Set @UserId = @@Identity
GO

ariadpg
شنبه 12 اسفند 1391, 11:44 صبح
ببخشید تگ اشباه شد مجددا قرار میدهم


var
LastID: Integer;
// Query: TADOQuery;
// oder
// Query: TQuery;
begin
Query.Active := False;
Query.SQL.Clear;
Query.SQL.Append('INSERT INTO Table (Spalte) VALUES (Value)');
Query.ExecSQL;
LastID := GetLastID(Query);
end;

function GetLastID(var Query: TADOQuery {or TQuery}): Integer;
begin
result := -1;
try
Query.SQL.clear;
Query.SQL.Add('SELECT @@IDENTITY');
Query.Active := True;
Query.First;
result := Query.Fields.Fields[0].AsInteger;
finally
Query.Active := False;
Query.SQL.clear;
end;
end;






CREATE PROCEDURE stpInsertUser

@UserId int Out ,
@UserName nvarchar(50) = NULL,
@UserPass nvarchar(50) = NULL,
@UserAdmin bit
As
Insert into tblUsers (UserName,UserPass,UserAdmin)
values (@UserName,@UserPass,@UserAdmin)

Set @UserId = @@Identity
GO

ariadpg
شنبه 12 اسفند 1391, 11:49 صبح
ببخشید تگ اشباه شد مجددا قرار میدهم


var
LastID: Integer;
// Query: TADOQuery;
// oder
// Query: TQuery;
begin
Query.Active := False;
Query.SQL.Clear;
Query.SQL.Append('INSERT INTO Table (Spalte) VALUES (Value)');
Query.ExecSQL;
LastID := GetLastID(Query);
end;

function GetLastID(var Query: TADOQuery {or TQuery}): Integer;
begin
result := -1;
try
Query.SQL.clear;
Query.SQL.Add('SELECT @@IDENTITY');
Query.Active := True;
Query.First;
result := Query.Fields.Fields[0].AsInteger;
finally
Query.Active := False;
Query.SQL.clear;
end;
end;


نمونه مثال StoreProcedure




CREATE PROCEDURE stpInsertUser

@UserId int Out ,
@UserName nvarchar(50) = NULL,
@UserPass nvarchar(50) = NULL,
@UserAdmin bit
As
Insert into tblUsers (UserName,UserPass,UserAdmin)
values (@UserName,@UserPass,@UserAdmin)

Set @UserId = @@Identity
GO

hp1361
یک شنبه 13 اسفند 1391, 19:04 عصر
سلام

من از این کد جهت دریافت Identity استفاده میکنم


with ADStoredProc_Pcc do
begin
Close;
StoredProcName := 'LogConnect';
FetchOptions.Items := FetchOptions.Items - [fiMeta];
Params.Clear;
Params.Add('@RETURN_VALUE', ftInteger, 0, ptResult);
Params.Add('@SessionID', ftInteger, 0, ptInput);
Params.Add('@IP', ftWideString, 15, ptInput);
Params.Add('@Username', ftWideString, 20, ptInput);
Params.Add('@ConnectDateTime', ftTimeStamp, 0, ptInput);
ParamByName('@SessionID').AsInteger := MySession.Id;
ParamByName('@IP').AsWideString := DSConnectEventObject.ChannelInfo.ClientInfo.IpAddr ess;
ParamByName('@Username').AsWideString := MySession.UserName;
ParamByName('@ConnectDateTime').Value := Now;
ParamByName('@RETURN_VALUE').AsInteger := 0;
Prepare;
ExecProc;


شایان ذکر است از مجموعه کامپوننت های AnyDac استفاده کردم.از dbExpress هم استفاده کنید تو همین مایه هاست.

در ضمن در مورد استفاده SCOPE_IDENTITY() و @@IDENTITY به لینک های زیر مراجعه کنید

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/
و
http://msdn.microsoft.com/en-us/library/ms190315.aspx

دوست عزیز ariadpg : پیشنهاد میدم شما هم از StoredProc استفاده کنید.هم کارایی رو بالا می بره و هم...