Gå til innhold

Kjøre SQL-update via adodb (i vba excel)


Anbefalte innlegg

Hei!

 

Jeg benytter adodb en god del for å hente ut verdier fra SQL til excel.

 

Noe slikt:

 

Public Const userId As String = "sa"
Public Const dbUser As String = "dbo"
Public Const db As String = "Databasenavn"
Public Const password As String = "Passord"
Public Const server As String = "amundpc\sql08"

Private Sub GetSystemSettings()

   Dim cnn As New ADODB.Connection
   Dim rst As New ADODB.Recordset

   Dim conStr As String
   Dim strSQL As String

   conStr = "Provider=SQLOLEDB.1;" & _
       "Initial Catalog=" & db & ";" & _
       "Data Source=" & server & ";" & _
       "User ID=" & userId & ";" & _
       "Password=" & password & ";"

   'Open Connection
   cnn.Open conStr

   strSQL = "SELECT FileFormatID FROM " & dbUser & ".SystemSettings WHERE ID = 1"

   rst.Open strSQL, cnn

   ' Get values from Query
   sqlFileFormatID = rst("FileFormatID")

   rst.Close
   cnn.Close
   Set rst = Nothing
   Set cnn = Nothing

End Sub

 

 

Dette funker jækli bra og jeg bruker denne typen i mange varianter. Benytter noen where, join på tabeller, grupperer litt osv.

 

 

Men det som er utfordringen nå er at jeg skal skrive verdier tilbake. Altså vel benytte SQL-statementet UPDATE. Så vidt jeg har forstått skal dette være fullt mulig, men at det gjøres på en litt annen måte.

 

 

Noen som har et lite enkelt eksempel som jeg kan benytte som utgangspunkt? Derfra skal jeg alltids klare meg :)

 

 

NB! Ikke aktuelt med ODBC o.l. Det blir for fort for mye søl. Vil ha alt inne i koden.

 

 

PS! Litt for trøtt til å gjennomføre effektiv testing / googling på dette nå, så derfor prøver jeg på denne posten...

 

 

På forhånd takk!

 

- Amund

Lenke til kommentar
Videoannonse
Annonse

Dim cmd = cnn.CreateCommand()
cmd.Command = "UPDATE MinTabell SET MittFelt = MinVerdi, MittAndreFelt = MinAndreVerdi"
cmd.ExecuteNonQuery()

 

Det er forøvrig poengløst å sette et objekt lik Nothing helt i slutten av koden, ettersom disse allikevel faller ut av scope vil objektet bli ansett som ute av bruk av grabage collectoren. Jeg har ikke peiling på hvorfor det var vanlig å gjøre dette i VBScript.

 

Edit: så først nå at det var Visual Basic for Applications :p Men SQL-en skal ihvertfall være det samme.

Endret av GeirGrusom
Lenke til kommentar

Hei

 

Du setter inn et par optional parametre, cursor og lock type, som du trenger for å skrive:

 

 

strSQL = "SELECT FileFormatID FROM " & dbUser & ".SystemSettings WHERE ID = 1"

 

rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic

 

If rst.EOF = False Then

 

rst("FileFormatID") = 14

 

rst.Update

 

DoEvents

 

End If

 

rst.Close

 

'osv osv

 

... på samme måte bør du definere når du bare leser; forwardonly for hastighetens skyld der du ikke trenger å spole frem og tilbake, og readonly for å garantere at brukeren ikke får skrevet til basen via usikre tekstfelter:

 

rst.Open strSQL, cnn, adOpenForwardOnly, adLockReadOnly

 

HTH. Beste hilsen Harald

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...