Om jag har 2st databaser Du gör det nog smidigast i accsess. Öppna den nya databasen och importera eller länka till den gammla tabellen med data. Kör sedan INSERT INTO fråga: Jo men då blir det krångligt för användarena.. Kör följande SQL i programmet: Det går väll att bara lägga till ett fält i den gamla databasen? Då måste alla användare som kör programet ha office97 installerat.. Det är lite för mycket begärt. Om du gör ett litet program med SQL satser som ska uppdatera den befintliga databasen så kan du ju använda SQL kommandot ALTER TABLE för att t ex lägga till ett fält i en tabell. Jo det var ett bra sätt.. Varför använda ett recordset och inte connection objektet. Eller att begöra en specefik version av det? -: SELECT för db1 Vad är det du har problem med? IN borde vara det smidigaste sättet att lösa det på. Eftersom det är databasmotorn som läser av tabellen och infogar poster. Jag kopierade exemplet direkt från MSDN, tänkte inte på att de använde ett recordset istället för en connection. Jag förstår inte riktigt vad som är ditt problem, i ett inlägg säger du Vad jag är ute efter är.. Då kan du göra som jag skriver i mitt inlägg här ovanför. Jag utgår ifrån att du kör en Accessbas Får fel på följande fält Hur lyder felet?? Nu fungerar det nästan.. Det har du rätt i. Funkade fint.. Men det finns ingen kontroll över ifall han har flyttat datan och hur hindrar man Men hur kopplar man Löste problemet med änkla medel... Om du använt IN så skulle det gå mycket snabbare och mindre kod. ;o)mellan databaser
db 1 som inehåller 2st fält
db 2 som inehåller 3st fält
nu vill jag flytta allt från databas 1 till databas 2
går det att göra på ett smidigt sätt..
(håller på med en uppdatera funktion till programet)Sv: mellan databaser
INSERT INTO NyTabell (NyttFältNamn1, NyttFältNamn2)
SELECT GammaltFält1, GammaltFält2
FROM GammalTabell
Du kan även ange standardvärde för den nya kolumnen:
INSERT INTO NyTabell (NyttFältNamn1, NyttFältNamn2, NyttFältNamn3)
SELECT GammaltFält1, GammaltFält2, 'Test'
FROM GammalTabellSv: mellan databaser
meningen är att dom ska kunna uppdatera den gamla versionen med den nya som inehåller lite mer fält...Sv: mellan databaser
INSERT INTO NyTabell (NyttFältNamn1, NyttFältNamn2)
SELECT GammaltFält1, GammaltFält2
FROM GammalTabell IN 'C:\blabla\gammal_databas.mdb'
/JohanSv: mellan databaser
Kan inte koden i huvet själv men nån annan här är jag säker på kan ;)Sv: mellan databaser
Sv: mellan databaser
Detta är ett exempel från MSDN (Sök på ALTER TABLE)
<code>
Dim rs, i
Set rs = CreateObject("ADOCE.Recordset.3.1")
rs.Open "CREATE TABLE changeme (f1 varchar)"
rs.Open "ALTER TABLE changeme TO changed"
'Byt namn på ett fält
rs.Open "ALTER TABLE changed RENAME f1 TO firstfield"
'Lägg till ett fält i tabellen
rs.Open "ALTER TABLE changed ADD secondfield varchar"
rs.Open "ALTER TABLE changed ADD lastfield varchar"
'Ändra ordningen på fälten
rs.Open "ALTER TABLE changed MOVE lastfield BEFORE firstfield"
rs.Open "changed"
For i = 0 To rs.fields.Count - 1
MsgBox rs.fields(i).Name
Next
rs.Close
rs.Open "DROP TABLE changed"
Set rs = Nothing
</code>
//
JanneSv: mellan databaser
Men det är lite mera ändringar mellan den gamla
och den nya databasen..Sv: mellan databaser
<code>
Dim con as ADODB.Connection
Set con = New ADODB.Connection
con.Open "<<< Din Anslutningssträng ska stå här>>>"
con.Execute "CREATE TABLE changeme (f1 varchar)"
con.Execute "ALTER TABLE changeme TO changed"
'Byt namn på ett fält
con.Execute "ALTER TABLE changed RENAME f1 TO firstfield"
'Lägg till ett fält i tabellen
con.Execute "ALTER TABLE changed ADD secondfield varchar"
con.Execute "ALTER TABLE changed ADD lastfield varchar"
'Ändra ordningen på fälten
con.Execute "ALTER TABLE changed MOVE lastfield BEFORE firstfield"
'Tar bort tabellen
con.Execute "DROP TABLE changed"
con.Close
Set con = Nothing
</code>Sv: mellan databaser
SELECT tabellnamn.fält1,tabellnamn.fält2 FROM tabellnamn
-: INSERT för db2
INSERT INTO tabellnamn(fält2,fäl3)VALUES("' & RS("fält1") & '","' & RS("fält2") & '")
alternativt...
UPDATE tabelnamn SET fält2 = RS("fält2"),fält3 = RS("fält3") WHERE... bla bla bla
...om det är uppdatering av infon i db2 som gäller.Sv: mellan databaser
Varför fungerar inte detta sätt för dig?Sv: mellan databaser
//
JanneSv: mellan databaser
"Jo det var ett bra sätt..
Men det är lite mera ändringar mellan den gamla
och den nya databasen.."
och i nästa inlägg
"jag vill bara flytta från db1 till db2"
Vad är det egentligen du vill göra? Du har fått exempel på hur du kan förändra databasen/tabellerna med SQL och du har fått exempel på hur du flyttar/kopierar data från en tabell till en annan.
//
Janne
Sv: mellan databaser
1. jag har en databas som jag använder i mitt program.
Nu har jag ökat på databasen med några fält.
2. Föra databasen så hadde jag glömt att ändra "tillåt null" så det vart lite problem med att fälten inte fick vara tomma.
Nu har jag gjort ändring i databasen så man kan ha tomma fält. vilket blir fel i den gamla databasen.
men då kan man inte ha den gamla databasen i den nya versionen på programet för då fungerar inte programet (se.2)
Bara för att inte behöva lägga i allt igen så försöker jag hitta en "kopy funktion" mellan 2st databaser
Så jag kan flytta data från db1 (gamla) till db2 (den nya).
Hoppas det förklarar bättre vad jag menarSv: mellan databaser
Skapa två connectionobjekt. Ett för db1 och ett för db2.
Skapa sedan ett recordset dit du SELECTERAR ut all data ur db1 från.
Skriv sedan INSERTsatsen som lägger ner datan i db2 från recordset.
Vid Insertsatsen kan du jobba direkt mot connectionobjektet och använda Execute före själva SQL satsen.
conObj2.Execute "INSERT..."Sv: mellan databaser
Dim objCon1 As ADODB.Connection
Dim objCon2 As ADODB.Connection
Dim objRS As ADODB.Recordset
Dim dbNamn1 As String
Dim dbNamn2 As String
Private Form_Load()
Set objCon1 = New ADODB.Connection
Set objCon2 = New ADODB.Connection
Set objRS = New ADODB.Recordset
dbNamn1 = "Namnet_på_din_gamla_databas"
dbNamn2 = "Namnet_på_din_nya_databas"
objCon1.Open "Provider=Microsoft.Jet.OLEDB.3.51;datasource= " & dbNamn1
objCon2.Open "Provider=Microsoft.Jet.OLEDB.3.51;datasource= " & dbNamn2
objRS.Open "SELECT * FROM dinTabelliDB1", objCon1, adOpenDynamic,adLockBatchOptimistic, adCmdText
objCon2.Execute "INSERT INTO dinTabelliDB2(Fält1,Fält2,Fält3)VALUES('" & objRS("Fält1") & "','" & objRS("Fält2") & "','" & objRS("Fält3") & "')"
objCon1.Close
Set objCon1 = Nothing
objCon2.Close
Set objCon2 = Nothing
objRS.Close
Set objRS = Nothing
'Nu borde din data vara överflyttat till db2
'Du måste själv avgöra vilka fält i dina databaser som är giltiga
'Det har ju jag ingen aning om
'Därför får du modifiera vilka fält som skall hämtas ur db1 och vilka fält som skall tilldelas ur objRS till db2.
'Du kanske också måste modifiera Providern beroende på vilken version du kör. Du kankse kör 4.0?
'Lycka till
End SubSv: mellan databaser
<code>
objCon1.Open "Provider=Microsoft.Jet.OLEDB.3.51;datasource= " & dbNamn1
</code>Sv: mellan databaser
Prova förresten med att slå isär ordet datasource till Data Source istället.
Har skrivit fel där!!
Om din databas ligger i samma katalog med din VB filer räcker det med att skriva endast namnet på basen. Om inte så är det hela sökvägen fram till din databas som gäller i namnet för dbNamn1 resp. dbNamn2.Sv: mellan databaser
Han kopierar ändast första posten varje gång man startar programet
resten av posterna hoppar han över...Sv: mellan databaser
Hu r kunde jag glömma det???
Du få sätta en loop runt INSERT satsen. En loop som körs ända tills dess att recordset är tomt.
Do While Not objRS.EOF
objCon2.Execute "INSERT INTO dinTabelliDB2(Fält1,Fält2,Fält3)VALUES('" & objRS("Fält1") & "','" & objRS("Fält2") & "','" & objRS("Fält3") & "')"
objRS.MoveNext
Loop
Prova detta.Sv: mellan databaser
Tackar så mycket men en liten fråga till..
så här har jag gjort
<code>
'Läser mdb filen till ex textruta
Private Sub Command1_Click()
CommonDialog1.InitDir = App.Path
CommonDialog1.ShowOpen
Text1.Text = CommonDialog1.FileName
End Sub
</code>
typ
<code>
'hämtar databaserna till textrutan
dbNamn1 = text1.text
dbNamn1 = text2.text
</code>
funkade fint..
Men det finns ingen kontroll över ifall han har flyttat datan och hur hindrar man
vb från att lägga in samma flera gånger
koppla en ProgressBar som talar om att datan är flyttad..
och även hindrar samma data att flyttas 2ggr eller mer..
har kommit dit men hur hindrar man vb från att lägga in samma poster flera ggr??
och hur kopplar man en ProgressBar..Sv: mellan databaser
vb från att lägga in samma flera gånger
Min lösning var inte avsedd som den slutgiltiga lösningen. Som jag fattade det så var det en engångsflytt som var aktuell. Data från den gamla db1 skulle över till den nya db2.
Om det är tänkt att man också vill använda programmet fler ggr och vill kontrollera om posterna redan finns i db så kan man ju enkelt SELECTERA ut datan ur db och jämföra den datan med datan från vilken input man nu använder.
Jämför det hela med en villkorsats isåfall.
If data = data Then
UPDATE.....
Else
INSERT....
End If
...eller om update överhuvudtaget inte är aktuell
If data = data Then
Stäng dina connectio och recordsetobjekt
Else
INSERT....
End If
Nu har du kontroll över data.Sv: mellan databaser
en progressbar till Recordset.
resten kan man änkelt göra med enable funktion..Sv: mellan databaser
För andra som funderar över samma sak så lägger jag in hela coden så ni kan titta på.
<code>
'Börjar med ett noll värde
ProgressBar1.Value = 0
Set objCon1 = New ADODB.Connection
Set objCon2 = New ADODB.Connection
Set objRS = New ADODB.Recordset
'Ändrar värdet då en del av jobbet är gjort
ProgressBar1.Value = 15
'Hämtar databasen från 2st textboxar
dbNamn1 = Text1.Text
dbNamn2 = Text2.Text
'I med att den hunnit halvägs så skriver jag 50
ProgressBar1.Value = 50
objCon1.Open "Provider = Microsoft.Jet.OLEDB.3.51;data source= " & dbNamn1
objCon2.Open "Provider=Microsoft.Jet.OLEDB.3.51;data source= " & dbNamn2
objRS.Open "SELECT * FROM tblTest", objCon1, adOpenDynamic, adLockBatchOptimistic, adCmdText
'Nu är det inte mycket kvar av jobbet så därför är 75% ganska lagom
ProgressBar1.Value = 75
Do While Not objRS.EOF
objCon2.Execute "INSERT INTO tblTest(Test1,Test2)VALUES('" & objRS("Test1") & "','" & objRS("Test2") & "')"
objRS.MoveNext
Loop
'Nu är jobbet klart så då fyller jag progressbar fullt
ProgressBar1.Value = 100
'Detta gör jag bara för att man inte ska lyckas trycka på knappen 2ggr
Command1.Enabled = False
</code>
Följande cod har jag inte skrivit själv utan den äran ska gå till
<code>
Peter
</code>
utan honom så hadde detta ej blivit möjligtSv: mellan databaser
<code>
Set objCon = New ADODB.Connection
'Hämtar databasen från 2st textboxar
dbNamn1 = Text1.Text
dbNamn2 = Text2.Text
objCon.Open "Provider = Microsoft.Jet.OLEDB.3.51;data source= " & dbNamn2
objCon.Execute "INSERT INTO tblTest(Test1,Test2)" & vbCrLf & _
"SELECT Test1, Test2" & vbCrLf & _
"FROM tblTest IN """ & dbNamn1 & """"
objCon.Close
</code>