PDA

View Full Version : مشکل در نوشتن تابعی با مقدار برگشتی از نوع SQLDataReader



sirvan-me
یک شنبه 24 دی 1391, 15:54 عصر
سلام من یک کلاس برای عملیات SELECT و INSERT و ... تو SQL تو برنامم دارم ... یکی از این توابع کارش اینه که بخشی از اطلاعات رو از DB بخونه و تو یه متغیر از نوع SQLDataReader بریزه و برگردونه ... اما مشکل اینجاست که به محض اینکه می خوام تو کلاس اصلی برنامم مقدار برگشتیش رو تو یه SqlDataReader دیگه بریزم و باهاش کار کنم Error میده ... . به نظرتون همچین تابعی با این مقدار بازگشتی درسته ؟ راه اصولیش چیه ؟

tooraj_azizi_1035
یک شنبه 24 دی 1391, 15:57 عصر
Put error here

فرید نجفلو
یک شنبه 24 دی 1391, 19:35 عصر
سلام
اولا که DataReader از اسمش معلومه که یکطرفه هست و نمیشه توش چیزی ریخت
DataReader بصورت آن لاین کار میکنه یعنی چیزی توش نیست و کانکشن رو باز نگه می داره تا دیتا ها خونده بشه
پس اگه کانکشن بسته بشه DataReader هم بسته شده !

نتیجه:
احتمالا شما کانکشن رو تو تابع اصلی می بندید
روش شما هم درست نیست ، اطلاعات رو برزید تو یه DataSet یا DataTable و هر جا که خواستید بدون نگرانی بفرستید

sirvan-me
یک شنبه 24 دی 1391, 20:19 عصر
این هم کد :

حالا بهتر می تونید نظر بدید دوستان ...


public static SqlDataReader SelectFromDb(string Query,params SqlParameter[] Parameter)
{
SqlDataReader Dr;
using (var Connection = new SqlConnection() { ConnectionString = Properties.Settings.Default.BankConnectionString })
{
if (Connection.State == ConnectionState.Closed)
Connection.Open();
using (var Command = new SqlCommand()
{
CommandText = Query,
CommandType = CommandType.StoredProcedure,
Connection = Connection
})
{
Command.Parameters.AddRange(Parameter);
Dr = Command.ExecuteReader();
}

if (Connection.State == ConnectionState.Open)
Connection.Close();
}
return Dr;
}


ببینید من می خوام از دیتا ریدر به این صورت استفاده کنم .... چطور می تونم این حالت رو با DataTable پیاده سازی کنم ؟!

نکته : SQLClass یه کلاسیه که واسه خودم نوشتم هیچ ربطی به تابع بالا نداره و در ضمن اون DataReader هم به بالا ربطی نداره و مثال پایین فقط برای اینه که متوجه یشید که می خوام با DataReader این کار ها رو کنم ...


SQL_Class.Create_Connection();

SQL_Class.Cmd.Parameters.AddWithValue("@ACode2", int.Parse(CodeAzmoon));
SQL_Class.Cmd.CommandText = "SELECTRNDQNew";

SQL_Class.Cmd.CommandType = System.Data.CommandType.StoredProcedure;
SQL_Class.Cmd.Parameters.AddWithValue("@Nums", NumberOfQuestion);
SQL_Class.Dr = SQL_Class.Cmd.ExecuteReader();

TrueAnswer.Clear();

MyStruct Fields = new MyStruct();

while (SQL_Class.Dr.Read())
{
{
Fields.Body = SQL_Class.Dr["Body"].ToString();
Fields.GozineSahih = int.Parse(SQL_Class.Dr["Gt"].ToString());
Fields.Point = int.Parse(SQL_Class.Dr["Point"].ToString());
}

lst.Add(Fields);
}

sasan_22
یک شنبه 24 دی 1391, 22:01 عصر
دوست عزیز شما بیا ب این صورت کار کن (البته یه نظره باز خودت بهتر می دونی)

public DataTable SelectAll()
{
using (var Connection = new SqlConnection() { ConnectionString = Properties.Settings.Default.BankConnectionString })
{
DataTable DT = new DataTable();
SqlCommand Command = new SqlCommand("SelectAll",Connection);
Command.CommandType = CommandType.StoredProcedure,

Command.Parameters.AddRange(/*Parameter*/);
SqlDataAdapter DA =new SqlDataAdapter(Command);
DA = Command.ExecuteReader();
DA.Fill(DT);
if (Connection.State == ConnectionState.Open)
Connection.Close();
}
return DT;
}

sirvan-me
دوشنبه 25 دی 1391, 22:35 عصر
دوست عزیز شما بیا ب این صورت کار کن (البته یه نظره باز خودت بهتر می دونی)

public DataTable SelectAll()
{
using (var Connection = new SqlConnection() { ConnectionString = Properties.Settings.Default.BankConnectionString })
{
DataTable DT = new DataTable();
SqlCommand Command = new SqlCommand("SelectAll",Connection);
Command.CommandType = CommandType.StoredProcedure,

Command.Parameters.AddRange(/*Parameter*/);
SqlDataAdapter DA =new SqlDataAdapter(Command);
DA = Command.ExecuteReader();
DA.Fill(DT);
if (Connection.State == ConnectionState.Open)
Connection.Close();
}
return DT;
}


ممنون دوست من ...
یک نکته و یک سوال :
نکته : اون خط
DA = Command.ExecuteReader();
اضافست نه ؟!
سوال : سمت کلاس اصلی چطور مثل یه DataReader باهاش برخورد کنم .