PDA

View Full Version : چطور اطلاعات واقع در يه شي datatable را به Database انتقال بدهم ..؟



Afshin160
یک شنبه 01 دی 1387, 13:57 عصر
سلام ...
يه سوال كوچولو... : من يه شي datatable دارم كه در يه dataset واقع شده است حال ميخواهم اطلاعات اين تيبل را به يه تيبل با همان فيلد ها( متناظر )در SQL Server انتقال بدهم .......؟
چطور بايد اين كارو بكنم ؟

متشكرم
افشين160

Mehdi Asgari
یک شنبه 01 دی 1387, 15:10 عصر
من زیاد با ADO.NET و پایگاه داده آشنا نیستم ولی یه راه که به ذهنم می رسه ، ایجاد یک کوئری INSERT و اجرای اون از طریق SqlCommand هست

Afshin160
یک شنبه 01 دی 1387, 18:08 عصر
سلام ...
با تشكر از دوست عزيزم ...
ولي اينجا مشكلي وجود داره ..
1- من شي dataTable دارم كه اطلاعات فقط تو اون ذخيره شده و اون هم به يه ديتاويو بايند شده
ومن نمي تونم از متد update استفاده كنم ..
2- من يه كلاس دارم كه يه فانكشن توش تعريف كرده ام كه عمل insert ,delet , up date را باگرفتن يه string كه همون دستور sql هست انجام ميده و يه مقدار بولين برميگرداند .

من قبل در SQLServer از دستور زير استفاده مي كردم

كد:
insert table1 select * from table2
ولي چون بايد به صورت DS1.Tables(0)i به شي dataTable دسترسي پيداكنم نمي تونم اون دستور بالا را اجرا كنم چون نمي تونم يه string پاس بدم .

لطفا" من را راهنمايي كنيد ...

باتشكر
افشين160

mostafaaa
دوشنبه 02 دی 1387, 18:07 عصر
سلام دوست من
کد هات رو بزار تا بررسی کنیم، چطوری به DB وصل میشی؟ چطور DataSet رو پر میکنی؟

Afshin160
دوشنبه 02 دی 1387, 18:20 عصر
سلام ...

كد اتصال به DB :


Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\MY Files-E\temp\FindFolderFile-3\FindFolderFile\bin\Debug\bankfff1.mdb;"
Dim flag As Boolean = True
'for insert , update , delete
Public Function DoCommand(ByVal ole As String) As Boolean
flag = True
Try
Dim cmd As New OleDbCommand
Dim con As New OleDbConnection
con.ConnectionString = connectionString
cmd.Connection = con
con.Open()
cmd.CommandText = ole
cmd.ExecuteNonQuery()
con.Close()
Catch ex As Exception
flag = False
MessageBox.Show(ex.Message)
End Try
Return (flag)
End Function



ودر اين جا datatable واقع در dataset را پر مي كنم :



'# find All Folder and find Files in the folder
Public Function fGetDirectories(ByVal DirectoryPath As String) As DataTable
'in ye tabe baz gashti hast
Dim MyDirCollection As System.Collections.ObjectModel.ReadOnlyCollection( Of String) = My.Computer.FileSystem.GetDirectories(DirectoryPat h)
For i As Integer = 0 To MyDirCollection.Count - 1
'for find folder
Dim dr As DataRow = F_FindView.DS1.Tables(0).NewRow()
dr("pathFull") = MyDirCollection.Item(i)
dr("firstfolder") = fnamefolder(MyDirCollection.Item(i))
dr("namefile") = ""
dr("typefile") = ""
dr("Description") = "" ' F_FindView.txtdbank.Text
dr("Reportdate") = Date.Now
dr("namebank1") = F_FindView.txtnamebank1.Text
dr("namebank2") = F_FindView.txtnamebank2.Text
F_FindView.DS1.Tables(0).Rows.Add(dr)
For Each strfolder As String In My.Computer.FileSystem.GetFiles(MyDirCollection.It em(i))
'for find files
dr = F_FindView.DS1.Tables(0).NewRow()
dr("pathFull") = MyDirCollection.Item(i)
dr("firstfolder") = fnamefolder(MyDirCollection.Item(i))
dr("namefile") = fnamefile(strfolder)
dr("typefile") = ftypefile(strfolder)
dr("Description") = "" 'F_FindView.txtdbank.Text
dr("Reportdate") = Date.Now
dr("namebank1") = F_FindView.txtnamebank1.Text
dr("namebank2") = F_FindView.txtnamebank2.Text
F_FindView.DS1.Tables(0).Rows.Add(dr)
Next
GetDirectories(MyDirCollection.Item(i))
Next
Dim dt As DataTable
dt = F_FindView.DS1.Tables(0)
Return (dt)
'F_FindView.DGW1.DataSource = DS1.Tables(0)
'Me.Refresh()
End Function


حال بعد از تغييراتي در datatable مي خواهم تيبل واقع در ديتابيس را با فيلد هاي متناظر پر كنم (يعني اطلاعات واقع در شي datatable را انتقال بدم )

متشكرم
افشين160

mostafaaa
دوشنبه 02 دی 1387, 22:14 عصر
سلام دوست من
اگه درست فهمیده باشم شما میخوای یه سری از اطلاعات سیستم (آدرس فولدرها، ....) رو ابتدا توی یه DataSet بریزی و بعدش همه رو باهم به DataBase انتقال بدی.
کدی که برات میزارم همین کار رو به روشی خیلی ساده انجام میده، که با ایده گرفتن ازش میتوین مشکل خودت رو برطرف کنی.

Imports System.IO
Imports System.Data.OleDb
Public Class Form1
Private Const ConnectionString As String = _
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Database2.accdb"
Private DataAdapter As OleDbDataAdapter
Private connection As OleDbConnection
Private DataSet As New DataSet
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Create New Table into DataSet
DataSet.Tables.Add("Table1")
'Add Cuolumns
DataSet.Tables("Table1").Columns.Add("FolderPath")
Dim ListOfFolders As List(Of String) = GetAllSubDirectory("D:\Programes")
' insert Directory Data into Table
For Each Item As String In ListOfFolders
DataSet.Tables("Table1").Rows.Add().Item("FolderPath") = Item
Next
End Sub
Function GetAllSubDirectory(ByVal Path As String) As List(Of String)
Dim TempList As New List(Of String)
For Each Item As String In IO.Directory.GetDirectories(Path, "*.*", SearchOption.AllDirectories)
TempList.Add(Item)
Next
Return TempList
End Function
'Insert all DataSet Data into DataBase
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
connection = New OleDbConnection(ConnectionString)
connection.Open()
DataAdapter = New OleDbDataAdapter
DataAdapter.InsertCommand = New OleDbCommand("INSERT INTO Table1 (FolderPath) VALUES (@FolderPath)", connection)
DataAdapter.InsertCommand.Parameters.AddWithValue("@FolderPath", GetType(String)).SourceColumn = "FolderPath"
DataAdapter.Update(DataSet, "Table1")
connection.Close()
End Sub
End Class

sepehr.net
دوشنبه 02 دی 1387, 23:38 عصر
سلام
هنگامی که شما اطلاعات یک DataSet یا DataTable رو تغییر میدهید و میخواهید انها را در بانک هم اعمال کنید با Error مواجه میشوید . دلیل آن هم ساده است چون ما اطلاعات را Insert,Update,Delete میکنیم (در DataTable) حالا باید این اعمال به دستورات قابل فهم بانک اطلاعاتی تبدیل شوند. یعنی باید به دستورات SQL تبدیل شوند
کد دوست عزیز mostafaaa (http://barnamenevis.org/forum/member.php?u=53462) رو نگاه بکنید ، خودش اومده این تبدیل را به صورت دستی نوشته که کار جالبی نیست
در صورتی اگه به این صورت مینوشت خیلی بهتر بود (من فقط قسمت اعمال تغییرات DataTable در بانک رو مینویسم)

Dim CmdBuild as SqlClient.SqlCommandBuilder(da)
da.Update(Dt)
شیئ SqlCommandBuilder کار تبدیل رو به راحتی برای ما انجام میده
یعنی بستگی به تغییراتی که ما د رDataTable دادیم این شی کد SQL ان رو به صورت خود کار تولید میکنه و به آداپتر میده

mostafaaa
سه شنبه 03 دی 1387, 10:16 صبح
سلام دوستان من
البته دلیل اینکه من از SqlCommandBuilder استفاده نکردم اینه که میخوام دوستمون نصبت به انجام این کار دید پیدا کنه، نه اینکه بیاد یه کدی رو از توی سایت کپی کنه و کارش رو راه بندازه و اصلا متوجه نشه چه اتفاقی افتاده که اگر نه من قبلا هم از SqlCommandBuilder برای حل مشکل یکی از دوستان استفاده کردم
http://barnamenevis.org/forum/showpost.php?p=621128&postcount=4
ولیکن استفاده از SqlCommandBuilder همیشه کارساز نیست و در بعضی از موارد محدودیتهایی هم داره برای مثال سعی کنید در یه جدول که PK نداره بوسیله این شی عمل آپدیت یا حذف رو انجام بدید.

Afshin160
سه شنبه 03 دی 1387, 11:10 صبح
سلام ..
دوستان ازتون متشكرم ..
راه mostafaaa (http://barnamenevis.org/forum/member.php?u=53462) جان براي من مبتدي بهتر است ...
فقط mostafaaa (http://barnamenevis.org/forum/member.php?u=53462) جان اگر برات ممكن يه توضيحي در رابطه با دو خط زير بده :


DataAdapter.InsertCommand = New OleDbCommand("INSERT INTO Table1 (FolderPath) VALUES (@FolderPath)", connection)
DataAdapter.InsertCommand.Parameters.AddWithValue("@FolderPath", GetType(String)).SourceColumn = "FolderPath"
DataAdapter.Update(DataSet, "Table1")


متوجه نشودم اين جا چه كار كردي ...
نگاه كن من تمام اطلاعاتم را تو DS1.Table(0) دارم و ميخوام آنها را در يه تيبل متناظر در ديتابيسم كپي كنم ...
ابته راه حل شما در رابطه با پيدا كردن فايلها و فلدر ها فكر كنم تنها تا 1-2 تا سطح فلدر تو در تو جواب بده و ولي در كد و تابع بازگشتي كه من نوشتم تمام فلدر ها ي تو در تو را بيرون ميكشه ...
بي خيال از بحث اصلي دور نشيم ...
هدفم فعلا" انتقال اطلاعات شي datatabke به ديتابيس هست ...

با سپاس از تمام دوستاني كه من را راهنمايي كردن ...
افشين160

mostafaaa
سه شنبه 03 دی 1387, 11:33 صبح
سلام دوست من
همانطور که دوستمون sepehr.net (http://barnamenevis.org/forum/member.php?u=46790) هم گفتن برای اینکه اطلاعات داخل DataTable رو داخل بانکت بریزی باید از دستوراتی استفاده کنی که برای بانک قابل فهم باشه، حالا هر شی DataAdapter سه تا Property از نوع oledbCommand داره که برای اعمال اضافه کردن و حذف کردن و ویرایش کردن رکوردهامون ازشون استفاده میکنیم.
توی قطعه کد بالا من فقط کد مربوط به اضافه کردن رو با دستور SQL که دیدی قرار دادم و مقداری هم رو که قراره توی بانک قرار بگیره با استفاده از پارامتر FolderPath@ مشخص کردم که در خط بعدش هم مشخص کردم که این پارامتر از کجا مقدار دهی بشه(ستون FolderPath در DataTable ).
و در آخر هم عمل آپدیت رو انجام دادم تا دیتابیسم با دیتاتیبل داخل برنامه سینک بشه.

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

Afshin160
سه شنبه 03 دی 1387, 12:55 عصر
دوباره سلام ..
پس mostafaaa (http://barnamenevis.org/forum/member.php?u=53462) جان من براي تمام ستونها ي datatable بايد اين كارو بكنم ... يعني بايد اگر 8 تا Column دارم تو اين insert هر 8 ستون را با پارمتر هاش بيارم ...

DataAdapter.InsertCommand = New OleDbCommand("INSERT INTO Table1 (FolderPath,col2,col3) VALUES (@FolderPath,@col2,@col3)", connection)


درسته؟
و با اين كار در هر مرحله تمام(اطلاعات ) سطرهاي واقع در اون ستون به ديتابيسم اضافه ميشن ..درست ميگم ؟




DataAdapter.InsertCommand.Parameters.AddWithValue("@FolderPath", GetType(String)).SourceColumn = "FolderPath"
DataAdapter.InsertCommand.Parameters.AddWithValue("@col2", GetType(String)).SourceColumn = "col2"
DataAdapter.InsertCommand.Parameters.AddWithValue("@col3", GetType(String)).SourceColumn = "col3"


متشكرم
افشين160

sepehr.net
سه شنبه 03 دی 1387, 13:34 عصر
mostafaaa (http://barnamenevis.org/forum/member.php?u=53462) جان کاملا" حق با شماست
هدف من از نوشتن این دستور این بود که :
مزیت این روش (استفاده از DataTable برای تغییرات اطلاعات در بانک) اینه که دیگه احتیاجی به نوشتن دستوارات SQL نیست. من هم برای همین این کلاس رو به دوستمون معرفی کردم که کارش راحت تر باشه !!!

استفاده از SqlCommandBuilder همیشه کارساز نیست و در بعضی از موارد محدودیتهایی هم داره برای مثال سعی کنید در یه جدول که PK نداره بوسیله این شی عمل آپدیت یا حذف رو انجام بدید.
من خودم به این موضوع تا حالا توجه نکرده بودم (جالب بود)
یعنی راهی وجود نداره !!!
شما میدونید کار این دستور چیه ؟

da.MissingSchemaAction = MissingSchemaAction.AddWithKey
فکر کنم به بحث مون مربوط میشه

CATGAUDY
سه شنبه 03 دی 1387, 13:53 عصر
سلام دوستان ...
ببخشيد من خيلي تازه كارم ...
آقا sepehr.net ميشه در رابطه با كد :زير توضيحي بديد


Dim CmdBuild as SqlClient.SqlCommandBuilder(da)
da.Update(Dt)


من اين كد را نوشتم ولي فكر كنم اشتباه نوشتم ....
آيا Dt همان datatable هست ؟
آيا منظور شما از Da همون System.Data.OleDb.OleDbDataAdapter هست ...؟
اگر اين چنين هست بايد ConnectionString و sqlstring اون را چي تعريف كنم ....؟...

sepehr.net
سه شنبه 03 دی 1387, 22:21 عصر
سلام

آيا Dt همان datatable هست ؟
آره

آيا منظور شما از Da همون System.Data.OleDb.OleDbDataAdapter هست ...؟
آره فرقی نمیکنه چه SQL یا Oledb

اگر اين چنين هست بايد ConnectionString و sqlstring اون را چي تعريف كنم ....؟...
در پست های قبلی نوشته شده من فقط این دو دستور را برای اعمال تغییرات در بانک نوشتم
در همون پستی که این دستور رو نوشتم توضیحی هم راجع به اون دادم که کارش چیه