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-1404, Jelsoft Enterprises Ltd.