PDA

View Full Version : سوال: سرعت بسیار کم درج اطلاعات در بانک اکسس



Ali.Paivar
دوشنبه 18 آذر 1392, 18:04 عصر
سلام دوستان
من برنامه ای نوشته بودم چند سال پیش تو وی بی 6 که طی یک پروسه حدود 300 هزار رکورد رو تو یه جدول درج میکرد و زمان پروسه هم حدود یک دقیقه بود. حالا میخوام همین برنامه رو با وی بی 2010 بنویسم ولی به مشکل برخوردم.قطعه کدی که در ادامه گذاشتم دوستان لطف کنید بگید که اشکال کد از کجاست؟
برنامه کار میکنه ولی سرعت خیلی کمه مثلا درج 40 هزار رکورد تو وی بی کمتر از یه ثانیه طول میکشه در حالیکه با Ado.net یا Odbc بیشتر از 60 ثانیه!
ممنون میشم اگه اساتید راهنمایی کنن.

نمونه کد برنامه وی بی 6 :



Dim dB As DAO.Database
Dim RS As DAO.Recordset
'------------------------

dB = OpenDatabase(App.Path + "\Data\Data.mdb", False, False)
RS = dB.OpenRecordset("Select * From Main")

Dim i, j As Integer
Dim Int1, Int2, Int3 As Integer
Dim Str1 As String

Int1 = 100
Int2 = 200
Int3 = 300
Str1 = " Memo Size String "

For i = 1 To 200
For j = 1 To 200
RS.AddNew()
RS.Fields(0) = Int1
RS.Fields(1) = Int2
RS.Fields(2) = Int3
RS.Fields(3) = Str1
RS.Update()
Next
Next



نمونه کد برنامه وی بی 2010 :
Oledb :

'Imports System.Data
'Imports System.Data.OleDb
'------------------------

Dim i, j As Integer
Dim Int1, Int2, Int3 As Integer
Dim Str1 As String

Dim Con As New OleDb.OleDbConnection
Dim Cmd As New OleDb.OleDbCommand
Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Data\Data.mdb"
Cmd.Connection = Con
Con.Open()

Int1 = 100
Int2 = 200
Int3 = 300
Str1 = " Memo Size String "
For i = 1 To 200
For j = 1 To 200
Cmd.CommandText = "Insert into Main(Int1,Int2,Int3,Str1)values(" & Int1 & "," & Int2 & "," & Int3 & ",'" & Str1 & "')"
Cmd.ExecuteNonQuery()
Next
Next
Con.Close()


Odbc :


'Imports System.Data
'Imports System.Data.Odbc
'------------------------

Dim i, j As Integer
Dim Int1, Int2, Int3 As Integer
Dim Str1 As String

Dim OdbcCon As System.Data.Odbc.OdbcConnection

OdbcCon = New OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};" & "Dbq=|DataDirectory|\Data\Data.mdb;")
Dim cmd As New OdbcCommand
OdbcCon.Open()

Int1 = 100
Int2 = 200
Int3 = 300
Str1 = " Memo Size String "
For i = 1 To 200
For j = 1 To 200
cmd.Connection = OdbcCon
cmd.CommandText = "Insert into Main(Int1,Int2,Int3,Str1)values(" & Int1 & "," & Int2 & "," & Int3 & ",'" & Str1 & "')"
cmd.ExecuteNonQuery()
Next
Next
OdbcCon.Close()

hosein320
دوشنبه 18 آذر 1392, 19:26 عصر
سلام
شما چرا چهارهزار بار دستور رو اجرا میکنین:متفکر:
به این شکل تغییر بدین سرعتتون تا حد زیادی افزایش پیدا میکنه

Cmd.CommandText = "Insert into Main(Int1,Int2,Int3,Str1)values
For i = 1 To 200
For j = 1 To 200
if i = 200 and j=200 then
(" & Int1 & "," & Int2 & "," & Int3 & ",'" & Str1 & "')"
else
(" & Int1 & "," & Int2 & "," & Int3 & ",'" & Str1 & "'),"
end if
Next
Next
Cmd.ExecuteNonQuery()

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

Ali.Paivar
دوشنبه 18 آذر 1392, 19:55 عصر
مرسی حین جان بخاطر پاسخت
ولی 4 هزار بار نیست چهل هزار بار هست دلیلشم اینه که طی این پروسه باید 40 هزار رکورد درج بشه تو جدول
سوال من اینه که اینکه Dao وی بی 6 نمیتونه سرعتش 100 برابر بیشتر از ado.net باشه!
بنظرم میاد اشکال در کد نویسی من هست
از این جهت راهنمایی خواستم از دوستان
اون متغیرها هر بار داخل حلقه ها محاسبه میشن و تغییر میکنن من محاسبات رو حذف کردم که کد شلوغ نشه

hosein320
سه شنبه 19 آذر 1392, 02:00 صبح
متوجه نشدین
شما میتونین چند تا رکورد رو با یه دستور اضافه کنید
به جای اینکه هر بار فقط یه رکورد رو اضافه کنید
به طور مثال این کد سه رکورد رو به جدول اضافه میکنه
insert into main(int1,int2) values(1, 2) , (3,5) , (4,9)

Ali.Paivar
سه شنبه 19 آذر 1392, 02:59 صبح
مرسی حسین جان
ایده خوبیه
میشه لطف کنی یه کوئری مثال بزنی آخه مشکل سینتکس میده اینجوری نوشتم تو وی بی 2010؟
اینو خطا میگیره:


Cmd.CommandText = "Insert into Main(Int1,Int2,Int3,Str1)values((" & Int1 & "," & Int2 & "," & Int3 & ",'" & Str1 & "'),(" & Int4 & "," & Int5 & "," & Int6 & ",'" & Str2 & "'))"

hosein320
سه شنبه 19 آذر 1392, 03:21 صبح
امتحان کن ببین درست میشه
Cmd.CommandText = "Insert into Main(Int1,Int2,Int3,Str1)values(" & Int1 & "," & Int2 & "," & Int3 & ",'" & Str1 & "'),(" & Int4 & "," & Int5 & "," & Int6 & ",'" & Str2 & "')"

Ali.Paivar
سه شنبه 19 آذر 1392, 03:53 صبح
نه متاسفانه :(
این ارور رو میده:
Missing semicolon (;) at end of SQL statement.

Ali.Paivar
سه شنبه 19 آذر 1392, 21:26 عصر
دوستان لطفا کمک کنید
مطمئنا من اولین کسی نیستم که یه تعداد زیاد رکورد رو تو دیتابیس میخوام بنویسم. اگه روش بهتری هست لطفا پیشنهاد بدید
یه جایی دیدم کسی گفته بود بهتره وقتی رکوردها زیاد هستن تو یه فایل اکسل نوشته بشن بعد این فایل یجا ریخته بشه تو دیتابیس.من رکورد ها رو مینویسم تو یه فایل csv و سرعتشم عالیه منتها نمیدونم چطور این فایل رو یجا ایمپورت کنم تو دیتابیس اکسس بوسیله کد.

Ali.Paivar
پنج شنبه 21 آذر 1392, 13:38 عصر
امتحان کن ببین درست میشه
Cmd.CommandText = "Insert into Main(Int1,Int2,Int3,Str1)values(" & Int1 & "," & Int2 & "," & Int3 & ",'" & Str1 & "'),(" & Int4 & "," & Int5 & "," & Int6 & ",'" & Str2 & "')"
حسین آقا لطف کن این کد رو خودت تست کن یه راهنمایی کن منو
بدجوری گیر کردم

Ali.Paivar
دوشنبه 25 آذر 1392, 14:04 عصر
ایها الناس کمک کنید

Ali.Paivar
چهارشنبه 27 آذر 1392, 15:32 عصر
ممنون از اساتید بخاطر کمکهاشون!
من فکر میکردم DAO چون تکنولوژی قدیمی هست برا VB 2010 تو رفرنساش نباشه ولی بعد اینکه صد تا راه رو امتحان کردم برگشتم دیدم چرا هست
برای دوستانی که تعداد رکوردشون زیاده DAO رو پیشنهاد میدم
من اینو تست کردم: هر رکورد دارای 4 فیلد، یک میلیون رکورد فقط 40 ثانیه!

MOR_MS
جمعه 27 دی 1392, 19:18 عصر
با سلام
دوست عزیز میشه کدشو برام بزاری