如題,我附上一個 Dbase 的資料庫,
http://www.18x.idv.tw/ascii/ascii.dbf 2k而已.. 純測試用.
該檔案只有一個欄位 TRX14 , 該欄位屬性如附圖..
http://www.18x.idv.tw/ascii/欄位屬性.jpg
該檔案內的記錄內容如附圖..
http://www.18x.idv.tw/ascii/欄位內容.jpg
然後問題如下...
我在讀取該資料庫時只能正常讀取前八筆記錄,
而從第九筆記錄則無法正常讀取,
該檔案的全部記錄都是站兩個位數唷...
請問有辦法讀的出來嗎??
因為我都只能讀出如附圖那個 S 而已...
像第一個位數我就不知道該如何讀出來了 @_@
http://www.18x.idv.tw/ascii/ascii.dbf 2k而已.. 純測試用.
該檔案只有一個欄位 TRX14 , 該欄位屬性如附圖..
http://www.18x.idv.tw/ascii/欄位屬性.jpg
該檔案內的記錄內容如附圖..
http://www.18x.idv.tw/ascii/欄位內容.jpg
然後問題如下...
我在讀取該資料庫時只能正常讀取前八筆記錄,
而從第九筆記錄則無法正常讀取,
該檔案的全部記錄都是站兩個位數唷...
請問有辦法讀的出來嗎??
因為我都只能讀出如附圖那個 S 而已...
像第一個位數我就不知道該如何讀出來了 @_@
文章標籤
全站熱搜

'在表單加入一ListBox測試!因為還是不知道你的哪一個byte在、哪一個在後,看一下註解自己改! '[一般] Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Private Sub Form_Load() Dim r(1) As Byte, p As Byte, r1 As Long s = &H42: l = 3 + 1: k = 0 '啟始位置、長度、筆數 Open "c:\ascii.dbf" For Binary As #1 '★★★路徑自己改成自己的! Do Get #1, (s + l * k), p If p = 32 Then '★★★排除己刪除的資料 '★★★如果值不對,就把r(1),r(0)對調!!! Get #1, (s + l * k + 1), r(1) Get #1, (s + l * k + 2), r(0) CopyMemory r1, r(0), 2 List1.AddItem r1 End If k = k + 1 Loop While (s + l * k) < LOF(1) Close #1 End Sub
應該是哪些內容,你應該先說,以便除錯,因為必要時,Char*3可能要轉換成Long。 ex. 1.直接輸出: Public cSQL As New cSQLService Private Sub UserForm_Click() With cSQL .ODBC_Driver = odbc_dBaseIV .dBaseFile = sPath .sqlTable = "ascii" .sqlField = "*" Set t_rst = .SQLQuery End With With t_rst For i = 0 To .RecordCount - 1 TextBox1.Text = TextBox1.Text & t_rst("trx14").Value .MoveNext Next End With End Sub 傳回結果:
不論是用字串還是unicode編碼應該都會有漏洞 無法含蓋整個&0000-&FFFF的範圍 而直接轉成LONG,其在檔案中的位置順序應該也是逆向而行,其中還包括了不可納入運算的&h20
確認規則後,才會依據需求決定是否需要進行 String -> Bytes 轉換。
'把程式跟 dbf 檔放在同一路徑下,不然就得自行修改程式中的路徑 Dim dbfconn As ADODB.Connection Set dbfconn = New ADODB.Connection dbfconn.Open "PROVIDER=MSDASQL;driver={Microsoft dBase Driver (*.dbf)};server=" & App.Path & ";" Dim adoRS As ADODB.Recordset Set adoRS = New ADODB.Recordset SQLstmt = "Select TRX14 From ascii.dbf" adoRS.Open SQLstmt, dbfconn, adOpenStatic, adLockReadOnly Dim I As Integer Dim J As Integer Dim FieldAscii As String For I = 1 To adoRS.RecordCount adoRS.AbsolutePosition = I FieldAscii = "" If IsNull(adoRS.Fields("TRX14")) Then FieldAscii = "NULL" Else For J = 1 To LenB(adoRS.Fields("TRX14")) FieldAscii = FieldAscii & AscB(MidB(adoRS.Fields("TRX14"), J, 1)) & "," Next J End If Debug.Print Format(I, "000") & ":" & FieldAscii Next I adoRS.Close Set adoRS = Nothing dbfconn.Close Set dbfconn = Nothing
當資料庫資料被讀進來時,第一個位元大組於127時,兩個位元組的資料會被轉成unicode,所以要判斷資料型式,再作轉換 下面測試程式,請在畫面上放置一個text1控制項及用Data1直接連接資料庫 Dim MyRs As Recordset Dim I As Integer Dim s As String, S2 As String Dim b() As Byte Set MyRs = Data1.Recordset.Clone MyRs.MoveFirst S2 = "" Do While Not MyRs.EOF s = "" & MyRs.Fields(0).Value S2 = S2 & Len(s) & "," & MyRs.Fields(0).Value & "," Select Case Len(s) Case 0 S2 = S2 & Hex(32) & "," & Hex(32) & vbCrLf Case 1 b = StrConv(s, vbFromUnicode) If UBound(b) = 0 Then S2 = S2 & Hex(b(0)) & "," & Hex(32) & vbCrLf Else S2 = S2 & Hex(b(0)) & "," & Hex(b(1)) & vbCrLf End If Case 2 b = s S2 = S2 & Hex(b(0)) & "," & Hex(b(2)) & vbCrLf End Select MyRs.MoveNext Loop Text1.Text = S2