PDA

View Full Version : upgrade کردن



neda azadi
جمعه 01 تیر 1386, 16:16 عصر
سلام . وقت همگی خوش
من در روتین ذخیره یک فرمم از sp استفاده می کنم که فیلد های جدولم رو بهش پاس می دم و ... . در حالت عادی مشکلی وجود ندراه تا و قتیکه نیاز به اضافه کردن یک فیلد جدید پیدا می شه که باید به جدول اصلی و sp اضافه شود . من 2 تا سوال دارم :
1- می شه در sp بی خیا بعضی فیلدها شد و بدون مقدار پاس داده شوند ؟
2- حالا اگر جواب سوال اول منفی باشه مسلما من باید پایگاه اطلاعات کسی که از برنامه من قبلا استفاده می کرده و من الان باید به اون یک exe جدید بدم را upgrade کنم درسته ؟ برای این کار من یک برنامه جدا به نام upgrade دارم ولی نمی خوام اون رو به دست مشتری بدم به خاطر همین بعضی از کدهای اون رو به برنامه اصلی ام آوردم و توی یک کلید جدید قرار دادم ولی همون کد توی برنامه upgrade هیچ مشکلی نداره ولی توی برنامه اصلی خطای timout expression میده ؟!!!
کسی می دونه چرا ؟
مرسی

hdv212
جمعه 01 تیر 1386, 19:00 عصر
می شه در sp بی خیا بعضی فیلدها شد و بدون مقدار پاس داده شوند ؟

اگه در تعریف جدول فیلدهای مورد نظرت not null نباشند، میتونی اونا رو بی مقدار بذاری که در این صورت به صورت اتوماتیک sql بهشون مقدار null میده.

AminSobati
جمعه 01 تیر 1386, 23:11 عصر
دوست عزیزم،
من از جزئیات کار شما اطلاعی ندارم. آیا منظورتون اینه که تغییرات جدید دیتابیس که مثلا چندین ALTER هستش رو در برنامه خودتون اجرا میکنین برای کاربر تا دیتابیس به روز بشه؟

neda azadi
شنبه 02 تیر 1386, 15:19 عصر
دوست عزیزم،
من از جزئیات کار شما اطلاعی ندارم. آیا منظورتون اینه که تغییرات جدید دیتابیس که مثلا چندین ALTER هستش رو در برنامه خودتون اجرا میکنین برای کاربر تا دیتابیس به روز بشه؟


بله . آقای ثباتی عزیز همین طوره و همون طوری که گفتم این دستور alter در برنامه اصلی من با error timout expire مواجه می شود ولی در برنامه upgrade مشکلی ندارد !!

AminSobati
شنبه 02 تیر 1386, 15:31 عصر
مورد مشابه رو من در محصول یکی از شرکتهای نرم افزاری دیدم. این ALTERها در ابتدای برنامه اجرا میشد و زمانی که مثلا 3 کاربر همزمان برنامه رو اجرا میکردند، دو تای دیگه Block میشدند.
توجه داشته باشید که ALTER TABLE باعث Lock کردن کل جدول میشه و کسی که زودتر شروع کنه کارش بدون مشکل پیش میره. اساسا این نوع تغییرات روی ساختار باید فقط یکبار اجرا بشه و اگر در زمانی که سرور سرش خلوته صورت بگیره، چه بهتر!

کیوان معینی
یک شنبه 03 تیر 1386, 12:59 عصر
احتمالا اگه از شی ADO استفاده میکنید :

خصوصیت CommandTimeout شی Connection رو به این شکل تنظیم کنید

Con.CommandTimeout = 36000
(مقدار بر حسب ثانیه)

شاید لازم باشه اینکار رو هم انجام بدید :

AminSobati
یک شنبه 03 تیر 1386, 13:15 عصر
تغییر Timeout به جای خود، اما روش اصولی این هست که ما مانع اصلی رو برطرف کنیم. فرضا اگر یک Query در بهترین حالت خودش 2 دقیقه طول میکشه، چاره ای نیست، باید Timeout رو افزایش داد. اما در موردی که الان مطرحه، ما میتونیم به روش صحیح مشکل رو برطرف کنیم.

کیوان معینی
یک شنبه 03 تیر 1386, 13:40 عصر
تنظیم دوم رو تستش کردم ،
فقط با تنظیم همون خصوصیت CommandTimeout شی Connection از داخل اینترفیس تون ، مشکل حل میشه

neda azadi
سه شنبه 05 تیر 1386, 06:46 صبح
آقای ثباتی متاسفانه من حتی وقتی خودم به تنهایی روی سرور کار می کنم یعنی هیچ باری روی شبکه وجود ندارد هم با این مشکل مواجه هستم . بعد از این چرا در یک کد این query بدون هیچ مشکلی اجرا می شود ولی در جای دیگر با این خطامواجه می شود ؟

AminSobati
سه شنبه 05 تیر 1386, 10:48 صبح
ندا جان دلایل متعددی میتونه چنین چیزی رو توجیه کنه. باز بودن حتی یک Transaction قادره کار شما رو Block کنه. قبل از اجرای دستورات خوبه داخل دیتابیس مورد نظر DBCC OPENTRAN رو اجرا کنین و ببینین آیا Transaction باز وجود داره یا خیر.
از طرفی ممکنه Script شما واقعا در حدی سنگین باشه که اجرای اون واقعا چند دقیقه طول بکشه. اگر مطمئن هستین که اینطوره، میتونین طبق پیشنهاد آقای معینی Timeout رو افزایش بدین

neda azadi
دوشنبه 11 تیر 1386, 06:07 صبح
ندا جان دلایل متعددی میتونه چنین چیزی رو توجیه کنه. باز بودن حتی یک Transaction قادره کار شما رو Block کنه. قبل از اجرای دستورات خوبه داخل دیتابیس مورد نظر DBCC OPENTRAN رو اجرا کنین و ببینین آیا Transaction باز وجود داره یا خیر.
از طرفی ممکنه Script شما واقعا در حدی سنگین باشه که اجرای اون واقعا چند دقیقه طول بکشه. اگر مطمئن هستین که اینطوره، میتونین طبق پیشنهاد آقای معینی Timeout رو افزایش بدین


آقای ثباتی عزیز متاسفانه هر دو کاری که شما فرموده بودید رو انجام دادم ولی باز هم مشکل وجود داره . یعنی timout رو افزایش دادم و در هر لحظه ای از اجرای برنامه ام DBCC OPENTRAN رو اجرا کردم ولی پیغام NO TRANSACTION ISNOT ACTVE رو دریافت کردم حتی لحظه ای که query alter table ای که قفل می شه رو اجرا کردم . همه transaction هام رو هم commit کردم . دیگه نمی دونم چه کار باید بکنم ؟

AminSobati
دوشنبه 11 تیر 1386, 20:56 عصر
زمانی که تاخیر رو مشاهده کردین (و هنوز ادامه داره)، EXEC SP_WHO رو اجرا کنین تا ببینید آیا کسی شما رو BLock کرده یا خیر. در خروجی EXEC SP_WHO یک ستون داره به اسم blk. همه رکوردها باید این فیلد براشون خالی (یا صفر) باشه