PDA

View Full Version : سوال: افزودن دو رکورد همزمان به دو جدول در sql



Javad90
پنج شنبه 15 دی 1390, 00:31 صبح
سلام
برای سادگی، فرض کنید یه فروشگاه داریم. یه فروش قراره انجام بشه
در ابتدا به جدول اول که حاوی اطلاعات اصلی فروش مثل زمان و قیمت کل هست، یک رکورد اضافه می کنیم. فیلد ای دی در جدول اصلی هر بار توسط sql یک مقدار میگیره.
حالا می خوایم تو جدول زیر مجموعه مشخصات خرید مثل تک تک اجناس رو ذخیره کنیم.

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

در ضمن این اطلاعات مستقیما در sql ذخیره می شوند!

zarrinnegar
پنج شنبه 15 دی 1390, 01:33 صبح
روش اصولی اینه که از scope_Identity() در sql استفاده کنی

هر بار که دستور insert انجام میشه بلافاصله این دستور رو select کن یا داخل sp اون رو return کن
بعدش کد رو داری میتونی رکورد های جدول دومت رو کد گذاری کنی

M.YasPro
پنج شنبه 15 دی 1390, 08:02 صبح
سلام
من سوالتون رو ناقص متوجه شدم ، اما شما می تونید برای جدول a یه تریگر بنویسید که بلافاصله بعد از درج شدن در جدول a یک رکورد در جدول b درج کن .
برای اینکه فیلدهایی از رکورد درج شده در جدول a رو در رکورد b درج کنید باید از کلمه کلیدی Inserted استفاده کنید .
برای اطلاعات بیشتر (http://barnamenevis.org/msdn.microsoft.com/en-us/library/ms191300.aspx)

Javad90
پنج شنبه 15 دی 1390, 14:54 عصر
scope_Identity() یه باگ داره که گاهی اوقات مقادیر اشتباه برمیگردونه، دنبال یه راهه دیگم. یه نگاه به این لینک بندازین
http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value

trigger هم اونطور که من ازش خوندم بدرد این شرایط نمی خوره. من می‌خوام یه رکورد با اطلاعات مشخص در جدول دوم ثبت کنم، فقط مشکل اینه که می خوام ای دی جدول اصلی که هر بار یه عدد میگیره، به عنوان یک فیلد در جدول دوم ثبت بشه. از اونجایی که در لحظه افزودن رکورد به جدول اصلی این ای دی مقدار میگیره، به دنبال یه روش مطمئن برای بدست آوردن ای دی ایجاد شده هستم. و یا شاید یه روش برای افزودن همزمان!

M.YasPro
پنج شنبه 15 دی 1390, 15:06 عصر
من نظرم هنوز روش استفاده از Trigger هست اما از این کلمه کلیدی هم میتونی استفاده کنی @@identity

zarrinnegar
پنج شنبه 15 دی 1390, 23:47 عصر
scope_Identity() یه باگ داره که گاهی اوقات مقادیر اشتباه برمیگردونه، دنبال یه راهه دیگم. یه نگاه به این لینک بندازین
http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value

trigger هم اونطور که من ازش خوندم بدرد این شرایط نمی خوره. من می‌خوام یه رکورد با اطلاعات مشخص در جدول دوم ثبت کنم، فقط مشکل اینه که می خوام ای دی جدول اصلی که هر بار یه عدد میگیره، به عنوان یک فیلد در جدول دوم ثبت بشه. از اونجایی که در لحظه افزودن رکورد به جدول اصلی این ای دی مقدار میگیره، به دنبال یه روش مطمئن برای بدست آوردن ای دی ایجاد شده هستم. و یا شاید یه روش برای افزودن همزمان!

من تا حالا اشکالی توش ندیدم ولی اگه بخوای راه دیگه ای انتخاب کنی استفاده از تابع max هست
بلافاصله پس از insert دستور max(code) رو برگردون میشه آخرین کدی که داری


من نظرم هنوز روش استفاده از Trigger هست اما از این کلمه کلیدی هم میتونی استفاده کنی @@identity

درباره trigger باید بگم که جاش اینجا نیست
زمانی که شما بخواهید بر اساس اطلاعات وارد شده تاثیر روی چدول دیگه بزاره مثلا مقدار یک فیلدش رو کم کنه و اضافه کنه و یا یک رکورد توی history بندازه ازش استفاده میشه یعنی توی trigger فقط اطلاعات insert شده رو بهش دسترسی داریم
نه موقعی که مثلا یک فاکتور میخوای ثبت کنی و عنوان فاکتور توی یک جدول ذخیره میشن و ردیف ها توی یک جدول دیگه
وقتی اطلاعات عنوان توی جدول insert میشه جدول دوم اطلاعات دیگه ای داره که کاربر وارد کرده و توی trigger بهش دسترسی نداریم و باید با یک دستور insert دیگه اون جدول رو پر کنیم و اینجا مشکل اینه که باید کد فاکتور در جدول اصلی برابر باشه با کد فاکتور در ردیف ها

Javad90
شنبه 17 دی 1390, 02:02 صبح
با تشکر از کمک همه
با یکم تغییر تونستم به جوابی که مدنظرم بود برسم. واسه راهنمایی دوستانی که در آینده ممکنه به این مشکل برخورد کنند کد استفاده شده خودم رو توضیح میدم.

در ابتدا یک متغییر عمومی در کلاس ایجاد می کنم
public int Identity;

سپس به همان کد قبلی دستور SELECT SCOPE_IDENTITY رو اضافه کرده و در خط بعدی کد را اجرا و مقدار بازگشتی را با یک تبدیل، در متغییر تعریف شده قرار میدم. درضمن _cmd یک متغییر از جنس SqlCommand هست!

_cmd.CommandText = sql + "; SELECT SCOPE_IDENTITY() AS [lastInsertedId]";
Identity = Convert.ToInt32(_cmd.ExecuteScalar());

حالا واسه اضافه کردن به جدول دوم میشه از متغییر تعریف شده که حاوی ای دی اضافه شده هست، استفاده کرد

موفق باشید