View Full Version : بدست آوردن مقدار فیلد کلید هنگام اضافه کردن رکورد جدید
mojniknam
یک شنبه 11 فروردین 1387, 19:44 عصر
سلام...
من مدت هاست که یه سوالی دارم
اونم اینه که چه جوری میشه هنگام اضافه کردن رکوردی جدید ، از مقدار فیلد کلید همون رکورد اسفاده کرد... به پیشنهاد یکی از دوستان از @@IDENTITY استفاده کردم
"INSERT INTO [News] ([UrlNews]) VALUES ('~/DetNews.aspx?NewsID='+@@IDENTITY))"که البته ارور میگرفت... ارور هم به ما میگفت که نمیتونه مقدار عددی را بریزه توی فیلد نوع رشته
من هم از تابع str قبل از @@IDENTITY استفاده کردم. اینبار اروری نگرفت ولی هیچی هم توی این فیلد URLNEWS نمیریزه... البته رکورد ایجاد کرد ولی توی اون فیلد چیزی نبود.
به طور خلاصه من توی این کد میخوام در فیلد UrlNews ، آدرس یک صفحه قرار بگیره:
~/DetNews.aspx?NewsID=###البته بجای علامت ### میخوام مقدار فیلد کلید قرار بگیره...
ممنون میشم راهنماییم کنید
bad_boy_2007
یک شنبه 11 فروردین 1387, 23:34 عصر
SCOPE_IDENTITY()
mojniknam
دوشنبه 12 فروردین 1387, 00:00 صبح
SCOPE_IDENTITY()
ارور میده:
Error converting data type varchar to numeric.لازم هست اون رو به nvarchar تبدیل کنم از چه تابعی استفاده کنم؟
من برنامه نویس asp.net هستم و زیاد از sql سر در نمیارم...
hamidprogramer
دوشنبه 12 فروردین 1387, 00:14 صبح
سلام
نمیدونم مشکلتون حل شده یا نه ولی راه حلی که به نظر من میرسه اینه که توسط تابه Max
بزرگترین Id رو دریافت کنین بعد به نسبت Identity Seedجدولتون به آن اضافه کنین تا مقدار Id جدید رو بدست بیارین.
مثل :
Max(Id)+1
mojniknam
دوشنبه 12 فروردین 1387, 00:18 صبح
سلام
نمیدونم مشکلتون حل شده یا نه ولی راه حلی که به نظر من میرسه اینه که توسط تابه Max
بزرگترین Id رو دریافت کنین بعد به نسبت Identity Seedجدولتون به آن اضافه کنین تا مقدار Id جدید رو بدست بیارین.
مثل :
Max(Id)+1
این راه حل معقولی نیست
مثلا شما یه جدول دارید مقدار آخرین کلید 10 هست
+1 میکنی میشه 11 ، درسته
ولی اگه یه جدول داشته باشید که مقدار آخرین کلید 10 باشه ، اون رو پاک کنید... دوباره یه رکورد جدید اضافه کنید ، کلید جدید باز میشه 11
ولی توی راه شما اینجا دوباره 10 میده
Amir_Safideh
دوشنبه 12 فروردین 1387, 00:22 صبح
Insert Into News (UrlNews) Values('Address='+(Convert(Char(20),(SCOPE_IDENTIT Y()+1))))
----------------
موفق باشید .
mojniknam
دوشنبه 12 فروردین 1387, 00:33 صبح
Insert Into News (UrlNews) Values('Address='+(Convert(Char(20),(SCOPE_IDENTIT Y()+1))))----------------
موفق باشید .
ممنون
من این کار رو کردم
تمامی فیلدها بدون ارور وارد شد و عملیات Insert تمام شد
فقط یه مشکل عجیب!
تمام فیلدها مقادیر مورد نظر من رو گرفت ولی فیلدی که این کد رو توش بکار بردم ، خالی هست... یعنی بعد از Insert هیچی توش نمیاد
همین تکه کد (Convert(Char(20),(SCOPE_IDENTITY()+1))) که حذف میکنم ، بعد از Insert توی اون فیلد مقدار Address= قرار میگیره
بنظرتون مشکل اون تکه کد چیه که وجودش ارور نیست ولی چیزی رو هم توی فیلد ثبت نمیکنه؟
Amir_Safideh
دوشنبه 12 فروردین 1387, 08:47 صبح
تمامی فیلدها بدون ارور وارد شد و عملیات Insert تمام شد
فقط یه مشکل عجیب!
تمام فیلدها مقادیر مورد نظر من رو گرفت ولی فیلدی که این کد رو توش بکار بردم ، خالی هست...
بالاخره به درستی انجام شد یا نه ؟ منظورتون اینه که اون مقداری رو که مورد نظرتون بود رو اصلا نتونستین وارد جداول کنید ؟ یعنی تمام رکوردهای فیلد UrlNews خالی هستش و هیچ مقداری نگرفته ؟
mojniknam
دوشنبه 12 فروردین 1387, 11:41 صبح
بالاخره به درستی انجام شد یا نه ؟
عملیات Insert بدون ارور تموم میشه ولی یک رکورد خالی ایجاد میکنه
و وقتی تکه کد زیر رو برمیدارم ، درست میشه و اون رشته ثابتی که توی sql معرفی کرده بودیم ، درون رکورد قرار میگیره
(Convert(Char(20),(SCOPE_IDENTITY()+1)))
Amir_Safideh
دوشنبه 12 فروردین 1387, 13:21 عصر
اولین رکورد به این دلیل خالی میمونه که SCOPE_IDENTITY مقداری رو برنمیگردونه چون اولین رکورد واقعی در جدول یعنی اینکه قبلا عددی وجود نداشته که حالا بخواد اون عدد رو از فیلد IDENTITY برگردونه .
-------------
موفق باشید .
mojniknam
دوشنبه 12 فروردین 1387, 13:25 عصر
اولین رکورد به این دلیل خالی میمونه که SCOPE_IDENTITY مقداری رو برنمیگردونه چون اولین رکورد واقعی در جدول یعنی اینکه قبلا عددی وجود نداشته که حالا بخواد اون عدد رو از فیلد IDENTITY برگردونه .
-------------
موفق باشید .
اما جدول پر هست
حداقل 20 رکورد داره
همانطور که گفتم رکورد ایجاد میکنه اما توی فیلدی که این کد رو گذاشتم چیزی نمیریزه ولی باقی فیلد ها با مقادیر دلخواه پر میشن
mojniknam
دوشنبه 12 فروردین 1387, 13:41 عصر
عکس دیتا بیس رو گذاشتم
شاید کمک کنه
Amir_Safideh
دوشنبه 12 فروردین 1387, 15:11 عصر
شما مطمئن هستی که متغییر Onvan که به ادامه این کد اضافه کردید مقدار نداره . یعنی مطمئن هستید که مقدار این متغییر در زمان Insert مساوی Null نیست ؟
اگر مقدار این متغییر برابر Null باشه خوب مسلما این فیلد در زمان Insert خالی میماند . برای اینکه مطمئن بشید که مشکل از اون متغییر نیست یکبار هم دستور رو بدون اون متغییر اجرا کن ببین چی میشه نتیجه .
---------------
موفق باشید .
mojniknam
دوشنبه 12 فروردین 1387, 15:18 عصر
شما مطمئن هستی که متغییر Onvan که به ادامه این کد اضافه کردید مقدار نداره . یعنی مطمئن هستید که مقدار این متغییر در زمان Insert مساوی Null نیست ؟
اگر مقدار این متغییر برابر Null باشه خوب مسلما این فیلد در زمان Insert خالی میماند . برای اینکه مطمئن بشید که مشکل از اون متغییر نیست یکبار هم دستور رو بدون اون متغییر اجرا کن ببین چی میشه نتیجه .
---------------
موفق باشید .
اگر توی جدول توجه کنید فیلد Onvan مقدار داره و مقدارش هم ثبت شده
Amir_Safideh
دوشنبه 12 فروردین 1387, 16:47 عصر
اگر توی جدول توجه کنید فیلد Onvan مقدار داره و مقدارش هم ثبت شده
حق با شماست .
خوب من کد زیر رو توی اس کیو ال 2000 امتحان کردم و جواب میده شما هم امتحان کنید امیدوارم که مشکلی نداشته باشید . در ضمن به طول رشته در فیلد UrlNews هم دقت کنید که احیانا از لحاظ طول رشته ای کم نباشه و حداکثر کاراکتری که احتمال میدید در این فیلد ذخیره بشه رو در نظر گرفته باشید .
Insert Into News (UrlNews)
Values('Address='+RTrim(Convert(Char(20),(SCOPE_ID ENTITY()+1)))+RTrim(@Onvan))
فقط یه سوال که یکدفعه به ذهنم رسید . اون فیلدی که ما داریم مقدارش رو میگیریم و در فیلد UrlNews اضافه میکنیم رو از نوع Auto Number گرفتید دیگه نه ؟
-------------
موفق باشید.
mojniknam
دوشنبه 12 فروردین 1387, 20:11 عصر
خوب من کد زیر رو توی اس کیو ال 2000 امتحان کردم و جواب میده شما هم امتحان کنید امیدوارم که مشکلی نداشته باشید . در ضمن به طول رشته در فیلد UrlNews هم دقت کنید که احیانا از لحاظ طول رشته ای کم نباشه و حداکثر کاراکتری که احتمال میدید در این فیلد ذخیره بشه رو در نظر گرفته باشید .
Insert Into News (UrlNews)
Values('Address='+RTrim(Convert(Char(20),(SCOPE_ID ENTITY()+1)))+RTrim(@Onvan))
فقط یه سوال که یکدفعه به ذهنم رسید . اون فیلدی که ما داریم مقدارش رو میگیریم و در فیلد UrlNews اضافه میکنیم رو از نوع Auto Number گرفتید دیگه نه ؟
-------------
موفق باشید.
خوب من کد زیر رو توی اس کیو ال 2000 امتحان کردم و جواب میده شما هم امتحان کنید
ولی بانک من 2005 هست ولی فکر نکنم از این باشه
فقط یه سوال که یکدفعه به ذهنم رسید . اون فیلدی که ما داریم مقدارش رو میگیریم و در فیلد UrlNews اضافه میکنیم رو از نوع Auto Number گرفتید دیگه نه ؟
بله - از نوع Auto Number هست
فقط یک نکته: توی کد عبارت Char(20) به چه معناست؟
اگر منظورش از char ، نوع فیلد هست که من نوع فیلدم nvarchar هست
اگر منظور از 20 ، طول رشته هست که طول رشته من بیشتر از 20 هست
یه توضیحی در مورد این عبارت بدین لطفا
Amir_Safideh
دوشنبه 12 فروردین 1387, 22:30 عصر
فقط یک نکته: توی کد عبارت Char(20) به چه معناست؟
اگر منظورش از char ، نوع فیلد هست که من نوع فیلدم nvarchar هست
اگر منظور از 20 ، طول رشته هست که طول رشته من بیشتر از 20 هست
طول رشته رو من به دلخواه 20 گرفتم . زمانی که شما عددی رو به رشته تبدیل میکنید در ازای هر عدد به یک کاراکتر احتیاج دارید حالا اگر عدد شما ترکیب 20 عدد باشه شما باید طول رشته رو به اندازه تعداد ارقام اون عدد بگیرید .
mojniknam
دوشنبه 12 فروردین 1387, 22:35 عصر
طول رشته رو من به دلخواه 20 گرفتم . زمانی که شما عددی رو به رشته تبدیل میکنید در ازای هر عدد به یک کاراکتر احتیاج دارید حالا اگر عدد شما ترکیب 20 عدد باشه شما باید طول رشته رو به اندازه تعداد ارقام اون عدد بگیرید .
در مورد سوال اولی چیزی نگفتین؟؟
فیلد من از نوع nvarchar هست... اونجا که زدین char مشکلی نداره؟
Amir_Safideh
سه شنبه 13 فروردین 1387, 11:22 صبح
فیلد من از نوع nvarchar هست... اونجا که زدین char مشکلی نداره؟
نه خیر فرقی ندارن . اساسا فرق این دو نوع ندع در زمانیه که مقدار زبانهای گوناگون رو بخوان نگه دارن وگرنه در حالت عادی با هم فرقی ندارن و مشکلی پیش نمیاره .
mojniknam
سه شنبه 13 فروردین 1387, 11:32 صبح
حق با شماست .
خوب من کد زیر رو توی اس کیو ال 2000 امتحان کردم و جواب میده شما هم امتحان کنید امیدوارم که مشکلی نداشته باشید . در ضمن به طول رشته در فیلد UrlNews هم دقت کنید که احیانا از لحاظ طول رشته ای کم نباشه و حداکثر کاراکتری که احتمال میدید در این فیلد ذخیره بشه رو در نظر گرفته باشید .
Insert Into News (UrlNews)
Values('Address='+RTrim(Convert(Char(20),(SCOPE_ID ENTITY()+1)))+RTrim(@Onvan))فقط یه سوال که یکدفعه به ذهنم رسید . اون فیلدی که ما داریم مقدارش رو میگیریم و در فیلد UrlNews اضافه میکنیم رو از نوع Auto Number گرفتید دیگه نه ؟
-------------
موفق باشید.
متاسفانه این دستور هم مثل قبلی جواب نداد و توی فیلد مورد نظر چیزی ثبت نمیشه :عصبانی++:
Amir_Safideh
سه شنبه 13 فروردین 1387, 13:34 عصر
خوب من چیز دیگه ای به نظرم نمیرسه . چیزی که هست اینه که این کد
RTrim(Convert(Char(20),(SCOPE_IDENTITY()+1)))
داره مقدار Null برمیگردونه که این اتفاق میافته . یه چیز فقط من فکر میکردم باشه و اون این بود که شما خاصیت IDENTITY فیلد News_ID رو فعال نکرده باشید که شما فرمودید این کار رو هم کردید . باز هم چک کنید ضرر نداره . وارد Design Table بشید و ببیند که خاصیت Identity این فیلد فعال هست یا نه .
--------------
یا حق.
mojniknam
سه شنبه 13 فروردین 1387, 16:17 عصر
خوب من چیز دیگه ای به نظرم نمیرسه . چیزی که هست اینه که این کد
RTrim(Convert(Char(20),(SCOPE_IDENTITY()+1)))
داره مقدار Null برمیگردونه که این اتفاق میافته . یه چیز فقط من فکر میکردم باشه و اون این بود که شما خاصیت IDENTITY فیلد News_ID رو فعال نکرده باشید که شما فرمودید این کار رو هم کردید . باز هم چک کنید ضرر نداره . وارد Design Table بشید و ببیند که خاصیت Identity این فیلد فعال هست یا نه .
--------------
یا حق.
نگاه کردم مشکلی نداشت :ناراحت::گریه:
Amir_Safideh
سه شنبه 13 فروردین 1387, 16:48 عصر
خوب بیا یک تست ساده انجام بده . یه جدول بساز با دوتا فیلد . فیلد A با نوع Int و همچنین با Identity فعال و Identity Seed برابر با 1 و با Idendtity Oncrement برابر با 1 و فیلد بعدی هم فیلد B با نوع داده رشته با طول 10 و اسم جدول رو هم بزار Table1 و حالا این کد رو امتحان کن .
INSERT INTO Table1 (B) Values(Convert(Char(10),(SCOPE_IDENTITY()+1)))
بعد بگو نتیجه چی شد .
--------------
موفق باشید.
mojniknam
چهارشنبه 14 فروردین 1387, 10:07 صبح
خوب بیا یک تست ساده انجام بده . یه جدول بساز با دوتا فیلد . فیلد A با نوع Int و همچنین با Identity فعال و Identity Seed برابر با 1 و با Idendtity Oncrement برابر با 1 و فیلد بعدی هم فیلد B با نوع داده رشته با طول 10 و اسم جدول رو هم بزار Table1 و حالا این کد رو امتحان کن .
INSERT INTO Table1 (B) Values(Convert(Char(10),(SCOPE_IDENTITY()+1)))بع د بگو نتیجه چی شد .
--------------
موفق باشید.
باز هم مثل قبل
رکورد اضافه میشه ولی مقدار B خالی هست (Null) :عصبانی++:
میشه خواهش کنم که شما هم همین تست رو بزنین ، ببینین چی میشه؟
Amir_Safideh
چهارشنبه 14 فروردین 1387, 10:12 صبح
میشه خواهش کنم که شما هم همین تست رو بزنین ، ببینین چی میشه؟
عرض کردم من در اس کیو ال 2000 امتحان کردم و مشکلی نبود و به درستی جواب داد . اگر به اس کیو ال 2000 دسترسی دارید یه بار هم اونجا امتحان کنید .
-------------
موفق باشید .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.