PDA

View Full Version : سوال: تبدیل IDataReader به Arraylist



nafasak
شنبه 08 خرداد 1389, 20:46 عصر
با سلام،

دوستان مقدار بازگشتی
Microsoft.ApplicationBlocks.Data.SqlHelper در فراخوانی اطلاتات از دیتابیس IDataReader می باشد،
حال میخوام بدونم چطور میشه این مقدار رو در یک ArrayList منتقل کنم؟

لطفا با کد راهنمایی بفرمایید.

Mostafa_Dindar
شنبه 08 خرداد 1389, 21:53 عصر
با سلام،

دوستان مقدار بازگشتی
Microsoft.ApplicationBlocks.Data.SqlHelper در فراخوانی اطلاتات از دیتابیس IDataReader می باشد،
حال میخوام بدونم چطور میشه این مقدار رو در یک ArrayList منتقل کنم؟

لطفا با کد راهنمایی بفرمایید.


سلام ،

اشتباه ميفرمائيد ، تمامي OverLoad هاي متد ExecuteReader() از فضاي نام Microsoft.ApplicationBlocks.Data مقدار بازگشتيشان SqlDataReader هست .

همانطور كه ميتونيد از DataReader استفاده كنيد به همان صورت نيز ميتوانيد از IDataReader استفاده كنيد ، اتفاقا توصيه ميشه كه از IDataReader استفاده كنيد .

چرا به جاي ArrayList از Generic Type ها Collection ها استفاده نميكنيد ، هر چند كه ميتونيد نوع برگشتي رو در ArrayList هم ذخيره كنيد .


سربلند باشيد

nafasak
یک شنبه 09 خرداد 1389, 00:30 صبح
سلام ،

اشتباه ميفرمائيد ، تمامي OverLoad هاي متد ExecuteReader() از فضاي نام Microsoft.ApplicationBlocks.Data مقدار بازگشتيشان SqlDataReader هست .

همانطور كه ميتونيد از DataReader استفاده كنيد به همان صورت نيز ميتوانيد از IDataReader استفاده كنيد ، اتفاقا توصيه ميشه كه از IDataReader استفاده كنيد .

چرا به جاي ArrayList از Generic Type ها Collection ها استفاده نميكنيد ، هر چند كه ميتونيد نوع برگشتي رو در ArrayList هم ذخيره كنيد .


سربلند باشيد

سلام،

میشه یه مثال ارسال کنید..؟
من با Generic Type ها Collection ها کار نکردم.

Mostafa_Dindar
یک شنبه 09 خرداد 1389, 11:30 صبح
سلام،

میشه یه مثال ارسال کنید..؟
من با Generic Type ها Collection ها کار نکردم.

ساده ترین حالت ممکن :
private static void FillCategoryListWithoutHelper()

{

List<Category> categoryList = new List<Category>();

string connectionString = @"Server=localhost;Database=Northwind;Trusted_Connec tion=true";

SqlConnection myConnection = new SqlConnection(connectionString);

SqlCommand myCommand = new SqlCommand("SELECT CategoryID,CategoryName,Description FROM Categories", myConnection);

myConnection.Open();

SqlDataReader reader = myCommand.ExecuteReader();

while (reader.Read())

{

Category category = new Category();

category.CategoryID = (int) reader["CategoryID"];

category.CategoryName = reader["CategoryName"] as String;

category.Description = reader["Description"] as String;

categoryList.Add(category);

}

myConnection.Close();

myCommand.Dispose();

}
البته میشه خیلی بهتر از این نوشت , ولی هدف در اینجا خوانایی بود .

موفق باشید

nafasak
دوشنبه 10 خرداد 1389, 17:41 عصر
خیلی ممنون،

ولی چند مساله:
اول اینکه آیا منظور شما اینه که از Helper استفاده نکنم؟
دوم: ببینید، من یک view از اطلاعات شخصی کاربر زدم، بعد یک کلاس برای این اطلاعات نوشتم، حالا میخوام وقتی این اطلاعات رو از دیتابیس میخونم اونهارو در جایی مثل ArrayList(اطلاعات تعدادی از کاربران) بریزم تا بتونم از اونها استفاده کنم. حالا این ممکنه برای یک کاربر باشه یا برای گروهی از کاربران ....

در DotNetNuke توابعی در قسمت DotNetNuke.Modules.Utility وجود داره که میشه مقدار بازگشتی SQLHelper رو در یک ArrayList از نوع کلاس تعریف شده ریخت.
CBO.FillCollection یکی از این توابع است.


public ArrayList FindAll(int pageNumber, ConditionInfo condition)
{
return CBO.FillCollection(DataProvider.Instance().FindAll (pageNumber, this.PagingSize, condition, null), typeof(Info));
}



من میخوام یه همچین تابعی بنویسم، که روی سایر پروژه ها بصورت مستقل ازش استفاده کنم، (البته فکر کردم که استفاده از Helper خیلی کارم رو راحت تر میکنه)
وگر نه وقتی کدی که شما زحت کشیدید رو دیدم، من هم یه طورایی از همچین روشهایی استفاده میکردم، ولی باتوجه به بالا بودن حجم کارم و کمبود زمان فکر کردم از Helper استفاده کنم.

لطفا منو راهنمایی کنید.
با تشکر.

Mostafa_Dindar
دوشنبه 10 خرداد 1389, 18:57 عصر
خیلی ممنون،

ولی چند مساله:
اول اینکه آیا منظور شما اینه که از Helper استفاده نکنم؟
دوم: ببینید، من یک view از اطلاعات شخصی کاربر زدم، بعد یک کلاس برای این اطلاعات نوشتم، حالا میخوام وقتی این اطلاعات رو از دیتابیس میخونم اونهارو در جایی مثل ArrayList(اطلاعات تعدادی از کاربران) بریزم تا بتونم از اونها استفاده کنم. حالا این ممکنه برای یک کاربر باشه یا برای گروهی از کاربران ....

در DotNetNuke توابعی در قسمت DotNetNuke.Modules.Utility وجود داره که میشه مقدار بازگشتی SQLHelper رو در یک ArrayList از نوع کلاس تعریف شده ریخت.
CBO.FillCollection یکی از این توابع است.


publicArrayList FindAll(int pageNumber, ConditionInfo condition)
{
return CBO.FillCollection(DataProvider.Instance().FindAll (pageNumber, this.PagingSize, condition, null), typeof(Info));
}

من میخوام یه همچین تابعی بنویسم، که روی سایر پروژه ها بصورت مستقل ازش استفاده کنم، (البته فکر کردم که استفاده از Helper خیلی کارم رو راحت تر میکنه)
وگر نه وقتی کدی که شما زحت کشیدید رو دیدم، من هم یه طورایی از همچین روشهایی استفاده میکردم، ولی باتوجه به بالا بودن حجم کارم و کمبود زمان فکر کردم از Helper استفاده کنم.

لطفا منو راهنمایی کنید.
با تشکر.

توجه نكردي عزيز من ، شما اول گفتي كه SqlHelper از فضاي نام Microsoft.Data.ApplicationBlock مقدار IDataReader برميگردونه و شما ياد نداري چطور اون رو به ArrayList انتصاب بدي، و اگر DataReader بود شما بلد بودي .

در صورتي كه هيچ كدام از متدهاي ExecuteReader از SqlHelper اون فضاي نام مقدار IDataReader برنميگردونند و همه IDataReader برميگردونند .

اين از اين .

بعدا شما گفتي نميدوني چطور به GenericType ها يا Collection ها انتصاب بدي كه من مثال گذاشتم ( اصلا ربطي به SqlHelper از فضاي مربوطه نداشت ) كه تنها يك مثال براي استفاده از GnericType ها بود .

وگرنه استفاده از SqlHelper شبيه به اين خواهد بود :

using (SqlDataReader dr = SqlHelper.ExecuteReader(AppConfiguration.Connectio nString ,CommandType.StoredProcedure, "spProduct_SelectAllPaged", arParams))
{
if (dr.HasRows)
{
tempList = new List<Product>();
while (dr.Read())
{
tempList.Add(FillDataRecord(dr));
}
}
dr.Close();
}
return tempList;


موفق باشي

nafasak
دوشنبه 10 خرداد 1389, 19:28 عصر
اولا شما استادی، از دست ما که کمتر بلدیم ناراحت نشو ;)

دوما خیلی ممنون از راهنماییت.


اگه بیشتر ناراحتت نمیکنم:
من از این روش استفاده کردم ولی 1 مشکل داشتم،
اینکه FillDataRecord رو نمیشناسه(Not Declare)

UserMasterInfo هم کلاسیه که تعریف کردم.

واین هم کل تابع:


Public Shared Function GetUserMasterInfo(ByVal UserId As Integer, ByVal UserName As String, ByVal ConnectionString As String) As List(Of UserMasterInfo)
Dim tempList As List(Of UserMasterInfo)
Using dr As SqlDataReader = SqlHelper.ExecuteReader(ConnectionString, "GetUserInfo", UserId, UserName)
If dr.HasRows Then
tempList = New List(Of UserMasterInfo)
While (dr.Read())
tempList.Add(FillDataRecord(dr))
End While
End If
dr.Close()
End Using
Return tempList

End Function

Mostafa_Dindar
دوشنبه 10 خرداد 1389, 20:06 عصر
اولا شما استادی، از دست ما که کمتر بلدیم ناراحت نشو ;)

دوما خیلی ممنون از راهنماییت.


اگه بیشتر ناراحتت نمیکنم:
من از این روش استفاده کردم ولی 1 مشکل داشتم،
اینکه FillDataRecord رو نمیشناسه(Not Declare)

UserMasterInfo هم کلاسیه که تعریف کردم.

واین هم کل تابع:


PublicSharedFunction GetUserMasterInfo(ByVal UserId AsInteger, ByVal UserName AsString, ByVal ConnectionString AsString) As List(Of UserMasterInfo)
Dim tempList As List(Of UserMasterInfo)
Using dr As SqlDataReader = SqlHelper.ExecuteReader(ConnectionString, "GetUserInfo", UserId, UserName)
If dr.HasRows Then
tempList = New List(Of UserMasterInfo)
While (dr.Read())
tempList.Add(FillDataRecord(dr))
EndWhile
EndIf
dr.Close()
EndUsing
Return tempList

EndFunction


من ناراحت نيستم :لبخندساده: منتهي من نه استادم ، نه دات نت نيوك كار كردم و نه وي بي :چشمک:.

خطايي كه ميدهد ، كاملا درست هست ، بايد هم بدهد ، من فرض رو بر اين گرفتم كه شما در پست شماره 5 روش انتصاب يك DataReader به آبجكتها ( كاري كه متد FillDataRecord ميكند ) رو ياد گرفته ايد و خودتون مينويسيد .

سخن كوتاه كنيم و بر مطلب بيافزائيم ، بايد چيزي شبيه به اين بنويسيد ، ( من اين رو تو VS ننوشتم كه تست كنم ، پس لطفا صرفا Copy & Past نكنيد ) :

public static List<YourObject> SelectAll()
{
List<YourObject> tempList;
//Thre are a lot of overload for ExecureReader mehtod ,You can choose appropriate one
using (SqlDataReader dr = SqlHelper.ExecuteReader("YourConnectionString", CommandType.StoredProcedure, "YourStoredProcedureName", "an Array of SqlParameter for your Stored Procedure"))
{
if (dr.HasRows)
{
tempList = new List<YourObject>();
while (dr.Read())
{
tempList.Add(FillDataRecord(dr));
}
}
dr.Close();
}
return tempList;
}
private static tbResults FillDataRecord(SqlDataReader reader)
{
YourObjectType obj = new YourObjectType();
if (reader != null && !reader.IsClosed)
{
if (!reader.IsDBNull(reader.GetOrdinal("Id"))) obj.Id = reader.GetInt32(reader.GetOrdinal("Id"));
//Repeat for all your properties of your object
//
//
return obj;
}
return null;
}

شاد باشيد

nafasak
دوشنبه 10 خرداد 1389, 22:46 عصر
آقا خیلی ممنون،
مشکلم حل شد...