ورود

View Full Version : علت این خطا چیست ؟ آیا روش کار من درست است ؟



AmirAh
یک شنبه 13 مرداد 1392, 04:39 صبح
دوستان سلام
من برنامه کوچکی نوشته ام که با مشکل مواجه شدم . روش کار و اجزا آن را در زیر شرح میدهم ، اما نمیدانم که خطا به چه علت بوجود آمده و اینکه آیا روش کار برای انجام این عمل درست بوده است یا خیر ؟
ممنون میشوم از کسانیکه لطف کنند و مرا راهنمایی کنند.

من یک جدول در اکسس دارم که دارای 4 فیلد است که عبارتند از


RecNo = فیلد عددی - شماره رکورد
IdNum= فیلد عددی - گروه رکوردهای مربوط به یک شخص
RegDate= فیلد استرینگ برای نگهداری تاریخ
فیلد جدیدی را جدیدا اضافه کرده ام بنام Radif
Radif = فیلد عددی برای نگهداری شماره ردیف رکوردهای مربوط به یک شخص
بنابراین فیلد ردیف خالی است.

108446

برای اینکه فیلد Radif را پر کنم ، ابتدا توسط یک DataReader را خواندم و بعد بر حسب گروهبندی
فیلدهای IdNum , RegDate ، در یک حلقه شروع به پر کردن فیلد Radif کردم . بعد از حدود 50 یا 60 رکورد خطا میدهد و کار نصفه میماند
سورس کار به ترتیب زیر است:

Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Data.OleDb

Public Class FrmAAAAAAAAAAAAA
Public Class ArgumentType
Public _RecNo As Long
Public _Radif As Long
Public _RegDate As String
End Class

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strSql As String
Dim myIdNum As Long
Dim myRadif As Long
Dim myRecCounter As Long = 0

() Dim args As ArgumentType = New ArgumentType

Dim myDbRun1 As New ClassRun
Dim totalRows As Long = myDbRun1.GetValueLong("SELECT COUNT(*) FROMtblVojooheVarizi ")

strSql = "SELECT tblVojooheVarizi.RecNo, tblVojooheVarizi.IdNum, tblVojooheVarizi.RegDate, tblVojooheVarizi.Radif " & _
" FROM(tblVojooheVarizi) " & _
" WHERE (((tblVojooheVarizi.IsBaygani)=False)) " & _
" ORDER BY tblVojooheVarizi.IdNum, tblVojooheVarizi.RegDate;"

Dim myDbRun As New ClassRun
Dim dr As OleDbDataReader

myDbRun.MakeDR(strSql (

dr = myDbRun.drRun

Label2.Text = totalRows

While dr.Read ()
myRecCounter += 1
Label1.Text = myRecCounter
myIdNum = dr("IdNum")
myRadif = 1
While myIdNum = dr("IdNum")
args._RecNo = dr("RecNo")
args._Radif = myRadif
args._RegDate = IIf(IsDBNull(dr("RegDate")), " ", dr("RegDate"))
myUpdate(args)
Application.DoEvents()
dr.Read()
If myIdNum <> dr("IdNum") Then
myRecCounter += 1
Label1.Text = myRecCounter
myIdNum = dr("IdNum")
myRadif = 1
Continue While
End If
myRadif += 1
myRecCounter += 1
Label1.Text = myRecCounter
End While
End While
End Sub

( Private Sub myUpdate(ByVal args As ArgumentType
Dim cmd As New OleDbCommand
Dim SwSuccess As Integer
Dim strSql As String
Dim bt As New BahramTools

_ & " strSql = "UPDATE tblVojooheVarizi SET
_ & " Radif = " & args._Radif
" WHERE tblVojooheVarizi.RecNo=" & args._RecNo

Dim myDbRun As New ClassRun

cmd.CommandText = strSql

( SwSuccess = myDbRun.ExecCommand(cmd
If SwSuccess = 0 Then
("خطا در تصحیح اطلاعات !!!!")MsgBox
Else
("اطلاعات با موفقیت تصحیح شد")MsgBox
End If
() cmd.Dispose
End Sub
End Class

'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''' ''
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Data.OleDb

Public Class ClassRun
Dim STrPath As String
Dim ConStr As String
Dim myCon As OleDbConnection

Public dsRun As DataSet
Public dvRun As DataView
Public drRun As OleDbDataReader
Public dtRun As DataTable

Public Sub New()
STrPath = Application.StartupPath & "\Region.mdb"
ConStr = (String.Format("Provider=microsoft.jet.oledb.4.0; data source='{0}';jet oledb:database password=2ronis", STrPath))
myCon = New OleDbConnection(ConStr)
End Sub

Public Function ExecCommand(ByVal myCmd As OleDbCommand) As Boolean
On Error GoTo myerrhand
myCon = New OleDbConnection(ConStr)
myCmd.Connection = myCon
If myCon.State = ConnectionState.Closed Then
myCon.Open()
End If
Dim SwSuccess As Integer = myCmd.ExecuteNonQuery()

If SwSuccess = 0 Then
ExecCommand = False
Else
ExecCommand = True
End If
Exit Function
myerrhand:
Dim nn, dd
nn = Err.Number
dd = Err.Description
'myCon.Close()
'If nn = 5 Then
' myCon.Open()
'End If
Resume Next

End Function

Public Sub MakeDs(ByVal strSql As String)
myCon = New OleDbConnection(ConStr)

dsRun = New DataSet
If myCon.State = ConnectionState.Closed Then
myCon.Open()
End If
Dim da As New OleDbDataAdapter(strSql, myCon)
da.Fill(dsRun, "xTable")
End Sub

Public Sub MakeDR(ByVal strSql As String)
On Error GoTo myErrorHand

myCon = New OleDbConnection(ConStr)

If myCon.State = ConnectionState.Closed Then
myCon.Open()
End If
Dim cmd As OleDbCommand = New OleDbCommand(strSql, myCon)
drRun = cmd.ExecuteReader()

Exit Sub

myErrorHand:
Dim nn, dd
nn = Err.Number
dd = Err.Description
Resume Next
End Sub

Public Function GetValueLong(ByVal strSql As String) As Long
Try
Dim myValue As Long

myCon = New OleDbConnection(ConStr)
Dim cmd As OleDbCommand = New OleDbCommand(strSql, myCon)

If myCon.State = ConnectionState.Closed Then
myCon.Open()
End If

If cmd.ExecuteScalar Is DBNull.Value Then
myValue = 0
Else
myValue = cmd.ExecuteScalar
End If
myCon.Close()
Return myValue
Catch ex As Exception
myCon.Close()
MsgBox(Err.Description)
End Try
End Function

End Class


خطای بوجود آمده و محل آن

108447






http://barnamenevis.org/images/misc/pencil.png

Mani_rf
یک شنبه 13 مرداد 1392, 10:06 صبح
بعد از هر بار که myCmd.ExecuteNonQuery میکنی کانکشن رو ببند. اینطوری تو داری 50، 60 تا کانکشن باز به دیتابیس نگه میداری. معلومه که میترکه!
بعدم اون خط On Error Goto رو بردار جاش Try...catch بزار که بتونی دیباگ کنی ، اینطوری برای دیباگ کردن به مشکل میخوری. این کار برای زمانیه که دیگه خیلی مطمعنی که خطایی که رخ میده رو میدونی چیه و میتونی مدریتش کنی.

AmirAh
یک شنبه 13 مرداد 1392, 18:07 عصر
جناب Mani_rf ، با تشکر از پاسخ شما .

بعد از بستن کانکشن مشکل حل شد . باز هم ممنون .

پس از این ماجرا متوجه شدم که بعضی از مطالب مربوط به کار با پایگاه داده برایم جا نیفتاده .

میخواستم از شما خواهش کنم که مطالب مفید و خاصی به من معرفی کنید تا ضعفم در این مورد از بین برود.