21. maj 2005 - 12:44Der 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?
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
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
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?
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
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
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
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 !
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
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.
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()
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);
// 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.
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?
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()
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.