PDA

View Full Version : سوال: راهنمایی در ساخت بانک اطلاعاتی SqlServer



booysusa
پنج شنبه 18 بهمن 1397, 13:01 عصر
با درود خدمت مهندسان عزیز
تا قبل از این، من برای برنامه هام از بانک اطلاعاتی SqlCompact استفاده می کردم ولی میخوام برای یکی از برنامه هام از Sql Server استفاده کنم، وارد محیط Microsoft SQL Server Management Studio 17 شدم و دیتابیس خودم رو طراحی کردم ولی شیوه فراخونی اون را در برنامه ویژال استودیو نمی دونم
توی نت هم گشتم، هرچی بیشتر می گشتم، کمتر می یافتم (احتمالا شیوه جستجوی من مناسب نبوده)

امکانش هست بگید اشکال من کجاست؟
و اینکه کوئری دیتابیس رو چطوری بنویسیم؟ (مبتدی وار باشد لطفا)


مشخصات برنامه من:
ویژال استودیو
زبان سی شارپ
ویندوز فرم
بانک اطلاعاتی: Sql Server
اینکه چرا از اس کیو ال سرور میخوام استفاده کنم (دلیل خاصی ندارد فقط نمیخوام برنامم بعدا بخاطر محدودیت های SqlCompact و یا محدودیت های SqlExpress به مشکل بر بخورد)

لطفا تصاویر را ببینید، مربوط به برنامه هست
این تصویر مربوط هست به برنامه اس کیو ال منیجمنت دیتابیس من با مشخصات زیر ساخته شده ولی نمیدونم چطوری آدرس کوئری رو به دست
http://s9.picofile.com/file/8351535492/photo_2019_02_07_10_28_06.jpg



این تصویر مربوط به به بخش دیتابیس برنامه من در ویژال استودیو، شیوه نوشتن کوئری بانک اطلاعاتی که در اس کیو ال منیجمنت ساختم رو نمیدونم

http://s9.picofile.com/file/8351535526/photo_2019_02_07_10_29_11.jpg

danialafshari
پنج شنبه 18 بهمن 1397, 13:18 عصر
با سلام
به جای اون عبارت میتونید از . استفاده کنید

SqlConnection con = new SqlConnection(@"Data Source=.;AttachDbFilename=" + Application.StartupPath + "\\mydb.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

اگر بلد نیستید connection string رو استخراج کنید برای بدست آوردنش میتونید از ویزارد استفاده کنید که کانکشن رو برای شما مشخص می کند
سایت https://www.connectionstrings.com/sql-server/ هم کمک کننده هست
در ضمن Sql Server Management System یک IDE هست که شما از طریقش میتونید به دیتابیس دسترسی پیدا کنید ولی اصل sql همون سرویسش هست شما میتونید حتی sql server 2005 رو هم با این IDE بالا بیاورید
موفق باشید

booysusa
پنج شنبه 18 بهمن 1397, 16:12 عصر
با سلام
به جای اون عبارت میتونید از . استفاده کنید

SqlConnection con = new SqlConnection(@"Data Source=.;AttachDbFilename=" + Application.StartupPath + "\\mydb.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");



سپاس مهندس، از این کد استفاده کردم ولی خطای زیر را داد
http://s8.picofile.com/file/8351558576/010.png

alexmcse
پنج شنبه 18 بهمن 1397, 17:24 عصر
متغییر کانکشن استرینگ را تز کجا آوردی داخل کد ها نبود
دو تا اس کیو ال کانکشن ساختی یکی con , myConnection
باید یکی استفاده کنی نه دو تا کانکشن

alexmcse
پنج شنبه 18 بهمن 1397, 17:25 عصر
سپاس مهندس، از این کد استفاده کردم ولی خطای زیر را داد
http://s8.picofile.com/file/8351558576/010.png


متغییر کانکشن استرینگ را از کجا آوردی داخل کد ها نبود
دو تا اس کیو ال کانکشن ساختی یکی con , myConnection
باید یکی استفاده کنی نه دو تا کانکشن

booysusa
پنج شنبه 18 بهمن 1397, 18:10 عصر
متغییر کانکشن استرینگ را از کجا آوردی داخل کد ها نبود
دو تا اس کیو ال کانکشن ساختی یکی con , myConnection
باید یکی استفاده کنی نه دو تا کانکشن


بله اصلاح کردم
http://s8.picofile.com/file/8351569084/012.PNG







ولی این خطا رو میده
http://s9.picofile.com/file/8351569250/013.PNG




شاید بخاطر این هست که بانک اطلاعاتی را تغییر دادم و از اس کیو ال کامپکت به اس کیو ال سرور نقل مکان کردم ، خطا میده، بنظرم بخاطر اینه که من توی رفرنسم Sql Server را ندارم
http://s9.picofile.com/file/8351569668/014.jpg



شاید بخاطر این هست که نام تیبل هام تغییر کرده
قبلا در SqlCompact اینجوری بود
http://s8.picofile.com/file/8351570250/015.PNG

الان که با Microsoft SQL Server Management Studio درست کردم اینجوری هست
http://s9.picofile.com/file/8351570050/016.PNG

booysusa
جمعه 19 بهمن 1397, 18:34 عصر
دوستان کسی نیست راهنمایی کنه؟

alexmcse
شنبه 20 بهمن 1397, 13:05 عصر
چند تا عکس است از لینک زیر دانلود کنید
طریقه وارد کردن دیتابیس به ویژوال استدیو 2017 از اس کیو ال منیجمنت

http://s9.picofile.com/file/8351701384/New_folder.rar.html

طریقه استفاده

private void Form1_Load(object sender, EventArgs e) {//نمایش داده ها
SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=DbSample;Integrated Security=True");
SqlCommand cmd = new SqlCommand("select * from TbCustomer ", cnn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;




}

booysusa
یک شنبه 21 بهمن 1397, 08:48 صبح
سپاسگزارم، راهنمای تصویری بسیار خوبی بود
این کارهایی که فرمودید رو انجام دادم، آدرس درست در اومد و دیتابیس در برنامه Visual Studio وارد شد
ولی پس از لود شدن برنامه، با اینکه کانکشن استرینگ رو ست کردم چیزی ظاهر نمیشه و امکان انجام عملیات Crud مانند Insert نیست!!

تصاویر زیر مروبط به خطای قسمت افزودن مخاطب جدید هست (به نظرم نام جدول در قسمت Insert را درست وارد کردم ولی خطا می دهد)
http://s8.picofile.com/file/8351772168/019.PNG


تصاویر زیر مروبط به ست کردن آدرس کانکش استرینگ هست
http://s8.picofile.com/file/8351772134/018.PNG


تصاویر زیر مروبط به قسمت Insert یکی از بخش های Crud هست
http://s9.picofile.com/file/8351771934/017.PNG


این هم تصویر دیتابیس و جدول های من است
http://s8.picofile.com/file/8351773768/020.PNG

ja_latifian
یک شنبه 21 بهمن 1397, 11:43 صبح
دوست من این روشی که داری میری از sqlcommand و sqlconnection و ... خیلی دمده شده و قدیمیه چند نسل بعدش اومده هم راحتتره و هم سرعتش بیشتره
این روشی که شما داری میری مال دات نت فریم ورک 1 هستش الان یه برنامه خوب اگه از امکانات دات نت 4و 4.5 استفاده نکنه لااقل از 3.5 باید استفاده کنه
لذا روشت را اصلاح کن برای راهنمایی میگم حداقل از dataset استفاده کن یا اگه بهترش را میخوای از LINQ که راحت تر هم هست

رامین مرادی
یک شنبه 21 بهمن 1397, 12:30 عصر
دوست من این روشی که داری میری از sqlcommand و sqlconnection و ... خیلی دمده شده و قدیمیه چند نسل بعدش اومده هم راحتتره و هم سرعتش بیشتره
این روشی که شما داری میری مال دات نت فریم ورک 1 هستش الان یه برنامه خوب اگه از امکانات دات نت 4و 4.5 استفاده نکنه لااقل از 3.5 باید استفاده کنه
لذا روشت را اصلاح کن برای راهنمایی میگم حداقل از dataset استفاده کن یا اگه بهترش را میخوای از LINQ که راحت تر هم هست

دمده بودن چه ربطی داره الان ؟ این بحث استفاده از تکنولوژی های قدیمی هیچوقت تمومی نداره. با این حرفتون باید سی و سی پلاس رو هم باید گذاشت کنار؟
خود من با ado.net کد میزنم. کوئری دارم که خیلی خیلی خیلی خیلی سخت بتونید با لینک درستش کنید. خیلی وقتا هم که با انتیتی جلو میرید ممکنه مجبور شید از ado.net هم استفاده کنید برا یه سری کوئری ها. کلا هرکی با هر فریمورکی راحته با اون کار میکنه. یکی دنبال سرعت تو کد نویسیه .یکی دنبال دست باز بودنه و محدود نبودنه . یکی دنبال سرعت اجرای دستوراتشه.
خلاصه هر کی برای یه کاری از یه روشی استفاده میکنه.

alexmcse
یک شنبه 21 بهمن 1397, 15:31 عصر
سپاسگزارم، راهنمای تصویری بسیار خوبی بود
این کارهایی که فرمودید رو انجام دادم، آدرس درست در اومد و دیتابیس در برنامه Visual Studio وارد شد
ولی پس از لود شدن برنامه، با اینکه کانکشن استرینگ رو ست کردم چیزی ظاهر نمیشه و امکان انجام عملیات Crud مانند Insert نیست!!

تصاویر زیر مروبط به خطای قسمت افزودن مخاطب جدید هست (به نظرم نام جدول در قسمت Insert را درست وارد کردم ولی خطا می دهد)
http://s8.picofile.com/file/8351772168/019.PNG


تصاویر زیر مروبط به ست کردن آدرس کانکش استرینگ هست
http://s8.picofile.com/file/8351772134/018.PNG


تصاویر زیر مروبط به قسمت Insert یکی از بخش های Crud هست
http://s9.picofile.com/file/8351771934/017.PNG


این هم تصویر دیتابیس و جدول های من است
http://s8.picofile.com/file/8351773768/020.PNG


private void button1_Click(object sender, EventArgs e) {//متناسب با کانکشن استرینگ و جدول وستون پروژه شما باید تغییر کند
// تست کردم جواب داد
SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=DbSample;Integrated Security=True");
SqlCommand cmd = new SqlCommand("INSERT INTO TbCustomer(Name) VALUES(@Name)", cnn);
cmd.Parameters.AddWithValue("@Name", "AMIR");
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
View();
}


private void View()
{
SqlCommand cmd = new SqlCommand("select * from TbCustomer ", cnn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
}

booysusa
دوشنبه 22 بهمن 1397, 19:48 عصر
private void button1_Click(object sender, EventArgs e) {//متناسب با کانکشن استرینگ و جدول وستون پروژه شما باید تغییر کند
// تست کردم جواب داد
SqlConnection cnn = new SqlConnection("Data Source=.;Initial Catalog=DbSample;Integrated Security=True");
SqlCommand cmd = new SqlCommand("INSERT INTO TbCustomer(Name) VALUES(@Name)", cnn);
cmd.Parameters.AddWithValue("@Name", "AMIR");
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
View();
}


private void View()
{
SqlCommand cmd = new SqlCommand("select * from TbCustomer ", cnn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
}


سپاسگزارم بابت توضیحات


من متوجه شدم تا وقتی بانک اطلاعاتی من به برنامه sql mangmanet وصل هست، من برای اجرای برنامه ام مشکلی ندارم، به محض deatach کردن بانک اطلاعاتی ام در برنامه sql mangmanet ، برنامه من دیگر در ویژال استودیو لود نمی شود و خطای زیر را می دهد
بنظرتان دلیلش چی هست؟

http://s9.picofile.com/file/8351928718/01.jpg

alexmcse
دوشنبه 22 بهمن 1397, 20:09 عصر
خوب این ارور طبیعی است زمانی که میخواهید از دیتابیس استفاده کنید باید اتچ کنید و در پایان کا ر باید دیتچ کنید
برنامه باید اینطور باشد

booysusa
دوشنبه 22 بهمن 1397, 20:57 عصر
خوب این ارور طبیعی است زمانی که میخواهید از دیتابیس استفاده کنید باید اتچ کنید و در پایان کا ر باید دیتچ کنید
برنامه باید اینطور باشد

سپاس
حال اگر پروژه من به مراحل پایانی رسید باید چطور deatach کنم که دیگر این خطا را ندهد

alexmcse
دوشنبه 22 بهمن 1397, 21:32 عصر
سلام دوست عزیز
مثال بزنم
شما زمانی وارد منزل میشوید در میزنید و کسی از درون خانه در را روی شما باز میکند و شما وارد خانه میشوید اتچ کردن به این معنی است که شما وارد دیتابیس میشوید و عملیات اضافه و ویرایش را انجام میدهید

حالا میخواهید از خانه خارج شوید بعد از خارج شدن درب را میبندید این به معنی دیتچ کردن است (یعنی شما کار با دیتابیس را تمام کرده اید)و از برنامه خارج میشوید

واضح است که بعد از دیتچ کردن برنامه ارور میدهد چرا که دیتابیس بسته شده است

برای اتچ ودیتچ کردن باید کانکشن استرینگ را ست کنید
ببخشید الان حضور ذهن ندارم جستجو در انجمن و اینترنت یا تاپیک مستقل بزنید جواب بدست میآورید
موفق باشید

alexmcse
دوشنبه 22 بهمن 1397, 21:37 عصر
اتچ کردن : وصل شدن به دیتابیس
دیتچ کردن :قطع ارتباط با دیتابیس

یک نمونه از اتچ (کلاس)

public class AttachDB {
private const string Str = "server=(local);trusted_connection=yes;";
private readonly string _command = @"CREATE DATABASE[ServiceList_DB] ON(FILENAME = N'D:\export\AppSourceCollection\AppSourceCollectio n\Database\ServiceList_DB.mdf'),(FILENAME = N'D:\export\AppSourceCollection\AppSourceCollectio n\Database\ServiceList_DB_log.ldf')FOR ATTACH";
public AttachDB()
{
var cnn = new SqlConnection(Str);
var cmd = new SqlCommand(_command, cnn) { CommandType = CommandType.Text };


cnn.Open();
try
{
cmd.ExecuteNonQuery();
MessageBox.Show(@"Attach");
}
catch (SqlException exception)
{
MessageBox.Show(exception.Message);
}
cnn.Close();
}
}

booysusa
دوشنبه 22 بهمن 1397, 22:00 عصر
اتچ کردن : وصل شدن به دیتابیس
دیتچ کردن :قطع ارتباط با دیتابیس



سپاسگزارم بابت توضیحات
بله معنی اتچ و دی اتچ میدونم، مثال شما جالب بود:قلب:

این دستور من هست (برنامه سه لایه هست)
public bool ExecuteCommand(string command, List<SqlParameter> parameters)
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = connectionString;
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = command;

foreach (SqlParameter param in parameters)
{
myCommand.Parameters.Add(param);
}
try
{
myConnection.Open();
int result = myCommand.ExecuteNonQuery();
myConnection.Close();
if (result > 0)
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}


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


منظور من این هست تا کی باید اول من در برنامه اس کیو ال منیجمنت وارد شوم و کانکت بشوم و دیتابیس را اتچ کنم سپس بروم در برنامه ویژال استودیو برنامه را ران کنم که برنامه من به خطا بر نخورد
نمیدونم تونستم منظورمو برسونم یا خیر

alexmcse
دوشنبه 22 بهمن 1397, 22:14 عصر
به ترتیب انجام دهید
1 وارد برنامه شوید (زمانیکه میخواهید دیتابیس را ویرایش کنید )
2 اتچ کنید به دیتابیس
3 عملیات ویرایش را انجام دهید (اضافه یا حدف)
4بعد از انجام و.یرایش دیتابیس را دیتچ کنید

کانکشن استرینگ درون کد شما نوشته نشده است

booysusa
سه شنبه 23 بهمن 1397, 08:58 صبح
به ترتیب انجام دهید
1 وارد برنامه شوید (زمانیکه میخواهید دیتابیس را ویرایش کنید )
2 اتچ کنید به دیتابیس
3 عملیات ویرایش را انجام دهید (اضافه یا حدف)
4بعد از انجام و.یرایش دیتابیس را دیتچ کنید
من دیگر نیازی به ویرایش Table هایم ندارم، منظور از ویرایش و حذف این هست؟ یا اینکه ویرایش و حذف Crud ؟؟؟



کانکشن استرینگ درون کد شما نوشته نشده است
آدرس کانکشن استرینگ من
public const string connectionString = @"Data Source=.;Initial Catalog = PhonebookDB; Integrated Security = True";

public bool ExecuteCommand(string command, List<SqlParameter> parameters)
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = connectionString;
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = command;

foreach (SqlParameter param in parameters)
{
myCommand.Parameters.Add(param);
}
try
{
myConnection.Open();
int result = myCommand.ExecuteNonQuery();
myConnection.Close();
if (result > 0)
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
}