PDA

View Full Version : بدست آوردن آخرین Identity و نمایش آن



bachebahal_1363
شنبه 25 خرداد 1387, 12:29 عصر
سلام خدمت دوستان
من در تالارها جستجو های زیادی کردم در مورد بدست آوردن آخرین Identity ذخیره شده در سیستم باید عرض کنم که هر کسی یک جوابی میده یکی میگه از Identity@@ استفاده کنید ، یکی میگه از Scope Identity() استفاده کنید و ...
اگر امکان داره و کسی اطلاع دقیقی در این زمینه دارم خواهش می کنم نحوه بدست آوردن آخرین Identity ذخیره شده و نمایش به کاربر توسط #C رو اینجا قرار بده و من رو راهنمائی کنه .
البته نظر شما رو به این نکته اساسی جلب می کنم که بحث همزمانی استفاده و کلاینت / سرور نیز هست و امکان داره دو کاربر همزمان در حال Insert کردن اطلاعات باشند .

rezaiy.ali
شنبه 25 خرداد 1387, 12:52 عصر
Select Max(Id) from Table

bachebahal_1363
شنبه 25 خرداد 1387, 12:58 عصر
Select Max(Id) from Table


فراموش کردم در این مورد هم بنویسم
به گفته بعضی از دوستان که از این روش استفاده کرده اند گفته شده که در صورت Delete کردن رکوردی با بدست آوردن Max به مشکل بر می خوریم

rezaiy.ali
شنبه 25 خرداد 1387, 13:28 عصر
شما زماینی که یک فیلد را Identity می کنید اگر یکی از رکورد ها را پاک کنید دیگر شماره Identity که به ان ر کورد انتصاب داده شده ،برای رکوردهای بعدی انتصاب داده نمی شه
برای مکس اهمیت نداره که شماره ها پشت سر هم باشند یا خیر همیشه بیشترین مقدار را از بین فیلد ها بر می گرداند.
موفق باشید

bachebahal_1363
شنبه 25 خرداد 1387, 13:32 عصر
شما زماینی که یک فیلد را Identity می کنید اگر یکی از رکورد ها را پاک کنید دیگر شماره Identity که به ان ر کورد انتصاب داده شده ،برای رکوردهای بعدی انتصاب داده نمی شه
برای مکس اهمیت نداره که شماره ها پشت سر هم باشند یا خیر همیشه بیشترین مقدار را از بین فیلد ها بر می گرداند.
موفق باشید

صحبت شما بسیار درست است
من هم نقل قول کردم از دوستانی که این قضیه رو امتحان کرده اند
البته فقط یک سوال پیش میاد که اون هم Insert همزمان هست . در این مورد که مشکلی برای برنامه پیش نمیاد

rezaiy.ali
شنبه 25 خرداد 1387, 19:59 عصر
در مورد درج همزمان بهتر است در تالار پایگاه داده SQL Server جستجو کنی
موفق باشید

hdv212
یک شنبه 26 خرداد 1387, 00:08 صبح
شما باید از همون دستور @@Identity استفاده کنی، میتونی پس از دستور Insert این دستور رو اجرا کنی و نتیجه رو به برنامه ات برگردونی تا بتونی ازش استفاده کنی.

sinpin
یک شنبه 26 خرداد 1387, 06:18 صبح
Select Max(Id) from Table

اين روش براي Sql Server روش مناسبي نيست.


یکی میگه از Identity@@ استفاده کنید ، یکی میگه از Scope Identity() استفاده کنید و ...
بهتره كه از Scope_Identity استفاده كنيد چون Identity گاهي رفتارهاي استثناء و غيرقابل پيش بيني دارد. براي مطالعه بيشتر :
http://barnamenevis.org/forum/showthread.php?t=60512&highlight=SCOPE_IDENTITY

bachebahal_1363
دوشنبه 24 تیر 1387, 18:18 عصر
شما باید از همون دستور @@Identity استفاده کنی، میتونی پس از دستور Insert این دستور رو اجرا کنی و نتیجه رو به برنامه ات برگردونی تا بتونی ازش استفاده کنی.

به چه صورت می شه نتیجه رو به برنامه برگشت داد؟

ezamnejad
سه شنبه 25 تیر 1387, 07:04 صبح
به چه صورت می شه نتیجه رو به برنامه برگشت داد؟



insert into TableName (FieldName) values('Value')
select Scope_Identity()

fakhriamir
سه شنبه 25 تیر 1387, 09:46 صبح
Returns the last identity value generated for a specified table or view in any session and any scope.
IDENT_CURRENT( 'table_name' )

تشکر يادت نره

bachebahal_1363
سه شنبه 25 تیر 1387, 10:41 صبح
خوب دستور() select scope_Identity رو بلدم . تو برنامه C# چطوری نمایشش بدم ؟
از ExecuteReader استفاده کنم یا Executenonequary?

Sajjad.Aghapour
سه شنبه 25 تیر 1387, 11:26 صبح
SqlConnection conn = newSqlConnection("server=(local);database=northwind;integrated security=true");
SqlCommand cmd = newSqlCommand("select ident_current('employees')", conn);
int ident_current;

conn.Open();
ident_current = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();

حالا یه سوال دیگه.اگه داخل جدول Identity نداشتیم و خواستیم مقدار اخرین خونه جدول رو داشته باشیم باید چه کار کرد؟؟؟

jaza_sa
سه شنبه 25 تیر 1387, 12:31 عصر
آیا این بهتر نیست که به نحوی مسئله رو دور بزنیم
یعنی اینکه :
خودمون ، اون طوری که میخوایم کد تولید کنیم.

و برای انجام این کار اول Identity ستون مورد نظر رو برداریم
و بعد در موقع درج یک رکورد ابتدا مقدار ماکزیموم ستون رو بگیریم
و یکی بیشتر از اون رو Insert کنیم ... :لبخندساده:

در کل عملیاتی که روی دیتابیس انجام میشه یک select و یک insert هست :لبخند:

Sajjad.Aghapour
سه شنبه 25 تیر 1387, 13:25 عصر
میشه واضح تر توضیح بدید.من دور زدنی توی روش شما نمی بینم.....

bachebahal_1363
سه شنبه 25 تیر 1387, 13:52 عصر
[code]

حالا یه سوال دیگه.اگه داخل جدول Identity نداشتیم و خواستیم مقدار اخرین خونه جدول رو داشته باشیم باید چه کار کرد؟؟؟

در اون صورت باید از تابع MAX استفاده کنید .

Sajjad.Aghapour
سه شنبه 25 تیر 1387, 17:11 عصر
در اون صورت باید از تابع MAX استفاده کنید .

حتی اگه فیلدهایی داشته باشیم که فقط از نوع char یا nvarchar باشند ؟.......

اَرژنگ
سه شنبه 25 تیر 1387, 17:26 عصر
در اون صورت باید از تابع MAX استفاده کنید .
بایدی نیست، استفاده از مکس هم مشکلات دیگری دارد.
از گوئید استفاده کردن بهتر از این است که از مکس استفاده بشه.
مگر اینکه برنامه برایه یک نفره است، اونوقت استفاده مکس اشکالی ندارد (تا اینکه برنامه را برایه چند نفر استفاده کنند ).

bachebahal_1363
سه شنبه 25 تیر 1387, 18:29 عصر
بایدی نیست، استفاده از مکس هم مشکلات دیگری دارد.
از گوئید استفاده کردن بهتر از این است که از مکس استفاده بشه.
مگر اینکه برنامه برایه یک نفره است، اونوقت استفاده مکس اشکالی ندارد (تا اینکه برنامه را برایه چند نفر استفاده کنند ).

خوب دقیقا بایدی نیست ، اما استفاده ابزاری از کلمات هم درست نیست چون کلمه باید فقط جهت تکمیل جمله بود .


از گوئید استفاده کردن بهتر از این است که از مکس استفاده بشه.

اگر امکان داره تابع رو به همراه syntax درست قرار بدین . حداقل در مورد کلمات انگلیسی فکر نمی کنم مشکلی در نوشتن اون ها به صورت همون انگلیسی مشکلی داشته باشه .

اَرژنگ
چهارشنبه 26 تیر 1387, 02:13 صبح
خوب دقیقا بایدی نیست ، اما استفاده ابزاری از کلمات هم درست نیست چون کلمه باید فقط جهت تکمیل جمله بود .



اگر امکان داره تابع رو به همراه syntax درست قرار بدین . حداقل در مورد کلمات انگلیسی فکر نمی کنم مشکلی در نوشتن اون ها به صورت همون انگلیسی مشکلی داشته باشه .



System.Guid id = Guid.NewGuid();
//Insert the thing into the database
Insert(id, name, lastname, whatever);
//go do something with the id of last record!
DoSomethingWithIdOfLastRecordJustInserted(id);

ebtekar
چهارشنبه 26 تیر 1387, 12:59 عصر
من خودم وقتی میخواست یه عدد تولید کنم و بدونم او عدد چی هستش از این روش استفاده می کنم تا حالاشم نه مشکل سرعت داشتم با این روش نه قاطی کردن چون خودم دارم عدد رو تولید می کنم



SqlDataAdapter da = new SqlDataAdapter("SELECT MAX(cod_unit) FROM tbl_unit", clsconection.CN);
DataSet ds = new DataSet();
da.Fill(ds, "tbl_unit");
clsconection.CN.Close();
if (ds.Tables["tbl_unit"].Rows[0].ItemArray.GetValue(0).ToString() == "")
labeltext = 1;
else
{
labeltext = Int32.Parse(ds.Tables["tbl_unit"].Rows[0].ItemArray.GetValue(0).ToString());
labeltext++;
}

البته نظر دوستام مقدم هستش من خواستن نظر خودم رو بگم

اَرژنگ
چهارشنبه 26 تیر 1387, 17:29 عصر
من خودم وقتی میخواست یه عدد تولید کنم و بدونم او عدد چی هستش از این روش استفاده می کنم تا حالاشم نه مشکل سرعت داشتم با این روش نه قاطی کردن چون خودم دارم عدد رو تولید می کنم



SqlDataAdapter da = newSqlDataAdapter("SELECT MAX(cod_unit) FROM tbl_unit", clsconection.CN);
DataSet ds = newDataSet();
da.Fill(ds, "tbl_unit");
clsconection.CN.Close();
if (ds.Tables["tbl_unit"].Rows[0].ItemArray.GetValue(0).ToString() == "")
labeltext = 1;
else
{
labeltext = Int32.Parse(ds.Tables["tbl_unit"].Rows[0].ItemArray.GetValue(0).ToString());
labeltext++;
}
البته نظر دوستام مقدم هستش من خواستن نظر خودم رو بگم
اینکه با روش استفاده از فرقی ندارد. اینکه مشکل بر نخوردید دلیل نیست که مشکل ندارد، اگر فقط یک کاربر استفاده میکند همین روش بسه، ولی اگر روزی روزگاری از یک کاربر بیستر خواست با برنامه کار کند مشکل پیش خواهد آمد.
لطفا بگید که هیمن نوع کد را در برنامه نویسی استفاده نمیکنید، چونکه همه چی همینطوری ریخته بهم. به ۳ لایه نویسی یک نگاه بندازید.
ما هم با گفتن نظراتمان روشهایه بهتر پیدا کردیم.