PDA

View Full Version : دسترسی به رکورد ها با reader



near_86
دوشنبه 29 بهمن 1386, 18:11 عصر
سلام به همه دوستان

با استفاده از دستور زیر تعدادی رکورد برگشت داده میشه



PubSqlCom.CommandText = "SELECT * FROM students WHERE stu_nu1 between '" & stu1 & "' and '" & stu2 & "'"


با دیتا ست میشه مرتبا به رکورد بعد رفت اما
چطور می تونم به کمک reader به رکورد بعدی برم :گریه::گریه:

این کد برنامه من هست




PubSqlCon.ConnectionString = PubStrConString
PubSqlCom.CommandText = " select Count(*) from students where stu_nu1 between = '" & fromcode & "' and '" & tocode & "'"
PubSqlCom.Connection = PubSqlCon
If PubSqlCon.State = ConnectionState.Open Then PubSqlCon.Close()
If PubSqlCon.State = ConnectionState.Closed Then PubSqlCon.Open()
Dim maxcode AsInteger
Dim I AsInteger
Dim codelist(maxcode) AsString
'--------------------------------------------
maxcode = PubSqlCom.ExecuteScalar
'--------------------------------------------
If maxcode = 0 Then
MsgBox("هیچ دانشجویی انتخاب نشده است")
codelist(0) = "error"
'***********
Return codelist
'***********
ExitFunction
Else
PubSqlCom.CommandText = "SELECT * FROM students WHERE stu_nu1 between '" & stu1 & "' and '" & stu2 & "'"
'PubSqlCom.Connection = PubSqlCon
'If PubSqlCon.State = ConnectionState.Open Then PubSqlCon.Close()
'If PubSqlCon.State = ConnectionState.Closed Then PubSqlCon.Open()
PubSqlDR = PubSqlCom.ExecuteReader()
While PubSqlDR.Read()
For I = 0 To maxcode - 1
codelist(I) = Trim(??????)
Next I
EndWhile
'***********
Return codelist

near_86
دوشنبه 29 بهمن 1386, 20:58 عصر
از بین دوستان کسی نیست که بتونه جوابم بده

من واقعا به این مطلب نیاز دارم

visual_sadegh
سه شنبه 30 بهمن 1386, 09:21 صبح
برای اینکه دیتا ریدر به رکورد بعدی برای می تونی از متد read استفاده کنی
این متد هم به رکورد بعدی می ره و هم می تونه تشخیص بده کدتو اینطوری اصلاح کن

PubSqlCon.ConnectionString = PubStrConString
PubSqlCom.CommandText = " select Count(*) from students where stu_nu1 between = '" & fromcode & "' and '" & tocode & "'"
PubSqlCom.Connection = PubSqlCon
If PubSqlCon.State = ConnectionState.Closed Then PubSqlCon.Open()
Dim codelist() As String
Dim maxcode As Integer
Dim I As Integer
maxcode = PubSqlCom.ExecuteScalar
Redim codelist(maxcode)
If maxcode = 0 Then
MsgBox("هیچ دانشجویی انتخاب نشده است")
codelist(0) = "error"
Return codelist
End if
PubSqlCom.CommandText = "SELECT AAA FROM students WHERE stu_nu1 between '" & stu1 & "' and '" & stu2 & "'"
PubSqlDR = PubSqlCom.ExecuteReader()
Do While PubSqlDR.Read()
codelist(I) = Trim(PubSqlDR("AAA"))
Loop
Return codelist
بجای AAA نام فیلد رو بنویس

saeed_rezaei
سه شنبه 30 بهمن 1386, 09:55 صبح
دیتا ریدر در هر بار عملیات read یک رکورد رو می خونه
و هر رکورد شامل چندین فیلد هست که اگه بخوایم اندیس گذاری کنیم از صفر شروع می شن
لذا برای قسمت



codelist(I) = Trim(??????)


بایستی شماره اندیس فیلد و یا نام فیلد رو بهش داد برای نمونه:



codelist(I) = Trim ( PubSqlDR . item ( 0 ))

or

codelist(I) = Trim ( PubSqlDR . item ( "feild namme" ))



و البته شما می تونید قسمت آیتم رو حذف کنید یعنی



codelist(I) = Trim ( PubSqlDR ( 0 ))

Dariuosh
سه شنبه 30 بهمن 1386, 11:25 صبح
While dr.Read
MsgBox(dr.GetValue(1))
MsgBox(dr.GetName(1))
MsgBox(dr.GetDataTypeName(1))
EndWhile
MsgBox(dr.FieldCount)
dr.Close()

Dariuosh
سه شنبه 30 بهمن 1386, 11:34 صبح
سمپل برا استفاده از DataRader

near_86
یک شنبه 05 اسفند 1386, 20:50 عصر
ممنون از راهنمایی تمامی دوستان
اما یک error وجود داره
برنامه که اجرا میشه فقط یک شماره دانشجویی تکرار میشه در آرایه
یعنی باقی خونده نمیشن!!!


PubSqlCom.CommandText = "SELECT stu_nu1 FROM students WHERE stu_nu1 between '" & stu1 & "' and '" & stu2 & "'"
'PubSqlCom.Connection = PubSqlCon
'If PubSqlCon.State = ConnectionState.Open Then PubSqlCon.Close()
If PubSqlCon.State = ConnectionState.Closed Then PubSqlCon.Open()
PubSqlDR = PubSqlCom.ExecuteReader()
While PubSqlDR.Read()
For I = 0 To maxcode - 1
در کد زیر تمام خانه های آرایه با اولین شماره دانشجویی پر میشن !؟
codelist(I) = Trim(PubSqlDR.Item("stu_nu1").ToString)

Next I
EndWhile

nasseritemp
یک شنبه 05 اسفند 1386, 22:21 عصر
خب الگوریتم شما اشتباه است. شما در آخرین تکرار از حلقه While همه عناصر آرایه رو با مقدار فیلد stu_nu1 مربوط به آخرین رکورد پر میکنید.

saeed_rezaei
یک شنبه 05 اسفند 1386, 22:22 عصر
سلام.
بله دیگه
شما اومدید دوتا حلقه رو توی هم تعریف کردید در حالی که نیازی به یکی از حلقه ها نیست. اگه از حلقه شمارشی استفاده می کنید به یاد داشته باشید به صورت دستی
PubSqlDR.Read
رو فراخوانی کنید و اگه از حلقه while استفاده می کنید شمارش اندیسها رو دستی کنید یعنی اینجوری




i=0
while publi.read

codelist(I) = Trim(PubSqlDR.Item("stu_nu1").ToString)
i+=1
end while

visual_sadegh
دوشنبه 06 اسفند 1386, 07:15 صبح
اما یک error وجود داره
برنامه که اجرا میشه فقط یک شماره دانشجویی تکرار میشه در آرایه
یعنی باقی خونده نمیشن!!!
دوست عزیز انگار به کدی که برات ارسال کردم توجهی نکردی.بابا ای ول:تشویق:

near_86
دوشنبه 06 اسفند 1386, 09:51 صبح
از همه دوستان ممنونم
visual_sadegh (http://barnamenevis.org/forum/member.php?u=19493) عزیز من زیادی ناواردم ، متوجه کد نشده بودم:خجالت:

near_86
دوشنبه 06 اسفند 1386, 09:54 صبح
اگه از حلقه شمارشی استفاده می کنید به یاد داشته باشید به صورت دستی
PubSqlDR.Read
رو فراخوانی کنید



ممنون از کمکتون
چطور میشه به صورت دستی PubSqlDR.Read فراخوانی کرد؟

saeed_rezaei
پنج شنبه 09 اسفند 1386, 19:43 عصر
سلام.
قبلا هم گفتم که ریدر، اطلاعات مختصر تری رو نسبت به دیتاست بر میگردونه. خود من هر کاری کردم نتونستم بفهمم که ریدر چند تا رکورد رو بر می گردونه. شما یه کدی نوشته بودید، که البته بازهم فکر نمی کنم که تعداد دقیق رو برگردونه. فکر می کنم صفر یا یک رو بر میگردونه.



maxcode = PubSqlCom.ExecuteScalar
با فرض اینکه کدی که در مورد بدست آوردن تعداد رکوردهای برگشتی از دیتابیس رو درست نوشته باشید. یه جای دیگه اشتباه کردید.
اونجا که آرایه رو تعریف کردید! این کد:




Dim maxcode AsInteger
Dim I AsInteger
Dim codelist(maxcode) AsString
'--------------------------------------------
maxcode = PubSqlCom.ExecuteScalar

در خط سوم شما آرایه ای رو ساختید با طول maxcode که چون هنوز مقدار دهی نشده مقدار صفر در اون نگهداری می شه. بعدش در خط چهارم هست که maxcode رو مقدار دهی کردید که اینجوری هیچ ارزشی نداره.

پس باید جای خط سوم و چهارم رو عوض کنید.

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




Dim I as integer=0

While PubSqlDR.Read()

Codelist (i)= PubSqlDR .item (0)

I+=1
End while
در کدی که بالا نوشتم، موردی که می تونه خطا ایجاد کنه! تعداد آرایه ها هست. حلقه تکراری که نوشتم، تا زمانی که رکوردی برای خواندن در ریدر وجود داشته باشه، یک به یک رکوردها رو می خونه. پس نمی دونیم که تا چه اندازه رکورد هست که بخونیم. از طرفی تعداد آرایه های Codelist به اندازه maxcode هست. حالا اگر طول آرایه رو درست مشخص نکرده باشیم از تعداد اندیسهای آرایه ایراد می گیره.
بازهم می گم چون به نظر من کد قسمت


maxcode = PubSqlCom.ExecuteScalar
درست نیست، پس احتمال بروز خطا در طول آرایه در هنگام اجرای حلقه بالا بسیار زیاده هست.

اگه بخوایم از حلقه شمارشی استفاده کنیم ، در این صورت دیگه نیازی نیست مقادیر اندیسها رو دستی اضافه کنیم. یعنی داریم:




Dim I as integer=0

For I = 0 to maxcode

PubSqlDR.Read()

Codelist (i)= PubSqlDR .item (0)

Next i

در کد بالا، در حلقه شمارشی که به تعداد رکوردهای موجود در ریدر (؟؟؟) حلقه اجرا می شه. در هر با اجرای حلقه با استفاده از کد PubSqlDR.Read() یک رکورد جدید رو می خونیم. به عبارتی کد فوق باعث می شه که اشاره گر رکورد یکی به جلو حرکت کنه.
خطایی که اینجا ممکنه پیش بیاد بازهم از تعداد رکوردها ناشی می شه. ما حلقه رو گفتم که به تعداد maxcode اجرا بشه. حالا اگه این متغیر رو درست مقدار دهی نکرده باشیم (که نکردیم.) به نظر من دو حالت ممکن پیش بیاد. یا maxcode از تعداد واقعی رکوردهای داخل ریدر بیشتره یا کمتر.

اگه مقدارش از تعداد واقعی رکوردها کمتر باشه، کل رکوردها رو در آرایه نگهداری نمی که.
اگه هم مقدار این متغیر بیش از تعداد واقعی باشه! خوب اونوقت از PubSqlDR.Read() خطا می گیره. چون به آخر ریدر رسیدیم و دیگه رکوردی نموده که read بشه.

حالا اگه مقدار maxcode درست باشه اونوقت می شه گفت از هر حلقه تکراری که استفاد کنید مشکلی پیش نمی یاد.
اما در نهایت، در صورت بروز مشکل در خصوص مقدار maxcode دو راه حل رو پیشنهاد می کنم.
1: استفاده از reader رو کنار بزارید و برید سروقت dataset.
2: به جای استفاده از آرایه از لیستها یا پشته ها استفاده کنید. لیست ها رو می شه به راحتی در حین اجرای برنامه کم و زیاد کرد.

امیدوارم توضیحاتم مثمر بوده باشه.

near_86
جمعه 10 اسفند 1386, 08:45 صبح
saeed_rezaei (http://barnamenevis.org/forum/member.php?u=30229) عزیز ممنونم از راهنماییتون

در برنامه اصلی متوجه اشکال تعریف آرایه شده بودم و اون اصلاح کردم
اما در مورد تعداد رکوردها یعنی کد


maxcode = PubSqlCom.ExecuteScalar

چندین بار این کد امتحان کردم
و جواب برگشتی درست بود !! (البته تا 10 رکورد )

استفاده از دیتاست برای من سخت ، ی جورایی غیر قابل فهم

به نظر دوستان استفاده از این روش تا چقدر میتونه خروجی درست داشته باشه؟؟

saeed_rezaei
جمعه 10 اسفند 1386, 10:09 صبح
سلام
به نظر من اگه تعداد برگشتی رکوردها رو درست می زنه. پس نباید مشکلی باشه دیگه.