Avatar billede Kodelærlingen Juniormester
15. december 2016 - 08:41 Der er 7 kommentarer og
2 løsninger

Kopiere database over i et dataset

Hej
Jeg vil godt kopiere en database over i et dataset. Kan man gøre det direkte? Eller skal man loope igennem alle tabellerne, for at kopiere tabellerne over i et dataset?
Avatar billede arne_v Ekspert
15. december 2016 - 15:46 #1
Jeg tror at du bliver noedt til at loope hvis du ikke kender alle tabel navne.

Men du kan bede databasen om alle tabel navne.
Avatar billede Kodelærlingen Juniormester
15. december 2016 - 16:58 #2
OK. Tænkte det nok.

Jeg prøver at lave et udkast til i morgen. Jeg kan godt skabe forbindelse til min database, og lave en forespørgsel som viser alle tabeller i min database. Jeg kan også oprette et dataset, men så begynder det også at drille for mig.

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
Avatar billede arne_v Ekspert
15. december 2016 - 18:20 #3
noget a la:

Dim ds As DataSet
...
Dim dt As New DataTable
dt.Load(...)
ds.Tables.Add(dt)
Avatar billede Kodelærlingen Juniormester
16. december 2016 - 14:15 #4
Her er udkastet. Jeg kan stadig ikke se, hvordan jeg får loope igennem tabellerne og overført dem til mit DataSet. 

Public Sub database()

        Dim cnn As SqlConnection = New SqlConnection("Data Source=(local);Initial Catalog=testDB;Integrated Security=True")

        Try
            cnn.Open()
            cnn.Close()
        Catch ex As Exception
            MsgBox("Databasen kunne ikke åbnes!")
        End Try

        Dim sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"

        Dim cmd As SqlCommand = New SqlCommand(Sql, cnn)
        Try
            cmd.Connection.Open()
            cmd.ExecuteNonQuery()
            cmd.Connection.Close()
        Catch ex As Exception
            'Fejlmeddelelse
            MsgBox(ex.ToString)
        End Try

        Dim sda As SqlDataAdapter = Nothing
        Dim ds As DataSet = Nothing
        Dim dt As DataTable = Nothing

        sda = New SqlDataAdapter(sql, cnn)
        dt = New DataTable(sql)
        ds.Tables.Add(dt)
    End Sub
Avatar billede arne_v Ekspert
18. december 2016 - 02:45 #5
Til inspiration:


Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO

Namespace E
    Public Class Program
        Public Shared Sub Dump(ds As DataSet, tw As TextWriter)
            For Each dt As DataTable In ds.Tables
                tw.WriteLine(dt.TableName)
                For Each dr As DataRow In dt.Rows
                    For Each val As Object In dr.ItemArray
                        tw.Write(" " & Convert.ToString(val))
                    Next
                    tw.WriteLine()
                Next
            Next
        End Sub
        Public Shared Function Load(con As SqlConnection) As DataSet
            Dim tblnams As New List(Of String)()
            Using sel As New SqlCommand("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES", con)
                Using rdr As SqlDataReader = sel.ExecuteReader()
                    While rdr.Read()
                        tblnams.Add(DirectCast(rdr("TABLE_NAME"), String))
                    End While
                End Using
            End Using
            Dim ds As New DataSet()
            For Each tblnam As String In tblnams
                Dim dt As New DataTable(tblnam)
                Using sel As New SqlCommand("SELECT * FROM " & tblnam, con)
                    Using rdr As SqlDataReader = sel.ExecuteReader()
                        dt.Load(rdr)
                    End Using
                End Using
                ds.Tables.Add(dt)
            Next
            Return ds
        End Function
        Public Shared Sub Main(args As String())
            Using con As New SqlConnection(("Server=ARNEPC4\SQLEXPRESS;Database=Test;Trusted_Connection=True"))
                con.Open()
                Dim ds As DataSet = Load(con)
                Dump(ds, Console.Out)
            End Using
            Console.ReadKey()
        End Sub
    End Class
End Namespace
Avatar billede Kodelærlingen Juniormester
18. december 2016 - 16:42 #6
Ser ud til, at jeg nu får kopieret databasen over i et DataSet.

    Public Sub database()

        Dim cnn As SqlConnection = New SqlConnection("Data Source=(local);Initial Catalog=testDB;Integrated Security=True")

        Try
            cnn.Open()
            TextBox1.Text = ("Databasen er åben") & vbNewLine
        Catch ex As Exception
            TextBox1.Text = ("Databasen kunne ikke åbnes!") & vbNewLine
        End Try

        Dim schemaTable As DataTable = cnn.GetSchema("Tables")
        Dim ds As DataSet = New DataSet
        Dim table As String

        For Each row As DataRow In schemaTable.Rows
            table = row("TABLE_NAME").ToString
            TextBox1.Text += table & vbNewLine
            ds.Tables.Add(table)
        Next
        cnn.Close()

        MsgBox(ds.Tables.Count)

    End Sub
Avatar billede Kodelærlingen Juniormester
19. december 2016 - 22:27 #7
Hej arne_v
Jeg ved godt, at jeg har meget at lære om vb.net programmering, men er næsten også lige begyndt. Jeg har i mange år arbejde med Excel og har arbejdet en del med VBA.

Nu vil jeg godt arbejde med data på en anden måde, hvor jeg kan bruge vb.net til at arbejde med data samt kalde/kommunikere med Office-pakken og databaser (MS Sql).

Jeg vil godt lave et vb.net program, som kan arbejde med tabeller i:
DataSet/DataTables i vb.net
Datase/Tabeller i Sql
Workbook/Worksheet i Excel

Programmet skal kunne indlæse, udlæse og konvertere tabeller mellem ovenstående. Jeg har ikke arbejde med OOP før, da jeg kommer fra VBA-verden. Jeg har prøvet, at konvertere min VBA-kode til VB.Net kode, og det er været med sub-rutine, men ingen OOP endnu.

Med den konkrete VB.Net-kode, vil jeg godt kunne nogle flere ting. Jeg har brug for at skabe forbindelse til to forskellige database (med hver deres connections string) samt kunne kopiere database til DataSet og omvendt. Hvordan laver jeg min VB.Net kode som OOP, således den bliver mere strukturet og fleksibel, og kan imødekomme mine ønsker?

Først skal jeg jo åbne databasen, så skal jeg kalde den kode som enten kopierer databasen til DataSet eller den kode som kopiere et DataSet til en database. Hvordan skal den overordnet struktur til OOP-koden se ud?

Vil jeg kunne oprette DataSet helt overordnet, som jeg kan bruge andre steder i min kode og så til sidst lave et gennemløb, hvor jeg kopierer alle DataSet til database?
Avatar billede arne_v Ekspert
20. december 2016 - 03:44 #8
Du skal vel bruge et interface og en implementations klasse per database type.
Avatar billede Kodelærlingen Juniormester
21. december 2016 - 14:37 #9
Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester