[VBA] & [SQL] datatype mismatch

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 107mb
  • Registratie: Juni 2004
  • Laatst online: 12-09 19:08
Ik heb problemen met het volgende:
Binnen excel verplaats ik data van het ene werkblad naar het andere. Deze verplaatsing vindt plaats met behulp van SQL aan de hand van enkele selectiecriteria die de gebruiker kan opgeven.
Dit doe ik met behulp van de volgende VBA code:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub getData(SQL As String)

Dim rst As ADODB.Recordset
Dim ConnectionString As String

--bepaal de brontabel en noem deze range DATASET
Call setRangeSQL(Worksheets("Blad1"), 10, "DATASET")

ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=Excel 8.0;"

Set rst = New ADODB.Recordset

On Error GoTo Cleanup

Call rst.Open(SQL, ConnectionString, CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockReadOnly, CommandTypeEnum.adCmdText)



De SQL query die aan de procedure getData aangeboden wordt, wordt in een eerder stadium bepaald en kan er alsvolgt uitzien:
SQL:
1
SELECT * FROM DATASET WHERE  [vloer] IN ('TAPIJT')

of
SQL:
1
SELECT * FROM DATASET WHERE  [vloer] IN ('TAPIJT', ‘STEEN’) 



De kolom vloer bevat altijd strings, en levert geen problemen op.
Zo heb ik ook een kolom oppervlak, waarin altijd een double staat. Ook geen problemen.

Soms wordt er een selectie gemaakt op etage. In de kolom etage komen bijvoorbeeld de volgende waarden voor:
1
2
3
Begane grond.


De procedure die de SQL query genereert plaatst automatisch quotjes om de waarden:
SQL:
1
SELECT * FROM DATASET WHERE  [etage] IN ('1') 


Hierbij krijg ik een foutmelding: Data type mismatch in criteria expression.

Als ik de procedure aanpas, en ik bij het opbouwen van de SQL string de quotjes weglaat komt de query er alsvolgt uit te zien:
SQL:
1
SELECT * FROM DATASET WHERE  [etage] IN (1) 


Geen probleem, maar kan ik geen waarde zoals ‘Begane grond’ opgeven. Wat helemaal problemen oplevert is een where statement waarbij ik wil filteren op de 1e verdieping en beganegrond.


Wat ik dus wil is dat ik getallen in de DATASET afdwing als string.
Dit krijg ik echter niet voor elkaar. Wat heb ik geprobeerd:
- Cellopmaak als string
- Convert to string in SQL code
- In code bepalen of het een integer is, en daarmee de SQL string aanpassen. Dit gaat goed als ik alleen maar integers of strings in mijn query opneem. Dit is te kort door de bocht…

Wie kan mij helpen?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

107mb schreef op woensdag 26 januari 2011 @ 16:51:
Wat ik dus wil is dat ik getallen in de DATASET afdwing als string.
Dit krijg ik echter niet voor elkaar. Wat heb ik geprobeerd:
- Cellopmaak als string
Eérst de celopmaak instellen op tekst, en dan pas de waarden invoeren. :)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • HeSitated
  • Registratie: April 2009
  • Laatst online: 03-12-2024
[quote]107mb schreef op woensdag 26 januari 2011 @ 16:51:
Binnen excel verplaats ik data van het ene werkblad naar het andere.

Visual Basic:
1
2
3
4
Sub getData(SQL As String)
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=Excel 8.0;"


Wat je even moet proberen, door toevoegen aan Extended properties, is:
IMEX= <0/1/2>
IMEX refers to IMport EXport mode. This can take three possible values.

■IMEX=0 and IMEX=2 will result in ImportMixedTypes being ignored and the default value of �Majority Types� is used. In this case, it will take the first 8 rows and then the data type for each column will be decided.
■IMEX=1 is the only way to set the value of ImportMixedTypes as Text. Here, everything will be treated as text.
Ik heb hier echter geen goede ervaringen mee, dus zul je goed moeten testen.... >:)

Acties:
  • 0 Henk 'm!

  • 107mb
  • Registratie: Juni 2004
  • Laatst online: 12-09 19:08
bedankt voor de info. IMEX is inderdaad het sleutelwoord. Ik heb echter nog wel een aantal aanhalingstekens moeten gebruiken:

ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=""Excel 8.0; IMEX=1"""