PDA

View Full Version : میشه تابعی داخل کلاس برای همچین دستوری نوشت ؟



بیتا حکمت
پنج شنبه 11 دی 1393, 17:39 عصر
میشه تابعی داخل کلاس برای همچین دستوری نوشت ؟ منظورم اینکه ممکنه جاهای مختلف و صفحات مختلف دکمه Insert داشته باشیم و بخوایم برای این کار یه تابع داشته که تنها چیزی که نیاز باشه ارسال پارامترها باشه

ویرایش : منظورم اینکه نوع پارامترهای ، تعداد پارامترهای ارسالی هم ممکنه متفاوت باشه ..





SqlConnection objonnection1 = new SqlConnection("Data Source=.;Initial Catalog=AccountingDB;Integrated Security=True");
objonnection1.Open();
SqlCommand objcommand1 = new SqlCommand();
objcommand1.Connection = objonnection1;
objcommand1.CommandText = "INSERT INTO StoreTB(IDStore, Descriptions,tafsili11, tafsili12,inactive,Salable,stroreable)" +
"VALUES(@IDStore,@Descriptions,@tafsili11,@tafsili1 2,@inactive,@Salable,@stroreable)";
objcommand1.Parameters.AddWithValue("@IDStore", IDStore);
objcommand1.Parameters.AddWithValue("@Descriptions",Descriptions);
objcommand1.Parameters.AddWithValue("@tafsili11", tafsili11);
objcommand1.Parameters.AddWithValue("@tafsili12", tafsili12);
objcommand1.Parameters.AddWithValue("@inactive", inactive);
objcommand1.Parameters.AddWithValue("@Salable", Salable);
objcommand1.Parameters.AddWithValue("@stroreable", stroreable);




objcommand1.ExecuteNonQuery();
objonnection1.Close();

anvar
پنج شنبه 11 دی 1393, 19:17 عصر
راه اصولیش هم همینه!

با این روش فقط یکبار کد نوشته میشه و به تعداد دلخواه ازش استفاده میشه (بصورت کلاس و یا DLL های مجزا که به برنامه افزوده میشن)

برنامه نویسی چند لایه رو سرچ کن - در همین انجمن کلی روش بحث شده

بیتا حکمت
پنج شنبه 11 دی 1393, 19:54 عصر
راه اصولیش هم همینه!

با این روش فقط یکبار کد نوشته میشه و به تعداد دلخواه ازش استفاده میشه (بصورت کلاس و یا DLL های مجزا که به برنامه افزوده میشن)

برنامه نویسی چند لایه رو سرچ کن - در همین انجمن کلی روش بحث شده

ممنون . میشه در مورد همین سوال یکم بیشتر راهنمایی کنید ، چون برنامه نویسی چند لایه رو سرچ می کنم کلی بحث میاره که به مرور زمان می تونم مطالعه کنم

LostOfMind
پنج شنبه 11 دی 1393, 20:15 عصر
public class Class1
{
//DataConnectionString in web.config file
private SqlConnection _Conn = new SqlConnection(ConfigurationManager.ConnectionStrin gs["DataConnectionString"].ConnectionString);
/// <summary>
/// Insert
/// </summary>
/// <param name="IDStore"></param>
/// <param name="Descriptions"></param>
/// <param name="tafsili11"></param>
/// <param name="tafsili12"></param>
/// <param name="inactive"></param>
/// <param name="Salable"></param>
/// <param name="stroreable"></param>
public void Insert(string IDStore, string Descriptions, string tafsili11,string tafsili12, string inactive, string Salable, string stroreable)
{
SqlCommand objcommand1 = new SqlCommand();
objcommand1.Connection = _Conn;
objcommand1.CommandText = "INSERT INTO StoreTB(IDStore, Descriptions,tafsili11, tafsili12,inactive,Salable,stroreable)" +
"VALUES(@IDStore,@Descriptions,@tafsili11,@tafsili 12,@inactive,@Salable,@stroreable)";
objcommand1.Parameters.AddWithValue("@IDStore", IDStore);
objcommand1.Parameters.AddWithValue("@Descriptions", Descriptions);
objcommand1.Parameters.AddWithValue("@tafsili11", tafsili11);
objcommand1.Parameters.AddWithValue("@tafsili12", tafsili12);
objcommand1.Parameters.AddWithValue("@inactive", inactive);
objcommand1.Parameters.AddWithValue("@Salable", Salable);
objcommand1.Parameters.AddWithValue("@stroreable", stroreable);
if (_ConnectionString._Conn.State != ConnectionState.Open)
_ConnectionString._Conn.Open();
objcommand1.ExecuteNonQuery();
if (_ConnectionString._Conn.State != ConnectionState.Closed)
_ConnectionString._Conn.Close();

}
}

بیتا حکمت
پنج شنبه 11 دی 1393, 20:20 عصر
public class Class1
{
//DataConnectionString in web.config file
private SqlConnection _Conn = new SqlConnection(ConfigurationManager.ConnectionStrin gs["DataConnectionString"].ConnectionString);
/// <summary>
/// Insert
/// </summary>
/// <param name="IDStore"></param>
/// <param name="Descriptions"></param>
/// <param name="tafsili11"></param>
/// <param name="tafsili12"></param>
/// <param name="inactive"></param>
/// <param name="Salable"></param>
/// <param name="stroreable"></param>
public void Insert(string IDStore, string Descriptions, string tafsili11,string tafsili12, string inactive, string Salable, string stroreable)
{
SqlCommand objcommand1 = new SqlCommand();
objcommand1.Connection = _Conn;
objcommand1.CommandText = "INSERT INTO StoreTB(IDStore, Descriptions,tafsili11, tafsili12,inactive,Salable,stroreable)" +
"VALUES(@IDStore,@Descriptions,@tafsili11,@tafsili 12,@inactive,@Salable,@stroreable)";
objcommand1.Parameters.AddWithValue("@IDStore", IDStore);
objcommand1.Parameters.AddWithValue("@Descriptions", Descriptions);
objcommand1.Parameters.AddWithValue("@tafsili11", tafsili11);
objcommand1.Parameters.AddWithValue("@tafsili12", tafsili12);
objcommand1.Parameters.AddWithValue("@inactive", inactive);
objcommand1.Parameters.AddWithValue("@Salable", Salable);
objcommand1.Parameters.AddWithValue("@stroreable", stroreable);
if (_ConnectionString._Conn.State != ConnectionState.Open)
_ConnectionString._Conn.Open();
objcommand1.ExecuteNonQuery();
if (_ConnectionString._Conn.State != ConnectionState.Closed)
_ConnectionString._Conn.Close();

}
}


ممنونم اما به این شکل منظورم نبود ، ممکنه تو یک صفحه تعداد پارامترها که به این متد ارسال میشه با تعداد پارامترها یکی نباشه ، یا ممکنه پارامترهای ورودی نوعشون فرق کنه

anvar
جمعه 12 دی 1393, 22:29 عصر
در برنامه نویسی n لایه که معمولا بصورت 3 لایه (پائین ترین لایه برای برای دسترسی به بانک - لایه میانی برای منطق برنامه - لایه سوم هم محیط کاربری یا چیزی که کاربر با اون سروکار داره) است سناریوی ایده ال داشتن پروژه های مجزا برای هر کدوم از سه لایه بالاست (معمولا لایه اول و دوم رو از نوع Class Library میذارن تا خروجی آنها بصورت DLL در اختیار لایه سوم قرار بگیرد, لایه سوم هم از کلاس ها و توابع موجود در دو DLL برای دسترسی به بانک استفاده می کند و نحوه تعامل آن هم توسط منطق موجود در لایه دوم کنترل می شود).
وارد شدن به این مباحث در کل نیاز به درک درستی از برنامه نویسی شی گرا داره که کلا بحث مفصل و مجزایی محسوب میشه
لایه اول : برای دسترسی و تعامل با بانک اطلاعاتی
در این لایه با توابعی سروکار داریم که دسترسی به بانک را فراهم می کنند, مثلا گرفتن کانکشن استرینگ - گرفتن اطلاعات از بانک با دیتاتیبل و یا دیتا ریدر و یا اجرای دستوراتی برای ثبت اطلاعات جدید و یا گرفتن یک عدد یا رشته از بانک
بعنوان مثال, برای ثبت اطلاعات پیشنهادی شما در بالا


public static int Execute(string SPName, params SqlParameter[] Parameters)
{
int intErr = 0;
ingSqlConnection cn = new SqlConnection(GetConnectionStr);
SqlCommand cmd = new SqlCommand(SPName, cn);

cmd.CommandText = SPName;
cmd.CommandType = CommandType.StoredProcedure;

if (Parameters != null)
foreach (SqlParameter item in Parameters)
cmd.Parameters.Add(item);

cn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (SqlException x)
{
intErr = 1;
}
cn.Close();

cmd = null;
cn = null;

return intErr;
}


این تابع مستقل از نوع و مقدار اطلاعات دو ورودی را می گیرد و یک عدد را برگشت می دهد
ورودی ها شامل نام stored procedure که در بانک موجود است و قرار است اطلاعات جدیدی را برای ما درج کند. ورودی دوم هم مجموعه ای از پارامترهای ارسالی یا ورودی های کاربر هستند(بدون توجه به تعداد و نوع آنها).
بقیه قسمت های کد هم واضح و برای گرفتن کانشکن استرینگ و ......
در پایان هم اگر اطلاعات با موفقیت درج شوند عدد صفر و در غیر اینصورت عدد 1 برگشت داده می یشود تا روال فراخواننده این تابع متوجه درج و یا عدم درج رکورد جدید بشود.

حالا در لایه دوم این تابع مورد استفاده قرار می گیرد و اطلاعات مورد نیاز آن برایش مهیا می شود - خود این اطلاعات نیز از لایه سوم به لایه دوم ارسال میشوند

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

alireza_s_84
جمعه 12 دی 1393, 23:06 عصر
شما میتونید یک کلاس برای مدیریت بانک اطلاعاتی داشته باشین. این کلاس میتونه چند متد داشته باشه برای کارهای مختلف. من در اینجا براتون یک نمونه کد قرار میدم و سناریوهای مختلف رو روی اون شرح میدم:
یک کلاس ایجاد میکنیم:

public class DataProvider
{
}


می تونیم یک تابع برای خوندن کانکشن استرینگ از وب کانفیگ داشته باشیم. این قسمت میتونه یک متغیر داخلی هم باشه فرقی نمیکنه بستگی به خودتون داره.
private static SqlConnection InitConnection() {
String CnnString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
return new SqlConnection(CnnString);
}
در کل سه حالت ممکنه برای پرس و جوی ما در دیتابیس اتفاق بیفته:
1- پرس و جوی ما یکی از عملیات افزودن ، حذف و یا ویرایش باشه
2- یک محموعه داده برگشت داده بشه
3- یک مقدار خاص برگشت داشته باشه
در واقع فرق چندانی بین این موارد وجود نداره و اینها همه بستگی به شما داره که نتیجه ی نهایی رو چطور برگشت میدین. برای مثال من از رویه های ذخیره شده استفاده میکنیم و وقتی عملیات افزودن رو انجام میدم یا کلید اصلی رو برگشت میدم (اگر خطایی رخ بده 1- برگشت میدم) یا بسته به سناریویی که دارم یک رکورد برگشت میدم.
وقتی ویرایش یا حذف میکنم یک مقدار بزرگتر از 0 برگشت میدم. در صورت وجود خطا مقدار 1- برگشت میدم.
حالا با توجه به این سناریوها میشه چندین متد نوشت که کل این حالات رو مدیریت کرد:
برای مثال متدی برای افزودن ، ویرایش یا حذف:
private static int RunCommand(SqlCommand cmd) {
using (SqlConnection Cnn = InitConnection())
{
try
{
Cnn.Open();
cmd.Connection = Cnn;
SqlParameter returnValue = new SqlParameter("@RETURN_VALUE", -1);
returnValue.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(returnValue);
cmd.ExecuteNonQuery();
return (int)returnValue.Value;
}
catch (Exception ex)
{
Log.WriteError(MethodInfo.GetCurrentMethod(), ex);
return -1;
}
}
}
private static int RunCommand(String commandName)
{
SqlCommand cmd = new SqlCommand(commandName);
cmd.CommandType = CommandType.StoredProcedure;
return RunCommand(cmd);
}



متدی برای واکشی داده ها:
private static DataTable ExportCommand(SqlCommand cmd) {
DataTable table = new DataTable();
using (SqlConnection Cnn = InitConnection())
{
Cnn.Open();
cmd.Connection = Cnn;
SqlDataAdapter Adapter = new SqlDataAdapter(cmd);
try
{
Adapter.Fill(table);
}
catch (Exception ex)
{
Log.WriteError(MethodInfo.GetCurrentMethod(), ex);
}
return table;
}
}
متدی برای اجرای دستورات در یک Transaction:
public static bool ExecuteBatch(List<SqlCommand> commands) {
bool result = false;
SqlTransaction Trans;


using (SqlConnection Cnn = InitConnection())
{
Cnn.Open();
Trans = Cnn.BeginTransaction();


try
{
foreach (var command in commands)
{
command.Connection = Cnn;
command.Transaction = Trans;
command.ExecuteNonQuery();
}
Trans.Commit();
result = true;
}
catch (Exception ex)
{
Trans.Rollback();
Log.WriteError(MethodInfo.GetCurrentMethod(), ex);
}
finally
{
if (Cnn.State == ConnectionState.Open)
{
Cnn.Close();
Cnn.Dispose();
commands.Clear();
}
}
}


return result;
}

کلاس مورد استفاده ی خودم رو ضمیمه میکنم تا شما هم بتونید از اون استفاده کنید.