PDA

View Full Version : استفاده از روش پارمتری در هنگام کار با کلاس



sara_aryanfar
سه شنبه 20 تیر 1391, 22:10 عصر
با سلام من همه اعمال روی دیتابیس رو داخل یک کلاس قرار دادم و فقط توابع این کلاس رو صدا می کنم و یک کوئری بهش میدم مشکل من اینه که وقتی همه اشیا رو داخل این کلاس تعریف کردم چطوری می تونم در کوئری خودم از پارامتر استفاده کنم
public class dbconnection
{
public static string connection = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;

public static SqlDataAdapter da = new SqlDataAdapter();
public static SqlConnection conobj = new SqlConnection(connection);
public static void insert(string sql)
{
try
{
conobj.Open();
da.InsertCommand = new SqlCommand();
da.InsertCommand.Connection = conobj;
da.InsertCommand.CommandText = sql;
da.InsertCommand.ExecuteNonQuery();
conobj.Close();
}
catch
{

}
finally { conobj.Close(); }
}

و کوئری من هم اینجوریه
dbconnection.insert("insert into feed_list(feed_name,feed_link)values()");
حالا من چطوری می تونم مقادیر خودم رو به صورت پارامتری بدم ممنون

fakhravari
سه شنبه 20 تیر 1391, 22:24 عصر
public void Add_Category(string CategoryName , int CategoryPosition)
منظور شما گرفتن ورودی ؟

clover
چهارشنبه 21 تیر 1391, 00:56 صبح
سلام


حالا من چطوری می تونم مقادیر خودم رو به صورت پارامتری بدم
با توجه به کدهای شما:



dbconnection.da.InsertCommand.Parameters.AddWithVa lue("@feed_name", "feed_nameValue");
dbconnection.da.InsertCommand.Parameters.AddWithVa lue("@feed_link", "feed_linkValue");
dbconnection.insert("insert into feed_list(feed_name,feed_link)values(@feed_name, @feed_link)");

salehbagheri
چهارشنبه 21 تیر 1391, 02:03 صبح
از کلمه کلیدی params استفاده کنید!


public static void Insert(string Command, params int[] IntParameters)
{
//TODO
}


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

clover
چهارشنبه 21 تیر 1391, 14:12 عصر
از کلمه کلیدی params استفاده کنید!
البته باید توسط یک متد دیگه مقادیر پارامتری رو با Command ترکیب کنید و از نتیجه اون استفاده کنید.

امکانش هست او متد دیگه رو هم بنویسید؟
از کجا می فهمیم هر مقدار مربوط به کدوم پارامتر هست؟
مقادیر پارامتر ها هر نوعی می تونند باشند (البته می تونیم نوع رو object در نظر بگیریم)

اگر روشتون رو کامل (به همراه کد و به عملا تست شده) توضیح بدید ممنون میشم.

sara_aryanfar
چهارشنبه 21 تیر 1391, 14:52 عصر
بله در صورت امکان متد دیگر رو بیان کنید ممنون

salehbagheri
چهارشنبه 21 تیر 1391, 15:05 عصر
امکانش هست او متد دیگه رو هم بنویسید؟

اون متد دیگه بسته به نوع درخواست شما میتونه متفاوت باشه!

این مثال از مایکروسافت رو ببینید: لینک (http://msdn.microsoft.com/en-us/library/w5zay9db.aspx)


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


public static void Insert(string Command, params object[] ObjParameters)
{

string MyCommand = string.Format(Command, ObjParameters);

//TODO:
}


البته در این نمونه باید متغیر Command شما از الگوی زیر پیروی کنه و همچنین تعداد پارامترها با تعداد PlaceHolder ها در متن برابر باشه!


INSERT INTO {0}({1},{2})VALUES({3}, {4})


در متد Insert پارامترهای ورودی توسط متد string.Format با رشته Command ترکیب میشه و متغیر MyCommand متغیر نهایی جهت استفاده و ارسال خواهد بود!

البته دقت کنید که استفاده به این صورت، خطر حملات SQL Injection را افزایش میده، در ورودی اول متد Insert اگر نام روالهای ذخیره شده (Stored Procedures) رو دریافت کنید و پارامترها رو از طریق متد AddWithValue ارسال کنید به مراتب بهتره!

Mohammadvb6
چهارشنبه 21 تیر 1391, 15:32 عصر
من قبلا برای این کار یه کلاس نوشتم .

در این کلاس باید سه متد تعریف کنیم :
1- متد سازنده برای اتصال به بانک اطلاعاتی و وارد کردن sp
2- متدی جهت ورد پارامتر به sp در صورت نیاز
3- متدی جهت اجرا کرد sp


public class ConnectToSql
{
SqlConnection connection = new SqlConnection();
SqlCommand cmd = new SqlCommand();
public SqlDataAdapter da = new SqlDataAdapter();
public DataSet ds = new DataSet();
public ConnectToSql(string sp )
{
string connectionString =
ConfigurationManager.ConnectionStrings["mohammad"].ConnectionString;
connection.ConnectionString = connectionString;
cmd.CommandText = sp;
cmd.Connection = connection;
cmd.CommandType = CommandType.StoredProcedure;
}

public void InterParameter (string varsql,object param)
{

cmd.Parameters.AddWithValue(varsql, param);
}

public void RunSP()
{

connection.Open();
cmd.ExecuteNonQuery();
da.SelectCommand = cmd;
connection.Close();

}
}



روش استفاده :


WebApplicationNewDidarPeyk.Classes.ConnectToSql InsertToPriceTable = new Classes.ConnectToSql("SP_Insert_PriceTable");
InsertToPriceTable.InterParameter("TypePage", Convert.ToInt32(DropDownList1.SelectedValue));
InsertToPriceTable.InterParameter("Size1", InputText.Convertor(TextBox1.Text));
InsertToPriceTable.InterParameter("Size2", InputText.Convertor(TextBox2.Text));
InsertToPriceTable.InterParameter("Price", InputText.Convertor(TextBox3.Text));
InsertToPriceTable.RunSP();


و یا :


if (!Page.IsPostBack)
{
WebApplicationNewDidarPeyk.Classes.ConnectToSql ReadFullImage = new Classes.ConnectToSql("SP_SelectRow_WhereID_MainImageTable");
ReadFullImage.InterParameter("MainImgID", Convert.ToInt32(Request.QueryString["ID"]));
ReadFullImage.RunSP();
ReadFullImage.da.Fill(ReadFullImage.ds, "MainImageTable");
DataList1.DataSource = ReadFullImage.ds;
DataList1.DataBind();

}

clover
چهارشنبه 21 تیر 1391, 16:14 عصر
البته دقت کنید که استفاده به این صورت، خطر حملات SQL Injection را افزایش میده
دقیقا به همین علت عرض کردم


در ورودی اول متد Insert اگر نام روالهای ذخیره شده (Stored Procedures) رو دریافت کنید و پارامترها رو از طریق متد AddWithValue ارسال کنید به مراتب بهتره!
فرض کنید قصد استفاده از همین روش (دستور در خط و نه استورد پروسیجر) رو داشته باشیم، در این حالت هم امکان استفاده از پارامتر ها وجود داره، اما به چه صورتی باید این پارامتر ها پاس داده بشه؟
من دیشب کمی روی این مسئله فکر کردم و به نظرم جالب رسید، روش های بهتری وجود داره اما فرض کنید قصد داشته باشیم پارامترها رو از همین طریق پاس بدیم.

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

salehbagheri
چهارشنبه 21 تیر 1391, 18:41 عصر
در ابتدا از NameValueCollection استفاده کردم اما فقط مقادیر string رو می گیره. آیا ساختار آماده ای برای این کار وجود داره؟ (شبیه به NameValueCollection با انواع داده). گرچه پیاده کردنش کاری نداره، اما برام جالب شد که آیا یک روش آماده ی دم دستی میشه براش پیدا کرد یا نه.

بله وجود داره! شما میتونید از طریق کلاس Dictionary که از پرکاربردترین و تواناترین کلاسهای NET. هست استفاده کنید!

کاربردش تقریباً همانند NameValueCollection هست با این تفاوت که از انواع داده ای بیشتری پشتیبانی میکنه و امکانات بیشتری هم ارائه میده!

به این لینک سر بزنید: لینک (http://barnamenevis.org/msdn.microsoft.com/en-us/library/xfhwa508.aspx)

aminghaderi
چهارشنبه 21 تیر 1391, 20:13 عصر
چطوری می تونم در کوئری خودم از پارامتر استفاده کنم سلام.
مشکل شما با Params که جناب باقری توضیح داند ، حل نشد؟؟


حالا من چطوری می تونم مقادیر خودم رو به صورت پارامتری بدم ممنون
دقیقا اون فرمتی که مد نظرتون هست رو بگید.
برای مثال :

dbconnection.insert(DBName,Fields,Valuse);

Rohollaes
چهارشنبه 21 تیر 1391, 21:52 عصر
public bool ExecuteQuery(string sql, SqlParameter[] ArParam, bool Isquery)
{

int len=0;
if(ArParam!=null) len=ArParam.Length;

SqlCommand command = new SqlCommand();
SqlConnection connection = new SqlConnection(connectionString);
try
{

command.CommandText = sql;
command.Connection = connection;
// if(ArParam!=null)
command.Parameters.AddRange(ArParam);

if (Isquery == true)
command.CommandType = CommandType.Text;
else
command.CommandType = CommandType.StoredProcedure;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
return true;



}
catch (Exception ex)
{
// MessageBox.Show("خطا در عملیات");
MessageBox.Show(ex.Message);
return false;
}

}



هنگام پاس دادن مقادیر یه آرایه از نوع SqlParameter[] ایجاد و پارامترها را ارسال میکنیم
مثلا در اینجا من 2تا پارامتر میحوام ارسال کنم :

SqlParameter[] p = new SqlParameter[2];

p[0] = new SqlParameter("@id",1);
p[1] = new SqlParameter("@name", "roholla");

DB.ExecuteQuery("insert into tbUser values({0},{1})",p,true);
شی DB یه نمونه از کلاسی هست که تابع ExecuteQuery رو داخل اون قرار میدیم