webForumDet fria alternativet

Numeric Field Overflow i Recordset

1 svar · 190 visningar · startad av ElMaco

ElMacoMedlem sedan juni 2000161 inlägg
#1

Godkväll Forumet.

Jaha, då sitter man åter i klistret. Är det någon som har några pointers?

Detta har hänt...

Jag använder mig av ett ODBC-objekt och har kopplat upp mig mot en godtyckligt uppladdad Excel-fil. Sedan exekverar jag en SELECT * på en av arbetsböckerna och placerar resultatet i ett recordset-objekt.

Följande ter sig mystiskt...

- I Excelarket har jag explicit sagt att alla värden skall betraktas som "text". Ändå säger recordset-objektets Type-property att det är mycket annat; adDouble t.ex.

- När första kolumnen bestämt sig för att den skall vara adDouble och sedan förtsätter till nästa post får den ett "Numeric Field Overflow" eftersom nästa post innehåller bokstäver i den kolumn som den den tidigare defierat som adDouble. Produkten av de olika bokstävernas ASCII-värden blir högre än bitgränsen för datatypen Double och därmed har vi vårt overflow.

Frågan lyder alltså...

- Kan jag explicit tala om vilken datatyp jag vill ha på kolumnen? Eftersom lösningen är dynamiskt har jag svårt att ange kolumnnamn och därmed använda mig av CAST eller CONVERT.

- Har någon något tips på hur jag slipper undan oväntade datatyper? Jag brottades med svenskformaterade datum ett tag också. (Jmf. 2001-01-01 med 01/01/2001).

R: Dessutom... om jag flyttar upp den post som har bokstäver i sig högst upp, för att dataypen skall definieras som char eller nchar eller nått, så returneras ett tomt recordset... EOF helt enkelt.

R2: Sa jag ODBC? Jag menar ADODB, fast det är ju nästan samma sak... ;)
------------------
To understand recursion, we must first understand recursion.

[Redigerat av ElMaco den 09 sep 2001]

[Redigerat av ElMaco den 09 sep 2001]

ElMacoMedlem sedan juni 2000161 inlägg
#2

Denna artikeln behandlar problemet för VB:
http://support.microsoft.com/support/kb/articles/Q194/1/24.ASP

När man laddar upp en Excelfil å låter ADODB titta på den så låter den de första åtta raderna avgöra vilken datatyp kolumnen skall få. Om ett värde inte stämmer överens med datatypen returneras NULL - utan någon som helst kommentar... :/

Om man vill att ADODB skall titta lite längre ned i kolumnen innan den bestämmer sig kan man ändra detta i reg. nyckeln: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel

Default är 8 rader som sagt...

Slutligen kan man inte använda "formatera celler" för att komma åt detta problem. Metadatan bevaras iallafall. Alla fält måste skrivas om, eller uppdateras med hjälp av F2 + Enter.

MEN - jag har ett problem som kvarstår... Vill någon hjälpa mig med syntaxen för följande fast i VB-script. Det är främst argumenten IMEX=1 och HDR=YES jag vill skicka... men genom vilket objekt?

Dim Db As Database
      Dim Rs As Recordset

      Private Sub Command1_Click()
          Set Rs = Db.OpenRecordset("Sheet1$")
          'This will print the spreadsheet Text values as Nulls.

          Do While Not Rs.EOF
              Debug.Print Rs(0)
              Rs.MoveNext
          Loop

      End Sub

      Private Sub Form_Load()
          'HDR refers to the Excel header row.
      Set Db = OpenDatabase("C:\Temp\Book1.xls", _
               False, True, "Excel 8.0; HDR=YES; IMEX=1")

      End Sub

      Private Sub Form_Unload(Cancel As Integer)
          Db.Close
          Set Db = Nothing

      End Sub

Tacksamt...

------------------
To understand recursion, we must first understand recursion.

Genererad på 424 ms · cache AV · v20260730165559-full.f96bc7eb