MS-SQL vanuit VB6

Status
Niet open voor verdere reacties.

buick

Terugkerende gebruiker
Lid geworden
6 sep 2001
Berichten
2.898
Besturingssysteem
Windows 10/11
Hallo,

Ik ben met een programma bezig in Visual Basic 6 (dus niet de .NET versie en daar moeten wat DB handelingen worden uitgevoerd naar een MS-SQL2000 server, die lokaal draait.

Wat ik wil is het volgende (even simpel)

Het programma moet gebruikers kunnen toevoegen aan de database TEST_tblBillID

1 Programma vraagt om een gebruikersnaam en wachtwoord
2 Programma controleert vervolgens of de gebruikersnaam al bestaat
3 als de gebruikersnaam niet bestaat, wordt deze toegevoegd; als deze wel bestaat komt een foutmelding.

Het programma op zich vormt geen probleem voor mij, en ook de SQL query krijg ik wel rond.

Ik weet alleen niet (meer) hoe ik de eigenlijke verbinding met de (lokale) sql server kan maken.

Ik ben al aan het googlen geweest en kom bij verschillende sites die met ADODB werken, maar de voorbeelden daar betroffen of Access, of MySql


Kan iemand mij misschien op weg helpen :)

Alvast bedankt
 
Makkelijkst is om een ODBC koppeling te maken naar de database en dan m.b.v. ADODB de koppeling te leggen.

Om je connectstring op te bouwen kun je het best even kijken op http://www.connectionstrings.com

Verder werkt ADODB naar een SQL server database dan hetzelfde als naar een andere database.


Grtz,
 
Ik heb nu wel de koppelinig, maar loop op tegen het feit dat een SQL querie vanuit deze koppeling anders behandeld lijkt te worden dan wanneer ik deze direct in SQL invoer.

Ik heb de volgende testcode geschreven:

Code:
    Dim cn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
    
    Set cn = New ADODB.Connection
    Set cmd = New ADODB.Command
    Set rs = New ADODB.Recordset

    cn.Open "Driver={SQL Server};" & _
           "Server=(local);" & _
           "Database=TestDB;" & _
           "Uid=sa;" & _
           "Pwd=dbtest"

Ik heb in mijn form een textveld met de naam BillID waar ik namen kan ingeven, waarbij de routine vervolgens moet kijken of de naam al bestaat.
Daarvoor gebruik ik:

Code:
es = "select * from TEST_tblBillID where BillID= '" & BillID & "'"
Set rs = cn.Execute(es)

MsgBox rs.GetString
Debug.Print rs.Fields.Count
    rs.Close
    cn.Close

Als ik normaal in SQL ingeef:
SELECT from TEST_TblBillID where BillID = TestID
dan krijg ik netjes te zien of de naam al bestaat of niet.

Bij mijn VB routine echter, breekt het programma af met de melding:


Runtime Error 3021:

BOF of EOF is waar, of de huidige record is verwijderd.
Voor de gewenste bewerking moet er een huidige record zijn.


Hier zit ik dus even vast :)
 
Je mist 1 regel code denk ik. Verder denk ik dat rs.getstring mis gaat.

Code:
Set rs = cn.Execute(es)
rs.movefirst
MsgBox rs.fields(0).value

De msgbox regel haalt nu de waarde uit de eerste kolom van het resultaat van je query op. Als je 0 verandert in 1 dan wordt de tweede kolom opgehaald etc.
SELECT * heeft zo zijn nadelen, als je een veld wijzigt in je tabel en je code rekent op een bepaalde volgorde kan het mis gaan.


Grtz,
 
Als jij een betere (en makkelijkere) manier weet om te controleren of een ingevoerde naam al bestaat dan maak je me heel blij :)

Ik kan redelijk goed met VB overweg en ook met SQL

Maar de combinatie van die twee ligt me niet.
:rolleyes:
 
Een betere manier zou ik zo niet weten. Een routine die het gewenste zo kunnen bereiken:

Code:
Dim cnn As ADODB.Connection
Dim strSQL As String
Dim rs As new ADODB.Recordset
    
Set cnn = New ADODB.Connection
cnn.Open "Driver={SQL Server};" & _
           "Server=(local);" & _
           "Database=TestDB;" & _
           "Uid=sa;" & _
           "Pwd=dbtest"
strSQL = "select count(*) from TEST_tblBillID where BillID= '" & BillID & "'"
rst.open strSQL, cnn

rst.movefirst
if rst.fields(0) > 0 Then
    MsgBox "Naam bestaat al"
Else
    MsgBox "Nieuwe naam"
End If

rst.Close
cnn.Close
set rst = Nothing
set cnn = Nothing

Ik heb het niet getest en je moet de query even controleren of hij klopt met je eigen database. Maar het principe wordt hier volgens mij wel duidelijk mee.


Grtz,
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan