Avatar billede Kim Neesgaard Seniormester
21. maj 2005 - 12:44 Der er 19 kommentarer og
1 løsning

Overførsel af recordset til andet databasemiljø

Hvis man har et recordset (rs med Felt1, felt2 og x records), der er udtrukket fra fx. en Oracletabel, hvordan får man så nemmest disse data gemt i et andet databasemiljø, fx. en Access tabel?
Avatar billede snepnet Nybegynder
21. maj 2005 - 12:46 #1
er det et dataset du har ?
mvh
Avatar billede arne_v Ekspert
21. maj 2005 - 12:47 #2
det kan gøres på mange måder - jeg vil mene at den pæne måde er:
- et modul som læser op fra Oracle til f.eks. en ArrayList af en data klasse
- et modul som skriver den ArrayList af en data klasse til Access
Avatar billede snepnet Nybegynder
21. maj 2005 - 12:48 #3
hvis det er tilfældet kan du bruge commands og adaptere på normal vis.... eventuelt skal du lave nogle table/column mappings, hvis der er forskel på navngivning i de to tabeller.
mvh
Avatar billede Kim Neesgaard Seniormester
21. maj 2005 - 12:54 #4
snepnet -> Jeg har normalt kun brugt recordsets, men det kunne vel også være et dataset (har ikke brugt dem). Der behøver ikke være forskel i navngivningen.

arne v -> Det var noget i den stil, jeg kunne forestille mig - hvordan vil man praktisk gøre det?
Avatar billede arne_v Ekspert
21. maj 2005 - 13:04 #5
en klasse til Oracle, en klasse til Access, en Load metode som laver en connection
en command og en data reader som bruges til at stoppe instanser af en data klasse
ind i en ArrayList, en Save metode som tager en ArrayList og laver en INSERT
for hver data objekt
Avatar billede arne_v Ekspert
21. maj 2005 - 13:06 #6
du sparer en del kode hvis du kan bruge DataSet og forskellige XxxxDataAdapter
til de samme - det kan jeg dog ikke lige gennemskue om det kommer til at hænge
sammen
Avatar billede snepnet Nybegynder
21. maj 2005 - 13:14 #7
jeg er slet ikke med - et redordset er en ADO-ting... er det ikke noget ASP.NET kode du spørger til ?
kan du ikke vise noget kode hvor det recordset du arbejder med indgår ?
(du kan godt få et eksempel på det med adaptere og mappings).
mvh
Avatar billede burningice Nybegynder
21. maj 2005 - 13:57 #8
recordset er vel en analogi til DataReader... men du har ret, ordet recordset hører ikke hjemme i ado.net. Så neesgaard, fy fy... sørg nu for at brug de rigtige betegnelser !

:)
Avatar billede burningice Nybegynder
21. maj 2005 - 13:59 #9
Er der egentlig forskel på sql-syntaksen mellem Oracle og Access?
Avatar billede burningice Nybegynder
21. maj 2005 - 14:00 #10
*dumt spørgsmål* ja, det er der

det jeg mente var, at der er vel ikke nogen forskel til simple ting som at hente og indsætte. I så fald burde man kunne lave en løsning med interfaces, og nøjes med at fodre sin klasse med to forskellige Command-objecter
Avatar billede Kim Neesgaard Seniormester
21. maj 2005 - 18:01 #11
Ja - jeg roder formodentlig noget rundt i begreberne!

Jeg har hidtil gjort som følger, når jeg vil udtrække data af fx. en SQL Servertabel:

Dim objConn As New SQLConnection("SERVER=xxx; UID=yyy; PWD=zzz; DATABASE=aaa;")
objConn.Open()
Dim SQLTekst as SQLCommand
SQLTekst = New SqlCommand("SELECT Felt1, Felt2 FROM osv")
Dim rs As SqlDataReader = SQLtekst.ExecuteReader()

og det er indholdet af rs, som jeg gerne vil have overført til en Accesstabel.
Avatar billede burningice Nybegynder
21. maj 2005 - 18:13 #12
jeps... og det er en DataReader... du kan evt. kalde din variabel for dr istedet for rs, for ligesom at vænne dig af med at kalde for et recordset ;)

men ja.. når du har det i en reader er det jo nemt at loope den igennem og sætte hver enkelt post ind i en anden database:

Dim objConn As New SQLConnection("SERVER=xxx; UID=yyy; PWD=zzz; DATABASE=aaa;")
objConn.Open()
Dim SQLTekst as SQLCommand
SQLTekst = New SqlCommand("SELECT Felt1, Felt2 FROM osv")
Dim dr As SqlDataReader = SQLtekst.ExecuteReader()

Dim objConn2 As New OracleConnection(connString)
objConn2.Open()

Do While dr.Read()

  New OracleCommand("INSERT INTO (felt) VALUES ('"& dr.GetString(0) &"')", objConn2).ExecuteNonQuery()

End While

dr.Close()
objConn.Close()
objConn2.Close()
Avatar billede snepnet Nybegynder
21. maj 2005 - 18:27 #13
du kan få det her eksempel .... det overfører godt nok noget fra den ene base i en sql-server, til en anden i samme sql-server.

men der laves en tabel fra en source-tabel med en reader, og så suges det eksisterende indhold i en target-tabel (hvis det er noget du skal opdaterer ell).

// originale data fra oracle-basen
SqlConnection sourcecon = new SqlConnection("...");
SqlCommand sourcecommand = new SqlCommand("select SourceString from SourceTable", sourcecon);

// en tabel
DataTable sourcetable = new DataTable("SourceTable");
sourcetable.Columns.Add(new DataColumn("SourceString", typeof(string)));

// hent sourcedata med en reader
sourcecon.Open();
SqlDataReader sourcereader = sourcecommand.ExecuteReader(CommandBehavior.CloseConnection);           
while(sourcereader.Read())
{
    DataRow dr = sourcetable.NewRow();
    dr["SourceString"] = sourcereader["SourceString"];
    sourcetable.Rows.Add(dr);
}
sourcereader.Close();

// connection og command
SqlConnection targetcon = new SqlConnection("...");
SqlCommand targetcommand = new SqlCommand("select TargetString from TargetTable", targetcon);
SqlDataAdapter adapter = new SqlDataAdapter(targetcommand);

// mappings
DataTableMapping mappings = adapter.TableMappings.Add("Table","SourceTable");
mappings.ColumnMappings.Add("TargetString","SourceString");

// for generering af kommandoer
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);

// vi laver et dataset og henter eksisterende data
DataSet targetdata = new DataSet();
adapter.Fill(targetdata);

// og merger sourcedata ind (mappings bruges her)
targetdata.Merge(sourcetable);

// og ned med data i basen
adapter.Update(targetdata);

du kan prøve at lege lidt med ovenstående i en testapplikation.... der er temmelig mange muligheder med datasets, datatables, adaptere mv.

nu ved jeg så ikke helt hvordan dit setup er, men det er sansynligt at du kunne have mere ud af, at lave et dataset til at starte med (ud fra sourcedata), og så lave din mapping der, således at det du suger fra kildetabellen kommer ind i tabeller der stemmer overens med dine target-tabeller.

tag ikke eksemplet for mere end det er ... det var bare for at du lige kunne se lidt forskelligt.

lige for en note - så er datasets nogle lidt "tunge" objekter, så hvis det er rigtig mange rækker du arbejder med kan det godt give dig en rigtig trist performance.

du spørger bare hvis der er noget.

mvh
Avatar billede Kim Neesgaard Seniormester
07. juni 2005 - 20:13 #14
Jeg er virkelig på glat is her, så bær venligst over....!!

Hvis jeg skal have data fra en SQL server tabel til en Accesstabel, så har jeg første del, der placerer data i dr, men sidste del er jeg i tvivl om.

Kan man skrive:

Dim objConn2 As New AccessConnection("Provider=Microsoft.Jet.OLEDB.4.0;user id=admin;password=;data source=" & Server.MapPath("/Test.mdb"))

og hvad skal denne konkret være:

New OracleCommand("INSERT INTO (felt) VALUES ('"& dr.GetString(0) &"')", objConn2).ExecuteNonQuery()

?
Avatar billede Kim Neesgaard Seniormester
14. juni 2005 - 16:07 #15
Jeg bruger dette til at hive data ud:

Dim objConn1 As New SqlConnection("SERVER...osv.")
objConn1.Open()
Dim SQLTekst as SQLCommand
SQLTekst = New SqlCommand("SELECT VNR, Initials FROM PDS.PS",objConn1)
Dim dr As SqlDataReader = SQLtekst.ExecuteReader()

og så opretter jeg en forbindelse til Accessdatabasen:

Dim objConn2
Dim DSNtemp As String
objConn2 = Server.CreateObject("ADODB.Connection")
DSNtemp= "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSNtemp= DSNtemp & "DBQ=" & Server.Mappath("Test.mdb")
objConn2.Open(DSNtemp)

burningice -> hvordan skal
New OracleCommand("INSERT INTO (felt) VALUES ('"& dr.GetString(0) &"')", objConn2).ExecuteNonQuery()
konkret se ud?

snepnet -> jeg har prøvet at bruge adapter til at sende data tilbage i Accessdatabasen, men kan ikke få det til at spille - hvordan vil det se ud i det konkrete tilfælde?
Avatar billede burningice Nybegynder
25. juni 2005 - 21:00 #16
altså... nu har tingene vist ændret sig lidt siden vi startede..

hvis flowet er SqlDatabase > Access Database skal din kode være

Dim objConn1 As New SqlConnection("SERVER...osv.")
objConn1.Open()
Dim SQLTekst as SQLCommand
SQLTekst = New SqlCommand("SELECT VNR, Initials FROM PDS.PS",objConn1)
Dim dr As SqlDataReader = SQLtekst.ExecuteReader()

Dim objConn2 As OleDbConnection("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.Mappath("Test.mdb")")
objConn2.Open()

Do While dr.Read()

  New OleDbCommand("INSERT INTO (felt) VALUES ('"& dr.GetString(0) &"')", objConn2).ExecuteNonQuery()

End Do

objConn1.Close()
objConn2.Close()
Avatar billede Kim Neesgaard Seniormester
21. juli 2005 - 09:05 #17
Ja - det har du vist ret i, men vi nærmer os kraftigt det jeg søger!!

Jeg har sat denne linie ind:

New OleDbCommand("INSERT INTO Table1 (VNR) VALUES ('"& dr.GetString(0) &"')", objConn2).ExecuteNonQuery()

men her siger den: Compiler Error Message: BC30035: Syntax error.

Kan du se, hvad der er galt her? Undskyld det har taget så lang tid at svare, men der har været ferie mv.
Avatar billede Kim Neesgaard Seniormester
19. december 2010 - 16:49 #18
Alle jeres gode indlæg har hjulpet mig videre, så vil I lægge svar, så jeg kan afslutte?
Avatar billede Kim Neesgaard Seniormester
19. december 2010 - 16:49 #19
Åh - nu kom jeg ved en fejl til at lægge svar, men jeg afventer jeres svar!
Avatar billede arne_v Ekspert
19. december 2010 - 17:58 #20
svar
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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