مشاهده نسخه کامل
: مشکل در تنظیمات شبکه برای اتصال چند سیستم با SQLEXPRESS
یک برنامه با SQLEXPRESS طراحی شده میخوام دو نسخه از این برنامه رو توی دوتا سیستم اجرا کنم که یکیشون بدون بانک اطلاعاتی است و اطلاعاتشو از سیستم اولی بگیرو
شبکه بصورت WORKGROUP کار میکنه
IP کامپیوتر اصلی که دارای بانک اطلاعاتی هست برابر است با ip=10.0.254.62
IP کامپیوتر فرعی بدون بانک اطلاعاتی برابر است با ip=10.0.254.68
برنامه رو در دو نسخه با Connection String ثابت و متغیر طراحی کردم
Connection String ثابت(کامپیوتر سرور)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Connection String متغیر(کامپیوتر کلاینت)
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
الان برای کامپیوتر سرور مشکلی نیست اما مشکل برای کامپیوتر کلاینت پیش میاد
در هنگام اجرا این پیغام خطا رو میده
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
هر دو سیستم همدیگر رو میبینن و در ارتباط شبکه مشکلی نیست
در تنظیمات SQL Server Surface Area Configuration هر دو سیستم روی بخش Using both TCP/IP And named pipes تنظیم شده است
در تنظیمات SQL Server Configuration Manager هر دو سیستم SQLEXPRESS)SQL Server) و SQL Server Browser در حالت Run و بر روی مد NetworkService می باشند
از دوستانی که اطلاعاتی در این مورد دارند ممنون میشم راهنمایی کنن
با تشـــــــــــــــــــــــ ــــــــکر
سلام
باید دیتابیس را attach کنید...
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
موفق باشید.
من نحوه attach کردن رو میدونم ولی آخه من از SQLEXPRES خود VS2008 استفاده کردم چطور اونو attach کنم در حالی که برنامه ای برای attach وجود نداره.
یعنی باید روی سرور حتما SQl SERVER 2005 نصب باشه؟
سلام
attach راه استاندارد ارتباط sqlserver است و نسخه express هم از این امر مثتثنی نیست.
(در واقع sqlserver اصلاً بدون attach کار نمیکند، نسخه express هم که به ظاهر چشمی میتواند اینکار را انجام دهد، در اصل نوعی attach کاملاً رسمی و قانونی و معمولی را خودکار انجام میدهد ولی موقت، یعنی خودش detach را هم انجام میدهد.)
استفاده از express در شبکه کاملاً عملی و attach هم در همه نسخه های sqlserver قابل انجام است.
(البته شاید نیاز باشد برخی پروتکلها را هم برای express فعال کنید تا در شبکه کار کند.)
مشکل ارتباط رو حل کردم شبکه رو تبدیل به Client/Server کردم و بعد از تنظیمات شبکه بانک رو تو سرور بعد از نصب SQL SERVER 2005 تونستم Attach کنم و با تنظیم Connection String برنامه Client برنامه شروع به کار کرد
حالا میخواستم روی نحوه قفل کردن یک جدول و یا یک رکورد بحث کنیم
برای قفل کردن یک جدول زمانی که از یک SqlDataAdapter استفاده می کنم زمانی که میخوام عملیاتی روی بانک اعمال کنم از دستور زیر استفاده کردم
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آیا این روش درسته؟
برای قفل روی یک رکورد باید چار کرد؟
اگر از روش زیر برای اصلاح استفاده شودن ایا قفل زیر درست است
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سلام
قف شما مطلقاً فاقد ارزش است.
الآن که اصلاً بود و نبودش تاثیری ندارد!
فوق فوقش در شرایطی که فقط و فقط در سطح کل برنامه یکبار new داشته باشید، میتواند در همان نسخه اجرای برنامه تاثیر داشته باشد و بازهم هیچ تاثیری روی دیگر رایانه های شبکه ندارد.
بانک اطلاعاتی sqlserver خودکار و در صورت تشخیص قفلهایی برای کارکرد صحیح تخصیص/آزاد میکند.
در شرایط عادی، شما نیازی نیست کاری کنید.
یعنی اصلا احتیاجی نیست هیچ کدی نوشته شود؟
در صورت برخورد SQL SERVER چه عکس العملی نشون میده پیغام خطا میفرسته یا کاربر رو منتظر نگه میداره؟
سلام
اگر sqlserver صلاح بداند خودش سطر مورد نظر را قفل میکند، و تا زمان قفل بقیه پردازشها منتظر خواهند ماند.
ولی این قفل بسیار کوتاه است و فوراً اخذ و فوراً آزاد میشود.
در یک برنامه شبکه ای شما باید بیشتر به primarukey ها دقت کنید...
حتماً primarykey ها را autonumber قرار دهید ...
insert های عادی احتمال دارد به علت duplicate کلید با مشکل مواجه شوند و فرد دیگری زودتر آن کلید را درج کند...
به این فکر کنید که هر دیتایی از زمان انتخاب قبلی تا بعدی، شاید توسط کاربر دیگری حذف یا ویرایش شده باشد...
و...
شما باید به ساختار داخلی برنامه خود فکر کنید، مشکلی با ذات ذخیره دیتا نخواهید داشت.
به این فکر کنید که هر دیتایی از زمان انتخاب قبلی تا بعدی، شاید توسط کاربر دیگری حذف یا ویرایش شده باشد...
.
من فکر میکنم بهتره که قبل از اینکه کاربر عملیات update رو انجام بده یک نوشته بشه که رکورد مورد نظر رو چک کنه که ببینه تغییر کرده یا نه و بعد عملیات refresh رو انجام بده!
نظر شما چیه؟
سلام
من فکر میکنم بهتره که قبل از اینکه کاربر عملیات update رو انجام بده یک نوشته بشه که رکورد مورد نظر رو چک کنه که ببینه تغییر کرده یا نه و بعد عملیات refresh رو انجام بده
اگر منظورتان را از referesh درست متوجه شده باشم و منظورتان یک عملیات SELECT پس از UPDATE باشد...
اگر شما update ای انجام دهید، یک عدد int به شما داده خواهد شد، که معرف تعداد سطرهایی است که توسط این دستور در بانک تغییر کرده اند.
(
البته دقت کنید که اگر از DataTable و DataAdapter استفاده مکنید و چیزی را در DataTable تغییر دهید و لی DataAdapter.Update صفر سطر را آپدیت کند، یک خطای runtime صادر میشود که باید به درستی هندلرش کنید.
)
در استفاده از DataTable و DataAdapter ...
مهم برای SELECT پس از UPDATE آن است که چند سطر DataTable تغییر کره و چند سطر Update شده.
در یک حالت خوب میانه SELECT باید موقعی انجام شود که دو عدد فوق برابر نباشند.
ولی اگر خیلی میخواهید مطمئن باشید اطلاعات نمایشی به روز هستند و جدیدترین تغییرات را در سطح بانک نمایش میدهند...
- یا همیشه باید SELECT داشته باشید.
- یا SP های شما در sqlserver با تغییر سطری از یک جدول یک سطر خاص در جدول دیگری را با تاریخ-زمان آن لحظه ست کنند...
تا کلاینتها با چک کردن این عدد با آخرین مقدار در زمان SELECT خودشان بفهمند که نیاز به هزینه پردازشی و ترافیکی شبکه به یک SELECT دارند یا خیر
(البته میتوانید به جای تاریخ-زمان از فیلدهای timestamp هم استفاده کنید)
موفق باشید.
- یا SP های شما در sqlserver با تغییر سطری از یک جدول یک سطر خاص در جدول دیگری را با تاریخ-زمان آن لحظه ست کنند...
تا کلاینتها با چک کردن این عدد با آخرین مقدار در زمان SELECT خودشان بفهمند که نیاز به هزینه پردازشی و ترافیکی شبکه به یک SELECT دارند یا خیر
(البته میتوانید به جای تاریخ-زمان از فیلدهای timestamp هم استفاده کنید)
موفق باشید.
میشه درباره این موضوعش یکم بیشتد توضیح بدید و بگید که چگونه باید اونو تا بانک پیاده سازی کرد
سلام
نوع timestamp در SQLServer یک عدد 64 بیتی است (معادل long و ulong در دات نت)
این فیلد را شما نمیتوانید و نباید تغییر و ویرایش دهید!
مقدار این فیلد خودکار توسط SQLServer پرخواهد شد.
این مقدار یک عدد یکتا و منحصر به فرد است که با هر ویرایش سطر تغییر خواهد کرد.
نتیجتاً در برنامه های شبکه ای گسترده و بزرگ با ترافیک زیاد و با حساب عدم تغییر primarykey ...
کلاینتها میتوانند در صورت نیاز و قبل از اعمال دیگر و یا در داخل خود دستورات T-SQL مقدار این فیلد را با آخرین مقداری که خودشان داشتند چک کنند و به این نتیجه قطعی برسند که آیا از اخرین دفعه تغییر و ویرایش شده یا خیر؟
=====
ولی چیزی که من پیشنهاد کردم، ساده تر بود!
یعنی یک چیز تو مایه های یک timestamp برای کل هر جدول!
چطور میشه timestamp ا چک کرد کجا قرار گرفته؟
اگر هم پیدا کردم به فرض مثال شماره id من 20 است باید چطور ID رو با timestamp مقایسه کنم؟
اگه میشه یه مثال بزنید
سلام
متاسفانه من متوجه مفهوم سوالات شما نشدم!
نتیجتاً سعی میکنم یکم دیگر توضیح بدهم...
فیلد timestamp یک نوع فیلد عددی است، مثل smallint و int و البته بیشتر bigint.
این فیلد از جهاتی هم شبیه autonumber ها است، به این معنی که شما نمیتوانید آن را در insert و update مقداردهی یا تغییر دهید.
این فیلد با هر تغییر سطر، مقدار جدید و متمایزی و غیر تکراری میگیرد.
فقط و فقط به عنوان یک مثال ساده برای متوجه شدن مطلب به نمونه زیر دقت کنید:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
موفق باشید.
سلام
البته شاید بهتر بود مثال زیر را میزدم!
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سلام
بنده هم می خوام وقتی کاربری در حال ویرایش سطری است کاربران دیگر نتوانند ان رکورد را ویرایش کنند؟؟؟
لطفا را هنمایی کنید.
سلام
وقتی کاربری در حال ویرایش سطری است کاربران دیگر نتوانند ان رکورد را ویرایش کنند؟
اگر واقعاً بخواهید انجام دهید کل فرآیند ان را باید خودتان انجام دهید، مثلاً فیلدی عددی در جدول تان اضافه کنید که مشخص کند سطر جاری توسط کاربر خاصی قفل شده است و تا وقتی صفر نشده برنامه شما اجازه دسترسی به آن را به دیگران ندهد.
ولی اگر اصول شبکه را صحیح رعایت کنید نیازی به انجام این موارد نیست...
این کار مشکلات منطقی و پیاده سازی خاص خود را دارد، از جمله کاربر میتواند فرم ویرایش را باز کند و برود با تلفن صحبت کند یا صبحانه بخورد (!!!) آنگاه چه میشود؟ این را در سطح یک شبکه بزرگ گسترش دهید... این کار بازدهی شبکه را بشدت کاهش میدهد.
(((
البته لازم بذکر است که SQLServer خودش مکانیزم های قفل خاصی روی سطرهای دارد که شاید شما اصلاً متوجه آن نشوید و... دوستان که با اصول چند ریسمانی آشنا هستند خیلی خوب متوجه میشوند که کارکرد صحیح دستوری مثل update [table] set [field]=[field]+1 در یک شبکه پرتراکنش ناشی از همین مکانیزم های فوق العاده کوتاه و سریع قفل داخل SQLServer است و...
)))
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.