PDA

View Full Version : سوال: مشکل در استفاده از SQlDataReader , SQlScalar برای login



L_eskandary
جمعه 09 مرداد 1388, 13:59 عصر
سلام
دوستان ، مشکلی که دارم اینه که من نیاز دارم که با ورود user و Pass کاربر ، ID کاربر رو به کمک QueryString به صفحه ی مورد نظر بفرستم . حالا برا این کار از SqlDataReader استفاده کردم تا ID کاربر رو بدست بیاره ولی هر کاری می کنم کاربر نمی تونه login کنه ، من از معماری سه لایه استفاده کردم نمی دونم باید SqlDataReader رو کجا ببندم که مشکلی پیش نیاد ، چون تو هر سطح که می بندم یه مشکلی پیش می آد . ممنون میشم کمکم کنین ، چون تقریبا با وجود این مشکل کاری نمی تونم بکنم . من فایل های برنامه رو می ذارم ، امیدوارم سختتون نباشه تا با یه Download مشکل من عاجز بینوا رو حل کنین !:گریه:

L_eskandary
شنبه 10 مرداد 1388, 15:20 عصر
با سلام خدمت دوستان
فک کنم دانلود و اجرای برنامه ی من یه خورده مشکل باشه به همین خاطر یه کم در مورد مشکلم توضیح می دم :
من از کلاس زیر برا ارتباط با پایگاه داده ام استفاده کرده ام :
class BaseClass
{
private static BaseClass baseclass;

private BaseClass() { }

string cs = @"Data Source=.;Initial Catalog=ShortTimeCourse;Integrated Security=True";
SqlConnection con = new SqlConnection();
SqlCommand com = new SqlCommand();
SqlDataAdapter da = new SqlDataAdapter();
SqlDataReader dr;
SqlTransaction tr;

int anyerror = 0;



public static BaseClass bclass()
{

if (baseclass == null)
{
baseclass = new BaseClass();
}
return baseclass;

}


public void begin()
{
try
{
if (con.State == System.Data.ConnectionState.Closed)

this.con.ConnectionString = cs;
this.com.CommandText = com.CommandText;
this.com.Connection = con;
this.da.SelectCommand = com;
this.con.Open();
this.tr = con.BeginTransaction();
}
catch (SqlException e)
{
++anyerror;
throw e;
}
}

public void end()
{

try
{
if (anyerror > 0)
{
this.tr.Rollback();
}
else
{

this.tr.Commit();
}

this.con.Close();
}
catch (SqlException e)
{
throw e;
}

}


public int IntExecuteScalarPa(string str, SqlParameter pa)
{
int t;

try
{

com.Transaction = tr;
this.com.CommandText = str;
com.Parameters.Add(pa);
t = (int)com.ExecuteScalar();
}
catch (SqlException e)
{
++anyerror;
throw e;
}
return t;
}


public SqlDataReader PaExecuteReader(string str, SqlParameter pa)
{


try
{
com.Transaction = tr;
this.com.CommandText = str;
com.Parameters.Add(pa);
this.dr = this.com.ExecuteReader();


}
catch (SqlException e)
{
++anyerror;
throw e;
}
return dr;
}



}

خوب حالا وقتی تو سطح DAL که مربوط به دسترسی به پایگاه داده است از متد ExecuteReader این کلاس استفاده می کنم در متد end این کلاس با پیام DataReader must be close before commit مواجه می شم و قبل اونم که datareader رو می بندم تو سطح Present نمی تونم از اون استفاده کنم چون خطا می ده که datareader بسته است . حالا به نظر دوستان ، من چه جوری می تونم این مشکل رو حل کنم ؟ آیا راه حل دیگه ای به ذهن تون برا گرفتن اطلاعات مورد نظر می رسه ؟

ببخشید که طولانی میشه ولی محض اطمینان من کدهای DAL رو هم می ذارم تا بهتر با نحو ه ی کارم آشنا بشین :


public SqlDataReader SelectPerId(string user, byte[] pass)
{

BaseClass bs = BaseClass.bclass(); ;
string sql = " Select PerIDC from tblPerson where username = '" + user + "' and password = @password ";

SqlParameter pa = new SqlParameter("@password", SqlDbType.Binary, 16);
pa.Value = pass;

SqlDataReader dr;

try
{

bs.begin();
dr = bs.PaExecuteReader(sql, pa);

}
catch (SqlException e)
{
throw e;
}
finally
{
bs.end();
}

return dr;

}