PDA

View Full Version : افزودن همزمان چند رکورد به بانک اکسس



Hossein Bazyan
چهارشنبه 21 فروردین 1387, 12:41 عصر
سلام
من سرگرم نوشتن برنامه ای هستم که در آن باید اطلاعات را از یک بانک اکسس گرفته و پس از انجام برخی محاسبات در فایل اکسل بنویسم .
در خواندن از اکسس و نوشتن در اکسل مشکلی ندارم . تنها مشکلی که هست سرعت میباشد .
شیوه کار من به شکل زیر است :
رکوردهایی را که میخوام روی آنها محاسبه ای صورت گیرد از بانک اکسس میخوانم
پس از هر بار خواندن رکوردها باید نتیجه محاسبه در چند سطر در اکسل نوشته شود . حال من ناچارم با هر بار محاسبه یکبار اطلاعات را با دستور insert into به اکسل بفرستم تا ذخیره شود.
رکورد جدیدی را میخوانم و دوباره همان مراحل تکرار میشود.مسئله اینجاست که مراحل خواندن از دیتابیس و ذخیره در اکسل زمانبر است یعنی سرعت کم میشه .
حال سوال من اینه که آیا میتوان مراحل فوق را به شکل زیر درآورد و این انتقالات را کمتر کرد؟
رکورددها از بانک اکسس خوانده شوند
محاسبات روی فیلدها انجام و در جایی غیر از اکسل ( مثلا یک رشته ) شده .
رکورد جدیدی خوانده شده و به انتهای همان رشته اضافه شود.
پس از اتمام عملیات خواندن از روی اکسس و انجام محاسبات یکباره در اکسل ذخیره شود.در این حالت فقط یکبار آنهم در پایان کار مراجعه به فایل اکسس انجام شده که سرعت خیلی بالا میرود.

آیا این کار امکانپذیر هست یا خیر؟

art2000ir
چهارشنبه 21 فروردین 1387, 13:47 عصر
به نظرم شما اگر از کریستال ریپورت استفاده کنید می توانید اطلاعات را از بانک بخوانید بعد به کریستال پاس کنید سپس بااستفاده از کریستال عملیات مورد نظر را انجام دهید سپس گزارش اماده چاب ، تبدیل به اکسل و یا ورد می باشد
البته فقط یک پیشنهاد است

Hossein Bazyan
چهارشنبه 21 فروردین 1387, 13:53 عصر
به نظرم شما اگر از کریستال ریپورت استفاده کنید می توانید اطلاعات را از بانک بخوانید بعد به کریستال پاس کنید سپس بااستفاده از کریستال عملیات مورد نظر را انجام دهید سپس گزارش اماده چاب ، تبدیل به اکسل و یا ورد می باشد
البته فقط یک پیشنهاد است
سلام
من نمیتوانم از کریستال استفاده کنم چون رایگان نیست .

bastam
چهارشنبه 21 فروردین 1387, 14:10 عصر
سلام
من نمیتوانم از کریستال استفاده کنم چون رایگان نیست .
خوب از نسخه رایگان (رجیستر شده) استفاده کنید.

art2000ir
چهارشنبه 21 فروردین 1387, 14:10 عصر
من نمیتوانم از کریستال استفاده کنم چون رایگان نیست .
کریستال که همراه خود وبی نصب میشه و به نظرم استفاده از اون مشکلی نداشته باشه
به هر حال
شما نمی توانید یک حدول temp داشته باشید ؟؟
اطلاعات را از بایک بخوانید و با استفاده از حلقه عملیات را انجام دهید در حدول تمپ ذخیره کید وبعد یک جا به اکسل بفرستید ؟؟؟

Hossein Bazyan
چهارشنبه 21 فروردین 1387, 14:12 عصر
کریستال که همراه خود وبی نصب میشه و به نظرم استفاده از اون مشکلی نداشته باشه
به هر حال
شما نمی توانید یک حدول temp داشته باشید ؟؟
اطلاعات را از بایک بخوانید و با استفاده از حلقه عملیات را انجام دهید در حدول تمپ ذخیره کید وبعد یک جا به اکسل بفرستید ؟؟؟

سلام
خوب همون میشه که من باهاش مشکل دارم . یعنی یه بار خواندن از اکسس انجام عملیات و جندین بار نوشتن در یک اکسس دیگه بعنوان temp

art2000ir
چهارشنبه 21 فروردین 1387, 14:28 عصر
ببیند شما اطلاعات رو از بانگ می خونید میریزید توی دیتاست بعد عملیات رو روی دیتاست انجام می دهید بعد در جدول می ریزید این کار زمان زیادی نمی بره
شما در به طور میانگین چند رکورد رو روش عملیات انجام می دهید ؟؟؟

Hossein Bazyan
چهارشنبه 21 فروردین 1387, 14:33 عصر
ببیند شما اطلاعات رو از بانگ می خونید میریزید توی دیتاست بعد عملیات رو روی دیتاست انجام می دهید بعد در جدول می ریزید این کار زمان زیادی نمی بره
شما در به طور میانگین چند رکورد رو روش عملیات انجام می دهید ؟؟؟

سلام
میشه یه مثال بزنید . چطوری تو دیتاست بریزم. من مستقیم با دستور insert into هر بار در بانک میریختم

art2000ir
چهارشنبه 21 فروردین 1387, 14:42 عصر
CON1 = New SqlConnection
CON1.ConnectionString = newgold.My.Settings.connectionstring
DA.SelectCommand = New SqlCommand("Select * From Serials where Serial_Code= " & "'" + code.Text + "'", CON1)
DA.Fill(DS, "Serials")

شما به اینن وسیله اطلاعات مورد نظر رو از بانک می خوانید و در دیتاست قرار میدهید
DS = دیتاست
DA=دیتا ادابتر


newrow.Item("Serial_other") = nj.Text

به وسیله دیتا رو هم اطلاعا ت را پردازش می کنید
اگه کافی نبود دقیقا بفرماییئ چه رکوردهائی دارید و جه عملیاتی باید روی ان انجام دهید تا بتوانم دقیق تر نمونه کد دراختیار شما قرار دهم

Hossein Bazyan
چهارشنبه 21 فروردین 1387, 14:57 عصر
CON1 = New SqlConnection
CON1.ConnectionString = newgold.My.Settings.connectionstring
DA.SelectCommand = New SqlCommand("Select * From Serials where Serial_Code= " & "'" + code.Text + "'", CON1)
DA.Fill(DS, "Serials")

شما به اینن وسیله اطلاعات مورد نظر رو از بانک می خوانید و در دیتاست قرار میدهید
DS = دیتاست
DA=دیتا ادابتر


newrow.Item("Serial_other") = nj.Text

به وسیله دیتا رو هم اطلاعا ت را پردازش می کنید
اگه کافی نبود دقیقا بفرماییئ چه رکوردهائی دارید و جه عملیاتی باید روی ان انجام دهید تا بتوانم دقیق تر نمونه کد دراختیار شما قرار دهم

سلام
مرسی دوست عزیز اینها را امتحان میکنم . این مراحل رو من تماما انجام میدادم فقط به حای اینکه با fill در دیتاست بریزم در بانک میریختم. حال بعد از اینکه هر بار با fill به دیتاست رفت آخرسر باید با دستور .ExecuteNonQuery() در بانک ذخیره بشه درسته دیگه ؟
من هر بار برای ذخیره از دستورات زیر استفاده میکردم

Try
'con_excel = New OleDbConnection(ExcelProvider)
'con_excel.Open()
cmd_excel = New OleDbCommand(insertsql, con_excel)
Application.Lock()
cmd_excel.ExecuteNonQuery()
Application.UnLock()
Catch ex As Exception
Me.AlertMsg(ex.Message)
EndTry

Hossein Bazyan
چهارشنبه 21 فروردین 1387, 15:24 عصر
سلام
از شیوه فوق نتوانستم استفاده کنم . من تکه کدی که اسلاعات را از اکسل خوانده و در اکسس ذخیره میکنه را مینویسم .
یکسری شماره را در comment ها قرار دادم برای توضیحات

Try
Dim sqlSend As String
'< 1 >---
Me.CreateWorkSheet(Trim(FileCode))
ExcelProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Trim(SavePath) & "Res_" & Trim(FileCode) & ".xls" & ";" + "Extended Properties=Excel 8.0;"
con_excel = New OleDbConnection(ExcelProvider)
con_excel.Open()
'< 2 >---
For iCount As Byte = LBound(AllVragen) To UBound(AllVragen)
'< 3 >---
sqlSend = "SELECT " & AllVragen(iCount) & " AS " & AllVragen(iCount) & ","
sqlSend = sqlSend & " COUNT(" & AllVragen(iCount) & ") AS Resultaat, " ' Vraag count
sqlSend = sqlSend & " ROUND(Resultaat * 100 / " & recCount - MissRecord(iCount) & ",1) AS Percentage," ' Percentage 1
sqlSend = sqlSend & " ROUND(Resultaat * 100 /" & recCount - MissRecord(iCount) & ",5) AS NPercentage" ' Precentage 5
'sqlSend = sqlSend & " Percentage AS Cumulatieve" ' Cumulatieve 1
sqlSend = sqlSend & " FROM " & Trim(FileCode)
sqlSend = sqlSend & " WHERE " & AllVragen(iCount) & " IS NOT NULL "
sqlSend = sqlSend & " GROUP BY " & AllVragen(iCount)
Me.DataGridViewFillingU(dgvUser, sqlSend, Trim(FileCode))
'< 4 >---
NewSql = "INSERT INTO " & Trim(FileCode) & "(Vraag, Resultaat, FPrecentage, SPrecentage, Cumulatieve) VALUES ( ' ', ' ', ' ', ' ', ' ')"
Me.InsertINTOWorkSheet(NewSql)
If dgvUser.Rows.Count > 0 Then
For id As Integer = 0 To dgvUser.Rows.Count - 1
NewSql = "('" & dgvUser.Rows(id).Cells(0).Text & "','" ' vraag
NewSql = NewSql & dgvUser.Rows(id).Cells(1).Text & "','" ' Resultaat
NewSql = NewSql & dgvUser.Rows(id).Cells(2).Text & "','" ' Percentage 1
NewSql = NewSql & dgvUser.Rows(id).Cells(3).Text & "','" ' Percentage 5
Cum = Cum + dgvUser.Rows(id).Cells(3).Text
NewSql = NewSql & Math.Round(Cum, 1) & "')" ' Cumulatieve
Co1 = Co1 + dgvUser.Rows(id).Cells(1).Text
Co2 = Co2 + dgvUser.Rows(id).Cells(2).Text
Co3 = Co3 + dgvUser.Rows(id).Cells(3).Text
NewSql = "INSERT INTO " & Trim(FileCode) & " (Vraag, Resultaat, FPrecentage, SPrecentage, Cumulatieve) VALUES " & NewSql
'< 5 >---
Me.InsertINTOWorkSheet(NewSql)
Next
'< 6 >---
NewSql = "INSERT INTO " & Trim(FileCode) & " (Vraag, Resultaat, FPrecentage, SPrecentage, Cumulatieve) VALUES ( 'tataal', '" & Co1 & "', ' " & Co2 & "', ' " & Co3 & "', ' ')"
Me.InsertINTOWorkSheet(NewSql)
'< 7 >---
NewSql = "INSERT INTO " & Trim(FileCode) & " (Vraag, Resultaat, FPrecentage, SPrecentage, Cumulatieve) VALUES ( 'missing', '" & recCount - Co1 & "', ' ',' ' , ' ')"
Me.InsertINTOWorkSheet(NewSql)
Co1 = 0 : Co2 = 0 : Co3 = 0 : Cum = 0
End If
Next
con_excel.Close()
Catch ex As Exception
Me.AlertMsg(ex.Message)
End Try

کامنت 1 : یک worksheet در اکسس ایجاد میکند
کامنت 2 : قبلا نام فیلدهای اکسس را در آرایه ذخیره کرده ام و در این قسمت همه جداول خوانده میشوند
کامنت 3 : اطلاعات از بانک اکسس خوانده شده و یکسری محاسبات روی آن انجام میشود و در datagridview نمایش داده میشود.
کامنت 4 : توسط دستور insert into و تابع Me.InsertINTOWorkSheet(NewSql) یک خط خالی در اکسس ایجاد میشود و اطلاعات از datagridview دوباره خوانده شده و در سطر بعد اکسس با دستور Me.InsertINTOWorkSheet(NewSql) ذخیره میشود.
کامنت 6 : مقادیر مجموع بدست آمده در بانک اکسس ذخیره میشود.
کامنت 7 : یک خط خالی در اکسس ذخیره میشود.

حال به نظر شما چکار میتوان کرد که اینهمه مراجعه به بانک اکسل نداشته باشیم ؟