ارتباط با دیتابیس در ASP.NET
در برنامه نویسی وب مخصوصا از مدل ASP.Net همه چیز بعد از نوشتن کامل سایت و برنامه روی کامپیوتر خودتان، تمام نمیشود. قسمت بسیار مهمی در پیش است:
انتقال سایت به هاست اصلی در اینترنت
اگر در کدنویسی و طراحی HTML اصول لازم رو رعایت کرده باشید، از بابت آدرس دهی تصاویر و فایلهای استایل و اسکریپت نگرانیی نخواهید داشت. بیشترین نگرانی زمانی هست که شما از دیتابیس استفاده کرده اید. این مساله زمانی خودش رو مهمتر نشون میده که از SQL Server استفاده شده باشه.
چرا؟ چون وقتی شما به صورت آفلاین و روی سیستم خودتون در حال برنامه نویسی و طراحی هستید، باید از SQL Server که روی دستگاه خود شما نصب است استفاده کنید. اما وقتی سایت به هاست نهایی میخواهد منتقل شود، واضح است که باید از یک دیتابیس دیگری استفاده کند.
اولین کاری باید انجام شود، گرفتن اطلاعات SQL Server جدید هست. این اطلاعات باید شامل موارد زیر باشد:
- آدرس اینترنتی دیتابیس که میتواند هم به صورت IP باشد هم یک آدرس URL
- یوزرنیم و پسورد یا همون نام کاربری و کلمه عبور!
با داشتن این سه مورد به سادگی میتوانید کانکشن استرینگ Connection String جدید را بسازید و آن را در وب کانفیگ web.config ذخیره کنید. دقت کنید که اسمی که برای connection قبلا روی سیستم خودتون تعریف کرده اید و تمامی دیتا کنترل ها و کدهای شما با این اسم کار میکنند، حالا باید به این connection string جدید داده شود و connection string قبلی رو چون باهاش کاری ندارید میتونید پاک کنید.
البته لازم به گفتن نیست که کار وقتی انقدر ساده هست که از connection string در تک تک قسمتهای کد خودتون که به دیتابیس نیاز داشته، به صورت مستقیم استفاده نکرده باشید! وگرنه مجبورید تو کل کد خودتون همه این قسمتها رو عوض کنید. خوب به هر حال یکی از خوبیهای استفاده از web.config برای ذخیره دستورات و متغیر هایی که در کل برنامه قابل استفاده هست، همین هست.
برای ساختن کانکشن استرینگ برای هر مدل دیتابیس، نیازی نیست همه چیز را به خاطر بسپرید. همواره میتونید از این سایت استفاده کنید.
تا اینجای کار اگر همه چی از روی اصول و سیستماتیک انجام شده باشه، زیاد سخت نبود. اما زمانی که از App_Data در ASP.Net استفاده میکنید باید نیم نگاهی هم به امنیت و اجازه های دسترسی هم داشته باشید.
App_Data یکی از Folder (بخوانید فلدر؛ نخوانید فولدر!) های مخصوص در ASP.Net هست که مخصوص نگه داری فایلهای از نوع دیتابیس میباشد. از ویژگی هاش اینه که IIS فایلهای داخل اون رو به کاربر بر نمیگردونه حتی اگه آدرس درست و کامل زده شده باشه. مثلا: mysite.com/app_data/password.mdb برای شما دانلود این دیتابیس رو نتیجه نمیدهد بلکه پیغام خطایی از طرف سرور برای شما میاد با این مفهوم که شما اجازه دسترسی به این بخش رو ندارید.
بنابراین اگر از دیتابیس های فایلی مثل access یا excel یا xml یا حتی notepad استفاده میکنید میتونید اونها در داخل این فلدر قرار داده و در برنامه خودتون با آدرس دهی مناسب، به اونها دسترسی داشته باشید. وقتی اسم فلدر و فایل به میون میاد، در ویندوز بحث امنیت و اجازه دسترسی به این فایل ها و فلدر ها هم مطرح میشه.
معمول ترین خطایی که ممکنه به شما نشون داده باشه خطای زیر هست:
Failed to update database "Path to your DB" because the database is read-only
دو مورد را چک کنید:
1. فلدر APP_Data در حالت Read Only نباشد. البته شما ممکن است به این صورت در هاست خود به فلدر ها دسترسی نداشته باشید. باید ببینید از طریق کنترل پنل هاست میتونید attribute فلدرها و فایلهاها رو تغییر بدید یا نه. اگر اجازه این کار را نداشتید، باید به مسسول هاست تماس بگیرید و از آنها درخواست این کار را بکنید.
2. در ASP.Net در حالت پیشفرض وب سرور شما که همون IIS باشه و حداقل دیگه الان ورژن 6 باید باشه، توسط کاربر Network Service به دیتابیس شما دسترسی داره. بنابراین این حساب کاربری باید به فلدر و فایلهای شما دسترسی داشته باشه هم از نوع خوندن و هم از نوع نوشتن.
بنابراین این حساب کاربری رو باید از بخش اجازه دسترسی یا user access یا security یا ACL یا هر چی که کنترل پنل سایت شما به اون اشاده کرده در این مورد، اضافه کنید و به اون full access بدید.
اگر روی لوکال و سیستم خودتون به چنین پیغامی برخورد کردید، در App_Data Folder Properties به قسمت Security رفته و Network Service را اضافه کنید و تیک Full Control را بزنید.
در کنار این مشکل، ممکنه خطاهای دیگه ای هم از برنامه شما گرفته بشه که با رعایت دو نکته زیر از پس اونها هم بر خواهید آمد:
1. حتما به این موضوع دقت کنید که ورژن دات نت نصب شده روی سرور از ورژن مورد استفاده شما بیشتر یا برابر باشه.
2. در وب کانفیگ web.config قسمت customErrors را به صورت زیر تغییر دهید تا تمامی خطاهای ایجاد شده به شما نشان داده شود:
<customErrors mode="Off" />
اگر در این حالت هم جزییات خطا به شما نشان داده نشد و فقط پیغام وجود خطا نمایش داده میشد، به احتمال فراوان ورژنی که شما از آن استفاده کردید در دات نت، به اونی که رو سرور هست یکی نیست و یا اینکه خود web.config شما مشکل دارد.
وقتی که روی لوکال از SQL Express استفاده میکنیم.
روی سیستم خودتان و در Visual Studio کدنویسی و طراحی خود را انجام داده اید و همه چی در سرور ویژوال استودیو خوب و کامل به نظر میرسد. یعنی در ویژوال استودیو وقتی F5 را میزنید سایت کار میکند، اطلاعات دیتابیس خونده میشه، میتونید اطلاعات جدید رو وارد کنید و خلاصه همه چی همونطور هست که باید باشه
به علت یک سری محدودیت های وب سرور ویژوال استودیو، مجبور میشید سایت رو در IIS که روی سیستم خودتان نصب شده هم ببینید. Virtual Directory را در IIS اضافه کرده و تنظیمات مربوطه را انجام میدهید. زمانی که میخواهید سایت را از طریق IIS ببینید به مشکل زیر برمیخورید:
Login failed for user NT AUTHORITY\NETWORK SERVICE
به ویژوال استودیو برمیگردید، F5 را میزنید. همه چیز درست کار میکند. مجوزهای دسترسی رو چک میکنید. همه چیز درست است. پس اشکال از کجاست؟
اگر به اینجا رسیدید، میتوان یقین داشت شما از ورژن Express در SQL Server استفاده میکنید. باید بدانید این نسخه به صورت رایگان پخش شده است و فقط برای استفاده شخصی شما در سیستم خودتان در زمان برنامه نویسی هست. بنابراین دقت کنید که:
در SQL Server Express Edition در یک زمان فقط امکان ایجاد یک ارتباط میباشد.
خوب، پس باید ویژوال استودیو را ببندید، چند ثانیه صبر کنید.. و حالا از طریق IIS دوباره امتحان کنید. می بینید که سایت شما به درستی کار خواهد کرد.
اگر از خاصیت Attach کردن فایل mdf یه sql server express استفاده میکنید، مثلا در حالت استفاده از membership پیش فرض دات نت، ممکن است مشکل برطرف نشود. ممکن است (به هر دلیلی) این فایل mdf شما به sql server به صورت فیزیکی attach شده باشد. در این حالت باید از طریق نرم افزار SSMS یا همون نرم افزار Sql Server Management Studio به سرور express نصب شده روی لوکال خود برید و با رایت کلیک کردن روی دیتابیس مربوطه، آن را Detach کنید.
چند پیشنهاد برای مواجهه با خطای کمتر
- از خاصیت Attach کردن فایلهای Mdf در sql server استفاده نکنید. درصد بالایی از هاست ها مخصوصا از نوع Shared Hosting، این امکان را در SQL Server خودشون به طور کامل غیر فعال کرده اند.
- هنگام ساختن قسمتهایی از web.config که نیاز به تعریف یک اسم دارند، مثل تعریف Provider ها و همچنین connection string ها از اسامی مخصوص به خودتان استفاده کنید و از نامهای پیش فرض که در web.config یا machine.config استفاده میشه، استفاده نکنید تا جلوی تداخل های احتمالی رو بگیرید.
- در هنگامی که روی لوکال و با IIS کار میکنید، بعد از تغییراتی که روی تنظیمات IIS و مجوز های دسترسی دادید، IIS را یکبار restart کنید.
در مواجهه با خطا در برنامه خودتون، نه الکی عصبی بشید نه اینکه بیخیال! به دنبال راه حل اون مشکل باشد و مطمئن باشید در این راه مطالب جدیدی را حتما یاد میگیرید.
مطالبی که عنوان شد تجربه های شخصی خودم بود و نه تمام خطاهایی که ممکن هست با اون مواجه بشید. اگر خطای دیگه ای هست به نظر شما به این موضوع ارتباط داره، عنوان کنید تا به مطلب اضافه بشه.
*این مطالب از خودم میباشد! اگر درآن اشتباهی میبینید، ممنون میشم که اعلام کنید. استفاده از این مطلب آزاد هست و اگر دوست دارید با انصاف باشید، منبع رو هم ذکر کنید.
http://mytoolbox.ir