View Full Version : مشکل در نوشتن تابعی با مقدار برگشتی از نوع SQLDataReader
sirvan-me
یک شنبه 24 دی 1391, 16:54 عصر
سلام من یک کلاس برای عملیات SELECT و INSERT و ... تو SQL تو برنامم دارم ... یکی از این توابع کارش اینه که بخشی از اطلاعات رو از DB بخونه و تو یه متغیر از نوع SQLDataReader بریزه و برگردونه ... اما مشکل اینجاست که به محض اینکه می خوام تو کلاس اصلی برنامم مقدار برگشتیش رو تو یه SqlDataReader دیگه بریزم و باهاش کار کنم Error میده ... . به نظرتون همچین تابعی با این مقدار بازگشتی درسته ؟ راه اصولیش چیه ؟
tooraj_azizi_1035
یک شنبه 24 دی 1391, 16:57 عصر
Put error here
فرید نجفلو
یک شنبه 24 دی 1391, 20:35 عصر
سلام
اولا که DataReader از اسمش معلومه که یکطرفه هست و نمیشه توش چیزی ریخت
DataReader بصورت آن لاین کار میکنه یعنی چیزی توش نیست و کانکشن رو باز نگه می داره تا دیتا ها خونده بشه
پس اگه کانکشن بسته بشه DataReader هم بسته شده !
نتیجه:
احتمالا شما کانکشن رو تو تابع اصلی می بندید
روش شما هم درست نیست ، اطلاعات رو برزید تو یه DataSet یا DataTable و هر جا که خواستید بدون نگرانی بفرستید
sirvan-me
یک شنبه 24 دی 1391, 21: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, 23: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, 23: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 باهاش برخورد کنم .
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.