PDA

View Full Version : سوال: اشکال این کلاس کجاست؟چه طوری اگه اولین متد اجرا نشد ، بقیه هم نشن



NasimBamdad
چهارشنبه 04 اردیبهشت 1392, 11:41 صبح
سلام و خسته نباشید .

من یک کلاس نوشتم برای اتصال به دیتابیس و انجام عملیات های Delete , Insert , Update , و هم چنین Fill کردن GridView


using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Windows.Forms;

namespace Matab
{
class MyDB
{
public SqlConnection cnn;
public SqlCommand cmd;
public SqlDataAdapter da;
public DataSet ds;
public void connect()
{
try
{
cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
}
catch
{
MessageBox.Show("Error : 3001 " + "خطا در اتصال به بانک اطلاعاتی - با مدیر تماس بگیرید");
}

}

public void Disconnect()
{
cnn.Close();
}

public void Fill(string sql)
{
try
{
da = new SqlDataAdapter(cmd);
ds = new DataSet();
cmd.CommandText = sql;
cmd.Parameters.Clear();
da.Fill(ds);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

public void Crud(string sql)
{
cmd.CommandText = sql;
cmd.Parameters.Clear();
}

public void exc()
{
cmd.ExecuteNonQuery();
}
}
}


بعد جایی که می خوام مثلا INSERT کنم از این استفاده می کنم


MyDB DB = new MyDB();
DB.connect();
DB.Crud("INSERT INTO patients (fname) VALUES (@fname)");
DB.cmd.Parameters.AddWithValue("@fname", txtProNet1.Text);
DB.exc();
DB.disconnect();



حالا به نظر شما :

1- کلاسی که تعریف کردم مشکلی داره ؟ بهینه هست ؟ درسته یا کشکیه !؟
2- کاری که می خوام انجام بدم این هست که اگر فراید وصل شدن به دیتابیس که از طریق متد Connect انجام میشه ، با مشکل رو به رو شد ، دیگه نره سراغ متد های بعدی که برای INSERT کردن و سایر کار های تعریف شدند .

باید چه کار کرد که فهمید آیا Connect انجام شده یا نه ؟! اگه انجام نشده ( وصل نشده ) دیگه یک Break بده و پیغامی که براش تعریف کردم و دیگه کار های بعدی رو انجام نده

ممنونم

morteza271
چهارشنبه 04 اردیبهشت 1392, 12:46 عصر
سلام.
خوب برای هر متد یه خروجی بولین تعریف کنید و بعد از فراخوانی اون تابع خروجی رو چک کنید.

Mahmoud.Afrad
چهارشنبه 04 اردیبهشت 1392, 12:49 عصر
متد connect و disconnect باید داخلی باشند. یعنی توسط متدهای دیگه (متد exec) صدا زده بشن

NasimBamdad
چهارشنبه 04 اردیبهشت 1392, 14:21 عصر
متد connect و disconnect باید داخلی باشند. یعنی توسط متدهای دیگه (متد fill) صدا زده بشن


این رو متوجه نشدم ، میشه ساده تر توضیح بدید ؟

NasimBamdad
چهارشنبه 04 اردیبهشت 1392, 14:21 عصر
سلام.
خوب برای هر متد یه خروجی بولین تعریف کنید و بعد از فراخوانی اون تابع خروجی رو چک کنید.

یعنی یک return true یا return false در قسمت Try و Catch قرار بدم ؟!
این Error رو میده


Error 1 Since 'Matab.MyDB.connect()' returns void, a return keyword must not be followed by an object expressio

Mahmoud.Afrad
چهارشنبه 04 اردیبهشت 1392, 15:15 عصر
این رو متوجه نشدم ، میشه ساده تر توضیح بدید ؟
منظور اینه که تا مجبور نشدید چیزی رو Public نکنید.

class MyDB
{
private SqlConnection cnn;
private SqlCommand cmd;
private SqlDataAdapter da;
private DataTable dt;

public MyDB()
{
cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
cmd = new SqlCommand();
cmd.Connection = cnn;
}

public void SetCommand(string sql)
{
cmd.Parameters.Clear();
this.cmd.CommandText = sql;
}

public DataTable GetData()
{
da = new SqlDataAdapter(cmd);
dt = new DataTable();
try
{
da.Fill(dt);
}
catch (SqlException ex)
{
throw ex;
}
return dt;
}

public int exec()
{
connect();
int result = cmd.ExecuteNonQuery();
Disconnect();
return result;
}

public void SetParameter<AnyType>(string parameterName, AnyType parameterValue)
{
this.cmd.Parameters.AddWithValue(parameterName, parameterValue);
}

private void connect()
{
try
{
if (cnn.State != ConnectionState.Open)
cnn.Open();
}
catch (SqlException ex)
{
throw ex;
}
}

private void Disconnect()
{
if (cnn.State != ConnectionState.Closed)
cnn.Close();
}
}

به اینصورت اینزرت کنید:

MyDB DB = new MyDB();
DB.SetCommand("INSERT INTO patients (fname) VALUES (@fname)");
DB.SetParameter("@fname", txtProNet1.Text);
try
{
DB.exec();
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message, "Error: " + ex.Number);
}

به اینصورت اطلاعات دریافت کنید:

MyDB DB = new MyDB();
DB.SetCommand("select * from tbl where fname like @fname");
DB.SetParameter("@fname", "%" + textBox1.Text + "%");
try
{
DataTable dt = DB.GetData();
dataGridView1.DataSource = dt;
}
catch (SqlException ex)
{
dataGridView1.DataSource = null;
MessageBox.Show(ex.Message, "Error: " + ex.Number);
}

البته اگر سه لایه مینویسی اطلاعات ex (خطا) رو در لایه دوم ثبت کن(اگر ثبت میکنی) و بعد ex را به لایه بالا پرتاب کنید و در لایه UI اونو دریافت و نمایش بده.

morteza271
چهارشنبه 04 اردیبهشت 1392, 18:52 عصر
یعنی یک return true یا return false در قسمت Try و Catch قرار بدم ؟!
این Error رو میده


Error 1 Since 'Matab.MyDB.connect()' returns void, a return keyword must not be followed by an object expressio


آره همینطوری بنویس و خطاش هم به خاطر اینکه در خط تعریف تابع باید نوع خروجی تابع رو هم مشخص کنی:
public bool connect()
ابن کا رو که کردی از توصیه دوستمون هم استفاده کن، توصیه خوبی بهتون کردن...
موفق باشید