PDA

View Full Version : حرفه ای: طریقه ایجاد database برای جلوگیری از خطای unc و permission



Mina74
یک شنبه 16 آبان 1395, 15:22 عصر
سلام مهندسین عزیز

من دیتابیسم رو از طریق کد های سی شارپ و اسکریپت ها میسازم.
یعنی یه فرم ایجاد کردم این امکان رو قرار دادم که کاربر با زدن بر روی دکمه ایجاد دیتابیس.
دیتابیس رو روی هر سروری بسازه و اتومات اتچ کنه.به محض ایجاد دیتابیس.فایل های .mdf و .ldf کنار .exe پروژه قرار میگیرند.
تا این مرحله مشکلی ندارم.
فقط مشکل من زمانیه که پروژه توی درایو ویندوز نصب بشه .حالا هر درایوی :معمولا توی c هست.
دیگه دیتابیس ایجاد نمیشه.یا اگه هم بشه دیگه به پروژه کانکت نمیشه.
خطاهایی که میده
unc Share
پرمیژن
erorr access dined
.
دوستان برای حل این مشکل چکار کنم؟
لطفا راهنمایی بفرمایید. راه حل رو لطف کنید بگید.
سپاس فراوان.

جستجو زیاد کردم بی نتیجه بود.

juza66
یک شنبه 16 آبان 1395, 17:44 عصر
سلام خانم مینا

شما کد ایجاد کردن تون رو بذارید شاید با کمی تغییرات این نحوه دسترسی داشتن به درایو سی رو بدست اورد


روش من اینه که یک فایل پشتیبان رو بازیابی میکنم اینجوری مستقیا درون درایو سی قرار میگیره، با کد البته


یک راه هم خود مایکروسافت ارائه داده
https://support.microsoft.com/en-us/kb/307283

ایا اسکریپت رو کامند قرار میدید؟

روشی که گفتم اجرا کردید؟

Mina74
سه شنبه 18 آبان 1395, 10:42 صبح
ایا اسکریپت رو کامند قرار میدید؟

روشی که گفتم اجرا کردید؟

ممنونم که وقت میزارین.
روش من همون روش مایکروسافته که لینک گذاشتین.
متاسفانه موفق نشدم.
ممنون میشم بیشتر راهنمایی بفرمایید.

black_fire667
پنج شنبه 20 آبان 1395, 17:47 عصر
سلام اساتید محترم.
لطفا راهنمایی بفرمایید.ممنونم

سلام
اول اینکه توصیه بسیار بسیار بسیار زیاد میکنم که یه دیتابیس ایجاد کنید و بصورت دستی روی سرور مورد نظر Attach یا Restore کنید. اینجوری بهتر هست!
اما اگر به هر دلیلی نیاز دارید که با کدنویسی بانک رو ایجاد کنید توصیه میکنم مسیر فایلها رو جایی غیر از درایو سی بزارید! با یه بررسی ساده درایوهای سیستم رو
پیمایش کنید و درایوی غیر از سی یا درایو ویندوز رو انتخاب کنید!

اما اگر باز هم نیاز بود که درایو سی باشه اینسری مجبورید به یوزری که دارید استفاده میکنید پریمیژن اون پوشه رو به یوزر مورد استفادتون بدین!

اینا همرو گفتم! ولی اگر مایل باشی میتونی سورس کدتو بزاری و خودمون بررسی کنیم تا مشکل رو برطرف کنیم!

Mina74
پنج شنبه 20 آبان 1395, 19:59 عصر
سلام
اول اینکه توصیه بسیار بسیار بسیار زیاد میکنم که یه دیتابیس ایجاد کنید و بصورت دستی روی سرور مورد نظر Attach یا Restore کنید. اینجوری بهتر هست!
اما اگر به هر دلیلی نیاز دارید که با کدنویسی بانک رو ایجاد کنید توصیه میکنم مسیر فایلها رو جایی غیر از درایو سی بزارید! با یه بررسی ساده درایوهای سیستم رو
پیمایش کنید و درایوی غیر از سی یا درایو ویندوز رو انتخاب کنید!

اما اگر باز هم نیاز بود که درایو سی باشه اینسری مجبورید به یوزری که دارید استفاده میکنید پریمیژن اون پوشه رو به یوزر مورد استفادتون بدین!

اینا همرو گفتم! ولی اگر مایل باشی میتونی سورس کدتو بزاری و خودمون بررسی کنیم تا مشکل رو برطرف کنیم!


String str;
SqlConnection myConn = new SqlConnection ("Server=localhost;Integrated security=SSPI;database=master");

str = "CREATE DATABASE MyDatabase ON PRIMARY " +
"(NAME = MyDatabase_Data, " +
"FILENAME = 'C:\\MyDatabaseData.mdf', " +
"SIZE = 2MB, MAXSIZE = 10MB, FILEGROWTH = 10%) " +
"LOG ON (NAME = MyDatabase_Log, " +
"FILENAME = 'C:\\MyDatabaseLog.ldf', " +
"SIZE = 1MB, " +
"MAXSIZE = 5MB, " +
"FILEGROWTH = 10%)";

SqlCommand myCommand = new SqlCommand(str, myConn);
try
{
myConn.Open();
myCommand.ExecuteNonQuery();
MessageBox.Show("DataBase is Created Successfully", "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
if (myConn.State == ConnectionState.Open)
{
myConn.Close();
}
}




سپاس

black_fire667
پنج شنبه 20 آبان 1395, 20:53 عصر
خواهش می کنم .

ببینید دلیل خاصی نداره که حتما حتما بصورت دستی ایجاد یا اتچ بشه! ولی من شخصا ترجیح میدم برای نصب نرم افزار خودم توی سازمان مشتری حضور داشته باشم و اینکار رو دستی انجام بدم. اینجوری در صورت بروز چنین مشکلاتی در دم برطرفش میکنم و دیگه مشتری ازم باگ نمیبینه!

منظورم فایل MDF و LDF مربوط به دیتابیس هست که توی کدتون تو مسیر ریشه درایو سی گذاشتید!

ببینید منظورم از اینکه گفتم پرمیژن بدین به یوزر منظورم یوزری که دسترسی فول داشته باشه! بصورت پیشفرض یوزر Administrator


و اما رفع اشکال :
یه پوشه توی یکی از درایوها بسازید(حتی درایو سی) و بعد اون دوتا عدد مربوط به سایز رو به ۳ تغییر بده!
کد نهایی به شکل زیر میشه - توجه کنید که من یه پوشه به نام e توی درایو سی ساختم و این کد رو اجرا کردم! شما به میل خودتون تغییر بدین
String str;
SqlConnection myConn = new SqlConnection("Server=localhost;Integrated security=SSPI;database=master");

str = "CREATE DATABASE MyDatabase ON PRIMARY " +
"(NAME = MyDatabase_Data, " +
"FILENAME = 'C:\\e\\MyDatabaseData.mdf', " +
"SIZE = 3MB, MAXSIZE = 10MB, FILEGROWTH = 10%) " +
"LOG ON (NAME = MyDatabase_Log, " +
"FILENAME = 'C:\\e\\MyDatabaseLog.ldf', " +
"SIZE = 3MB, " +
"MAXSIZE = 5MB, " +
"FILEGROWTH = 10%)";

SqlCommand myCommand = new SqlCommand(str, myConn);
try
{
myConn.Open();
myCommand.ExecuteNonQuery();
MessageBox.Show("DataBase is Created Successfully", "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
if (myConn.State == ConnectionState.Open)
{
myConn.Close();
}
}

شما میتونید قبل از اجرای کد مربوط به ایجاد دیتابیس ابتدا با کدنویسی پوشه مربوطه رو بسازید بعد اقدام به اجرای کدهای دیتابیس کنید که دیگه مشکلیم نباشه

Mina74
پنج شنبه 20 آبان 1395, 23:30 عصر
ممنونم


ببینید دلیل خاصی نداره که حتما حتما بصورت دستی ایجاد یا اتچ بشه! ولی من شخصا ترجیح میدم برای نصب نرم افزار خودم توی سازمان مشتری حضور داشته باشم و اینکار رو دستی انجام بدم. اینجوری در صورت بروز چنین مشکلاتی در دم برطرفش میکنم و دیگه مشتری ازم باگ نمیبینه!

شما چطور 2فایل دیتابیس رو میبرید تو سیستم مقصد اتچ میکنید؟با چه کانکشن استرینگی؟رو اکسپرس؟)(خب وقتی مشتریت مشهد باشه و تو هم شیراز بعد اینترنت نداشته باشه.نمیشه رفت برا مشتری دستی انجام داد.درسته؟یه راه حل برا این؟



ببینید منظورم از اینکه گفتم پرمیژن بدین به یوزر منظورم یوزری که دسترسی فول داشته باشه! بصورت پیشفرض یوزر Administrator

من ادمینستریتور هم میکردم باز خطا میداد/


بنده 3تا سیستم دارم که یکی درایو ویندوزش درایو C هست
یکی اصلا درایوی به نام C نداره و درایو ویندوزش F هست.
یکی هم درایو C داره اما درایو ویندوزش G هست.

و من ستاپم را رو هر کدوم میبرم خودش اتومات درایو ویندوز رو پیدا میکنه.
و کد شما این مشکل من رو برطرف نمیکنه.؟
و پوشه رو چطور تو درایو سی ایجاد کنم در صورتی که اصلا وجود نداره.

من این رو لحاظ کردم

Application.StartupPath, dbName + ".mdf
باید چکار کنم؟؟؟


آیا من پوشه ایجاد کنم مشکلم حل میشه؟
آیا میتونم با این کد درایو ویندوز رو پیدا کنم و پوشه رو در اون ایجاد کنم؟

http://barnamenevis.org/showthread.php?84796-%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AF%D8%B1%D8%A7%DB%8C%D9%88-%D9%88-%D9%BE%D9%88%D8%B4%D9%87-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2
سپاس

Mina74
جمعه 21 آبان 1395, 00:19 صبح
تو یکی از سیستم هام که ویندوزش تو درایو سی هست و ویندوزش 10 هست با خطای زیر مواجه میشم.

143438

143439



درصورتی که یه ویندوز 7 دارم تو یه درای غیر ویندوزی ران میکنم اونجا بدون خطا کار میکنه.

محمد آشتیانی
جمعه 21 آبان 1395, 03:38 صبح
سلام
موقعی که اقدام به ایجاد دیتابیس می کنید ، در حقیقت یوزر مربوط به سرویس Sql Server هست که باید دسترسی های لازم رو برای ایجاد فایل داشته باشه ، در ویندوزهای 8 و بعد از اون سختگیری بیشتری روی درایو سیستمی اعمال شده و بصورت پیش فرض مجوزها محدود هستن. خب حالا چه کنیم؟


راه اول: دم دستی ترین راه اینه که از طریق ویندوز به یوزر سرویس اسکیوال سرور دسترسی به فولدر مورد نظر رو بدیم


راه دوم: از طریق کد


این Namespace ها رو اضافه کنید

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;



این متد رو هم بنویسید:

private void SetPermission(string directoryName, SecurityIdentifier userAccount, FileSystemRights userRights, AccessControlType accessType)
{
try
{
var myDirectoryInfo = new DirectoryInfo(directoryName);
var myDirectorySecurity = myDirectoryInfo.GetAccessControl();

myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(userAccount, userRights,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, accessType));

myDirectoryInfo.SetAccessControl( myDirectorySecurity);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}



متد فوق رو به اینصورت فراخوانی کنید:

SetPermission(@"C:\", new SecurityIdentifier(WellKnownSidType.WorldSid,null) , FileSystemRights.FullControl, AccessControlType.Allow);

در فراخوانی ، پارامتر اول آدرس فولدری میشود که قرار است دسترسی هاش رو تغییر بدیم (همون فولدری که قراره دیتابیس داخلش ایجاد بشه)


اسکریپت ایجاد دیتابیس رو بعد از انجام مراحل بالا اجرا کنید.

پ ن: دقت کنید اگر با خطایی در حین تنظیم دسترسی ها برخوردید ، برنامتون رو بصورت Run as administrator اجرا کنید.




موفق باشید.

Mina74
دوشنبه 18 بهمن 1395, 20:34 عصر
سلام
موقعی که اقدام به ایجاد دیتابیس می کنید ، در حقیقت یوزر مربوط به سرویس Sql Server هست که باید دسترسی های لازم رو برای ایجاد فایل داشته باشه ، در ویندوزهای 8 و بعد از اون سختگیری بیشتری روی درایو سیستمی اعمال شده و بصورت پیش فرض مجوزها محدود هستن. خب حالا چه کنیم؟


راه اول: دم دستی ترین راه اینه که از طریق ویندوز به یوزر سرویس اسکیوال سرور دسترسی به فولدر مورد نظر رو بدیم


راه دوم: از طریق کد


این Namespace ها رو اضافه کنید

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;



این متد رو هم بنویسید:

private void SetPermission(string directoryName, SecurityIdentifier userAccount, FileSystemRights userRights, AccessControlType accessType)
{
try
{
var myDirectoryInfo = new DirectoryInfo(directoryName);
var myDirectorySecurity = myDirectoryInfo.GetAccessControl();

myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(userAccount, userRights,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, accessType));

myDirectoryInfo.SetAccessControl( myDirectorySecurity);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}



متد فوق رو به اینصورت فراخوانی کنید:

SetPermission(@"C:\", new SecurityIdentifier(WellKnownSidType.WorldSid,null) , FileSystemRights.FullControl, AccessControlType.Allow);

در فراخوانی ، پارامتر اول آدرس فولدری میشود که قرار است دسترسی هاش رو تغییر بدیم (همون فولدری که قراره دیتابیس داخلش ایجاد بشه)


اسکریپت ایجاد دیتابیس رو بعد از انجام مراحل بالا اجرا کنید.

پ ن: دقت کنید اگر با خطایی در حین تنظیم دسترسی ها برخوردید ، برنامتون رو بصورت Run as administrator اجرا کنید.




موفق باشید.


سلام. استاد گرامی حقیقتش من نتونستم به این شیوه پیاده سازی کنم و اصلا نشد به فولدر اجازه دسترسی بدم

ممنون میشم بیشتر راهنمایی کنید.
سپاسگذارم

Mina74
چهارشنبه 20 بهمن 1395, 15:34 عصر
کسی نیست یعنی؟

محمد آشتیانی
پنج شنبه 21 بهمن 1395, 13:29 عصر
سلام
مشکلش چیه؟ بنده بارها این رو تست کردم ، مشکلی نداشته ، کافیه برنامتون رو فقط یک بار بصورت Run As Administrator اجرا کنید و با متد بالا به فولدری که مد نظرتون هست دسترسی کامل بصورت Everyone به اون فولدر بدید.
بعدش مشکلی با اجرای اسکریپت نباید داشته باشید.

اگر حل نشد ، پروژتون رو و یا یک پروژه تستی که مشکل داره رو اینجا بذارید لطفا