PDA

View Full Version : حرفه ای: نیازمند یک کلاس برای ارتباط با SQL مبتنی بر ADO.NET



NasimBamdad
شنبه 02 تیر 1397, 01:12 صبح
سلام و وقت بخیر .

چندی هست از یک کلاسی برای ارتباط با SQL و دستورات ADO.NEt استفاده می کنم .

حالا بنا به نیازم و گسترش کار اون کلاس به کارم نمیاد و مشکلات زیاد داره .


از عزیزان کسی هست که یک کلاس منسج برای چهار عمل Select , Insert , Update, Delete داشته باشه و البته هم به صورت ارسال کوری و هم Stored Procdure ?

با تشکر فراوان

رامین مرادی
شنبه 02 تیر 1397, 09:10 صبح
سلام و وقت بخیر .

چندی هست از یک کلاسی برای ارتباط با SQL و دستورات ADO.NEt استفاده می کنم .

حالا بنا به نیازم و گسترش کار اون کلاس به کارم نمیاد و مشکلات زیاد داره .


از عزیزان کسی هست که یک کلاس منسج برای چهار عمل Select , Insert , Update, Delete داشته باشه و البته هم به صورت ارسال کوری و هم Stored Procdure ?

با تشکر فراوان


پیاده سازی این مورد که کاری نداره.
شما اون کلاسی که استفاده میکنید رو همینجا بزارید و مشکلاتش رو هم بگید شاید بشه با چندتا تغییر درستش کرد.

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

NasimBamdad
یک شنبه 03 تیر 1397, 00:45 صبح
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Xml;
namespace WareHouse
{
internal class MyDB
{
private SqlConnection cnn;
private SqlCommand cmd;
private SqlDataAdapter da;
private DataSet ds;
private DataTable dt;
public string Cnn = string.Empty;

public MyDB()
{
//try
//{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Application.StartupPath + "\\Config.xml");
XmlElement rootElem = xmlDoc.DocumentElement;
Cnn = "Data Source=" + rootElem.ChildNodes[0]["servername"].InnerText + ";" + "Initial Catalog=" +
rootElem.ChildNodes[0]["dbname"].InnerText + ";" + "User ID=" +
CryptorEngine.Decrypt(rootElem.ChildNodes[0]["username"].InnerText, true) + ";" + "Password = " +
CryptorEngine.Decrypt(rootElem.ChildNodes[0]["password"].InnerText, true);

cnn = new SqlConnection(Cnn);
cmd = new SqlCommand();
cmd.Connection = cnn;
//}
//catch (Exception ex)
//{
// MessageBox.Show(ex.Message);
//}
}

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

public DataSet GetData()
{
da = new SqlDataAdapter(cmd);
ds = new DataSet();
//try
//{
da.Fill(ds);
//}
//catch (SqlException ex)
//{
// MessageBox.Show(ex.Message);
//}
return ds;
}

public DataTable GetData2()
{
da = new SqlDataAdapter(cmd);
dt = new DataTable();
//try
//{
da.Fill(dt);
//}
//catch (SqlException ex)
//{
// MessageBox.Show(ex.Message);
//}
return dt;
}

public bool exec()
{
if (!connect())
return false;

try
{
cmd.ExecuteNonQuery();
return true;
}
catch /*(SqlException ex)*/
{
//MessageBox.Show("Error : 3002 - " + "Failed to complete proccess");
//MessageBox.Show(ex.Message, "Error: " + ex.Number);
return false;
}
finally
{
disconnect();
}
}

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

public bool connect()
{
try
{
if (cnn.State != ConnectionState.Open)
cnn.Open();
return true;
}
catch/* (Exception ex)*/
{
MessageBox.Show("Error : 3001 - " + "Connection Lost, Please check your internet connection");
return false;
}
}

public void disconnect()
{
if (cnn.State != ConnectionState.Closed)
cnn.Close();
}
}
}

کلاسی که استفاده میکنم به این صورت هست . می خوام اینو بهینه تر کنم . یا کلا عوض کنم ( اگه اینو بهینه کنم که خیلی بهتر میشه )
برای مثال نمی تونم چک کنم که اگه ارتباط با دیتابیس قطع شد ( برای دیتابیس های اینترنتی مخصوصا ) پیام خطا بده ، متاسفانه انگار 100 تا کامند اجرا می کنه و همش خطا های SQL رو پشت سر هم میده و این کلافه کنندس .
مورد بعدی اینه که خیلی برام جالبه که موضوع Stored Procedureهم توش بندازم . عملیات های مختلف . Insert , Update , Delete , Select ,
و گرفتن خروجی از کوری ها . و پر کردن DataSet , DataTable , DataReader و .....

رامین مرادی
یک شنبه 03 تیر 1397, 08:14 صبح
یه پیشنهاد برای بهبود یکی از عملیات ها این میتونه باشه که از تراکنش ها هم استنفاده کنید.

public bool exec()
{
if (!connect())
return false;
try
{
cmd.ExecuteNonQuery();
return true;
}
catch /*(SqlException ex)*/
{
//MessageBox.Show("Error : 3002 - " + "Failed to complete proccess");
//MessageBox.Show(ex.Message, "Error: " + ex.Number);
return false;
}
finally
{
disconnect();
}
}

این کد شماست که من برا خودم همچین کدی نوشتم.


public bool Execute(String sql)
{
ERORR = "";
Connect();
SqlTransaction _SqlTransaction;
_SqlTransaction = cn.BeginTransaction();
SqlCommand cmd = new SqlCommand();
cmd.Transaction = _SqlTransaction;
try
{
cmd.Connection = cn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
_SqlTransaction.Commit();
DisConnect();
return true;
}
catch (Exception ex)
{
ERORR = ex.Message;
_SqlTransaction.Rollback();
DisConnect();
return false;
}
finally
{
DisConnect();
}
}





من یادم رفت بررسی کنم و وضعیت کانکت رو بنویسم. یه متغغیر استاتیک دارم به اسم Error شما وقتی اتصالتون برقرار نباشه یه مقدار false برگشت بدید و داخل اون متغییر خطای مربوطه رو بنویسید. جایی که متد مثلا exec رو فراخوانی کردید اگه خروجی false بود مقدار متغییر Error رو به کاربر نشون بدید