PDA

View Full Version : سوال: مشکل در نوشتن کد جستجو در دیتابیس



booysusa
چهارشنبه 10 بهمن 1397, 21:52 عصر
درود دوستان گرامی

برنامه من 3 لایه هست، برای برنامه ام یک جستجوی ساده قرار دادم ولی توی نوشتن کدش به مشکل بر خوردم، برای برنامه قبلیم که برنامه ای ساده تر بود، کدهارو پشت هر فرم می نوشتم (بشدت مبتدی تر از الان بودم) برای مثال جستجو را به شکل زیر نوشتم و کار می کردم ولی در برنامه جدید کمی به مشکل بر خوردم
لطفا اگر امکانش هست کدم را اصلاح کنید
سپاس از همه اساتید عزیز

کدهای قدیمی من
public void SearchLastNameFromDatabase() //جستجو اعضا بر اساس نام خانوادگی
{
SqlCeConnection myConnection = new SqlCeConnection();
myConnection.ConnectionString = @"Data Source=K:\Programs\DateBases\GhazaiiDB.sdf";

SqlCeCommand myCommand = new SqlCeCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = "Select * from [User] where LastName Like @LastName";
myCommand.Parameters.AddWithValue("@LastName", "%" + txtSearchParameters.Text + "%");

DataTable myDataTable = new DataTable();
SqlCeDataAdapter myDataAdapter = new SqlCeDataAdapter();
myDataAdapter.SelectCommand = myCommand;
myDataAdapter.Fill(myDataTable);

dataGridView1.DataSource = myDataTable;
}


کدهای جدید که باید اصلاح بشوند
public bool SearchLastNameFromDatabase() //جستجو اعضا بر اساس نام خانوادگی
{
string command = "Select * from [Contact] where [LastName] Like @LastName";

List<SqlCeParameter> parametersList = new List<SqlCeParameter>();
var LastNameParameter = new SqlCeParameter("@LastName", "%" + this.LastName + "%");

parametersList.Add(LastNameParameter);

var db = new DataAcsess.DatabaseManager();
var result = db.ExecuteScalar(command, parametersList);
if (result == 1)
{
return true;
}
else
return false;
}

ولی میدونم کد رو اشتباه نوشتم، یکی از دوستان گفت که به جای ExecuteScalar از ExecuteNonequery استفاده کنید ولی متوجه نشدم باید چی کنم

ویژال استودیو
زبان: سی شارپ
دیتابیس: اس کیو ال کامپکت

voice.of.silence
پنج شنبه 11 بهمن 1397, 07:08 صبح
سلام. من از این روش استفاده می کنم. یک لایه برای اتصال به پایگاه داده که فقط یک کلاس Connection داره. و یک لایه برای ارسال دستورات SQL و سایر دستورات مورد نیاز برنامه که از طریق لایه ی اتصال به پایگاه داده وصل می شه، در لایه ی اتصال کدهای دیگر نمی نویسم چرا که می توان فقط با تغییر StringConnection در سایر پروژه ها هم استفاده کرد.
کد لایه ی اتصال:

using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;


namespace Data_Access
{
public class Connection
{
SqlConnection con;
SqlCommand cmd;
SqlDataAdapter sda;
DataTable dt;


public Connection()
{
con = new SqlConnection();
cmd = new SqlCommand();
sda = new SqlDataAdapter();
dt = new DataTable();


}


public void link()
{
con.ConnectionString= "Data Source=.;Initial Catalog=Library_mgr;Integrated Security=True";
con.Open();
}


public void unlink()
{
con.Close();


}


public void command_line(string query)
{
cmd.CommandText = query;
cmd.Connection = con;
cmd.ExecuteNonQuery();


}


public DataTable select_command(string query)
{
cmd.CommandText = query;
cmd.Connection = con;
sda = new SqlDataAdapter(cmd);
sda.Fill(dt);
return dt;




}


}
//end of class.


}




در لایه ی دیگر یا businessLayer :


using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Data_Access;


namespace business_Logic.bl_users
{
public class bl_users: Connection
{
public string un, pass, email,job,status, dt;


public void add_users()
{
base.link();
string query = "insert into tbl_users(un,pass,email,job,status)values(N'{0}',N '{1}',N'{2}',N'{3}',N'{4}')";
query = string.Format(query, un, pass, email, job, status);
base.command_line(query);
base.unlink();


}
//end of adding users.


public void update_users()
{
base.link();
string query = "update tbl_users set pass=N'{0}' , email=N'{1}' , job=N'{2}' , status=N'{3}' where un=N'{4}'";
query = string.Format(query, pass, email,job, status, un);
base.select_command(query);
base.unlink();


}
//end of updating users.




public void delete_users()
{
base.link();
string query = "delete tbl_users where un=N'{0}'";
query = string.Format(query, un);
base.command_line(query);
base.unlink();


}
//end of deleting users.




public DataTable select_users()
{
base.link();
string query = "select un,pass,job,email,status,dt from tbl_users";
DataTable dt = base.select_command(query);
base.unlink();
return dt;


}
//end of selecting users.


public DataTable check_existing_users()
{
base.link();
string query = "select un from tbl_users where un=N'{0}'";
query = string.Format(query, un);
DataTable dt = base.select_command(query);
base.unlink();
return dt;


}
//end of checking existing users.


public DataTable select_user_by_user()
{
base.link();
string query = "select un,pass,job,email,status,dt from tbl_users where un like N'{0}%'";
query = string.Format(query, un);
DataTable dt = base.select_command(query);
base.unlink();
return dt;


}
//end of selecting user by user name.


public DataTable select_user_by_job()
{
base.link();
string query = "select un,pass,job,email,status,dt from tbl_users where job=N'{0}'";
query = string.Format(query, job);
DataTable dt = select_command(query);
base.unlink();
return dt;
}
//end of selecting user by job style.


public DataTable select_user_by_status()
{
base.link();
string query = "select un,pass,job,email,status from tbl_users where status=N'{0}'";
query = string.Format(query, status);
DataTable dt = select_command(query);
base.unlink();
return dt;
}
// selecting users using status if acctive or not.


public DataTable select_user_by_email()
{
base.link();
string query = "select un,pass,job,email,status,dt from tbl_users where email like N'{0%}'";
query = string.Format(query, email);
DataTable dt = base.select_command(query);
base.unlink();
return dt;


}
//loading user by email like.


public DataTable select_users_names()
{
base.link();
string query = "select un from tbl_users";
DataTable dt = base.select_command(query);
base.unlink();
return dt;


}
//end of selecting.




public DataTable select_user_by_username()
{
base.link();
string query = "select un,pass,job,email,status from tbl_users where un=N'{0}'";
query = string.Format(query, un);
DataTable dt = base.select_command(query);
base.unlink();
return dt;


}
//end of selecting user by usernames.






}
//end of class.


}




امید است که کارامد باشد برای شما.
موفق باشید.

booysusa
پنج شنبه 11 بهمن 1397, 08:44 صبح
سپاس که پاسخ دادید
شما بسیار حرفه ای کار کردید ولی متاسفانه من هنوز دانش برنامه ام به اندازه شما نیست و امکان استفاده از کد شما را ندارم، اگر امکانش هست کدی که ارسال کرده ام را ویرایش کنید ممنون میشوم

jafarpalideh
پنج شنبه 11 بهمن 1397, 13:57 عصر
درود دوستان گرامی

برنامه من 3 لایه هست، برای برنامه ام یک جستجوی ساده قرار دادم ولی توی نوشتن کدش به مشکل بر خوردم، برای برنامه قبلیم که برنامه ای ساده تر بود، کدهارو پشت هر فرم می نوشتم (بشدت مبتدی تر از الان بودم) برای مثال جستجو را به شکل زیر نوشتم و کار می کردم ولی در برنامه جدید کمی به مشکل بر خوردم
لطفا اگر امکانش هست کدم را اصلاح کنید
سپاس از همه اساتید عزیز

کدهای قدیمی من
public void SearchLastNameFromDatabase() //جستجو اعضا بر اساس نام خانوادگی
{
SqlCeConnection myConnection = new SqlCeConnection();
myConnection.ConnectionString = @"Data Source=K:\Programs\DateBases\GhazaiiDB.sdf";

SqlCeCommand myCommand = new SqlCeCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = "Select * from [User] where LastName Like @LastName";
myCommand.Parameters.AddWithValue("@LastName", "%" + txtSearchParameters.Text + "%");

DataTable myDataTable = new DataTable();
SqlCeDataAdapter myDataAdapter = new SqlCeDataAdapter();
myDataAdapter.SelectCommand = myCommand;
myDataAdapter.Fill(myDataTable);

dataGridView1.DataSource = myDataTable;
}


کدهای جدید که باید اصلاح بشوند
public bool SearchLastNameFromDatabase() //جستجو اعضا بر اساس نام خانوادگی
{
string command = "Select * from [Contact] where [LastName] Like @LastName";

List<SqlCeParameter> parametersList = new List<SqlCeParameter>();
var LastNameParameter = new SqlCeParameter("@LastName", "%" + this.LastName + "%");

parametersList.Add(LastNameParameter);

var db = new DataAcsess.DatabaseManager();
var result = db.ExecuteScalar(command, parametersList);
if (result == 1)
{
return true;
}
else
return false;
}

ولی میدونم کد رو اشتباه نوشتم، یکی از دوستان گفت که به جای ExecuteScalar از ExecuteNonequery استفاده کنید ولی متوجه نشدم باید چی کنم

ویژال استودیو
زبان: سی شارپ
دیتابیس: اس کیو ال کامپکت
برنامه رو تریس کن .
یه بریک پوینت بزار .
ببین چه کوئری سمت SQL میره .
همون کوئری رو تویه SQL اجرا کن .
احتمالا مشکل از تک کوتیشن باشه .

booysusa
جمعه 12 بهمن 1397, 20:45 عصر
برنامه رو تریس کن .
یه بریک پوینت بزار .
ببین چه کوئری سمت SQL میره .
همون کوئری رو تویه SQL اجرا کن .
احتمالا مشکل از تک کوتیشن باشه .

سپاسگزارم ولی من کد رو میخوام

booysusa
جمعه 12 بهمن 1397, 20:47 عصر
کدش رو به لطف و کمک یکی از اساتید نوشتیم
سپاس از همگی که وقت گذاشتن و این پست را مطالعه کردند

کد را می نویسم شاید روزی به درد کسی خورد
//DataAccess:
public DataTable SearchData(string command, List<SqlCeParameter> parameters)
{
SqlCeConnection myConnection = new SqlCeConnection();
myConnection.ConnectionString = connectionString;
SqlCeCommand myCommand = new SqlCeCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = command;
foreach (SqlCeParameter param in parameters)
{
myCommand.Parameters.Add(param);
}
DataTable result = new DataTable();
SqlCeDataAdapter myDataAdapter = new SqlCeDataAdapter();
myDataAdapter.SelectCommand = myCommand;

try
{
myDataAdapter.Fill(result);
return result;
}
catch
{
return null;
}
}

//User:
public List<User> Search(string SearchKey)
{
string command = "Select * from [User] where [LastName] Like @LastName";
List<SqlCeParameter> parametersList = new List<SqlCeParameter>();
parametersList.Add(new SqlCeParameter("@LastName", SearchKey));

var db = new DataAccess.DatabaseManager();
var result = db.SearchData(command, parametersList);

List<User> lstResult = new List<User>();
foreach (DataRow r in result.Rows)
{
User user = new User();
user.ID = Convert.ToInt64(r["ID"]);
user.FirstName = r["FirstName"].ToString();
user.LastName = r["LastName"].ToString();
user.Username = r["Username"].ToString();
user.Password = r["Password"].ToString();

lstResult.Add(user);
}

return lstResult;
}

barnamenevisjavan
شنبه 13 بهمن 1397, 18:20 عصر
چرا خودتون رو اذیت میکنید و درگیر این همه کد و پیچیدگی میکنید؟ بهتره از انتیتی فریمورک استفاده کنید تا دیگه این مشکلات رو نداشته باشید

booysusa
شنبه 13 بهمن 1397, 21:11 عصر
چرا خودتون رو اذیت میکنید و درگیر این همه کد و پیچیدگی میکنید؟ بهتره از انتیتی فریمورک استفاده کنید تا دیگه این مشکلات رو نداشته باشید

هنوز انتیتی فریمورک را فرا نگرفتم
آموزش درست و حسابی سراغ دارید بفرستید که این ترس ما از انتیتی فریمورک از بین برود:لبخند:

رامین مرادی
یک شنبه 14 بهمن 1397, 08:53 صبح
چرا خودتون رو اذیت میکنید و درگیر این همه کد و پیچیدگی میکنید؟ بهتره از انتیتی فریمورک استفاده کنید تا دیگه این مشکلات رو نداشته باشید


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


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

jafarpalideh
یک شنبه 14 بهمن 1397, 11:06 صبح
والا همه پیشنهاد میکنن با انتیتی کارکنیم . من خودم با ado.net کار میکنم تا حالا هم مشکلاتی نداشتم و اگه پیش اومده اونقدر دست آدم توش بازه که به راحتی بتونه مشکلاتو حل کنه
و اما اصل کاری همین آموزش انتیتی که هیچ جا یه آموزش کامل ندیدم. حتی پولی ها . مخصوصا برای ما که زبان انگلیسیمون ضعیفه و از آموزشهای خوب زبان اصلی نمیتونیم استفاده کنیم.
من چندبار به قصد یادگیری اقدام کردم تا یه جایی جلو رفتم ولی واقعا گیج موندم. (خیلی مهم)مخصوصا هیشکی درمورد مایگریشن ها(اگه درست تلفظ کرده باشم) و پاک نشدن جداول بعد از اعمال تغییرات و موارد این چنینی.
گاها مثلا برای پروژه ای شده من کوئری نوشتم که از توابع اس کیو ال استفاده کرده . یا شده از ده بیستا جوین و جدول اطلعات باهم ترکیب یا استخراج شده . یا شرط های مختلف و سلکتهای داخلی (بنا به اقتضای کار) ، من نگران اینم که این موارد بعدا دردسر ساز نشه و راه حلی براشون پیدا کنم یا نه.


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

رامین عزیز سلام .
به این لینک یه سر بزن .

https://toplearn.com/courses/48/

mr.sirwan
یک شنبه 14 بهمن 1397, 12:40 عصر
والا همه پیشنهاد میکنن با انتیتی کارکنیم . من خودم با ado.net کار میکنم تا حالا هم مشکلاتی نداشتم و اگه پیش اومده اونقدر دست آدم توش بازه که به راحتی بتونه مشکلاتو حل کنه
و اما اصل کاری همین آموزش انتیتی که هیچ جا یه آموزش کامل ندیدم. حتی پولی ها . مخصوصا برای ما که زبان انگلیسیمون ضعیفه و از آموزشهای خوب زبان اصلی نمیتونیم استفاده کنیم.
من چندبار به قصد یادگیری اقدام کردم تا یه جایی جلو رفتم ولی واقعا گیج موندم. (خیلی مهم)مخصوصا هیشکی درمورد مایگریشن ها(اگه درست تلفظ کرده باشم) و پاک نشدن جداول بعد از اعمال تغییرات و موارد این چنینی توضیح جامع نداده و فقط به اسمش اشاره کرده و گذشته.
گاها مثلا برای پروژه ای شده من کوئری نوشتم که از توابع اس کیو ال استفاده کرده . یا شده از ده بیستا جوین و جدول اطلعات باهم ترکیب یا استخراج شده . یا شرط های مختلف و سلکتهای داخلی (بنا به اقتضای کار) ، من نگران اینم که این موارد بعدا دردسر ساز نشه و راه حلی براشون پیدا کنم یا نه.


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

سلام، توی بحث مایگریشن مشکلتون چیه؟ بحثش که کاملا ساده و قابل فهمه.
برای بیشتر کوئری ها میتونین از خود انتیتی استفاده کنین و مشکلی نخواهید داشت، اما برای مواردی که نتونستید از انتیتی استفاده کنید میتونید Ado رو با انتیتی ترکیب کنید و در بعضی جاها به جای انتیتی از ado استفاده کنید هیچ مشکلی هم برای برنامه تون پیش نخواهد اومد

رامین مرادی
دوشنبه 15 بهمن 1397, 08:08 صبح
سلام، توی بحث مایگریشن مشکلتون چیه؟ بحثش که کاملا ساده و قابل فهمه.
برای بیشتر کوئری ها میتونین از خود انتیتی استفاده کنین و مشکلی نخواهید داشت، اما برای مواردی که نتونستید از انتیتی استفاده کنید میتونید Ado رو با انتیتی ترکیب کنید و در بعضی جاها به جای انتیتی از ado استفاده کنید هیچ مشکلی هم برای برنامه تون پیش نخواهد اومد
خب درسته این تایپیک جاش نیست ولی بحثش پیش اومد بهتره بپرسم.
من با کد فرست مثلا یه پروزه جدید کار میکنم. حالا تا یه جای کار پیش میرم و چندتا داده هم تو جدولم ذخیره کردم. یهو میبینم مثلا فلان فیلد باید به جدول اضافه بشه. حالا بعد اضافه کردن کل دیتابیسم پاک میشه و از نو ساخته میشه!:افسرده: منظورم اینه این مورد رو اصلا متوجه نمیشم.میگن مایگریشن. اصلا چی هست و چطوری باید باهاش کار کنم.
اگه خودتون فرصت دارید یه پروژه ساده اضافه کردن و ویرایش و حذف و این موارد رو کارکنید یه الگو بگیرم ازش.

mr.sirwan
دوشنبه 15 بهمن 1397, 10:15 صبح
ببینید قبلا در مورد چهارتا سناریوی انتیتی براتون توضیح دادم، سه تا سناریوی اول صرفا در بازه زمانی توسعه نرم افزار روی سیستم شما میتونه کارایی داشته باشه اما برای انتشار نرم افزارتون و استفاده عمومی فک نکنم انچنان کاربردی داشته باشن
پس میمونه سناریوی مایگریشن، در این سناریو انتیتی با دقت بالایی میاد تغییراتی که در مدل کلاسهاتون دادین رو روی دیتابیس نگاشت یا پیاده میکنه و نمیذاره داده هاتون حذف بشن، تنها حالت هایی که یک ستون از یکی از جداول دیتابیستون حذف میشه اینه که یا فیلدتون از کلاس متناظر حذف بشه و یا اینکه rename بشه یعنی قبلا مثلا اسم پراپرتی id بوده الان اسمشو تغییر دادین شده sid تنها در این دو حالته که مایگریشن اقدام به حذف یک ستون از جدول میکنه، اگه فرصت شد همون پروژه قبلی رو اینبار با مایگریشن آپلود میکنم