使用 ADO 連接到 Excel
創(chuàng)新互聯(lián)公司技術(shù)團(tuán)隊(duì)10年來(lái)致力于為客戶提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站、高端網(wǎng)站設(shè)計(jì)、成都全網(wǎng)營(yíng)銷、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了千余家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。
ADO 使用 MDAC 中以下兩個(gè) OLE DB 提供程序中的任何一個(gè)都可以連接到 Excel 數(shù)據(jù)文件。
Microsoft Jet OLE DB Provider — 或 —Microsoft OLE DB Provider for ODBC Drivers
使用 Microsoft Jet OLE DB Provider
Jet 提供程序只需要兩條信息就可以連接到 Excel 數(shù)據(jù)源:路徑(包括文件名),和 Excel 文件版本。
Jet 提供程序使用連接字符串
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" _
"Extended Properties=Excel 8.0;"
.Open
End With
提供程序版本:必須使用 Jet 4.0 提供程序;Jet 3.51 提供程序不支持 Jet ISAM 驅(qū)動(dòng)程序。如果指定了 Jet 3.51 提供程序,在運(yùn)行時(shí)會(huì)出現(xiàn)以下錯(cuò)誤信息:
Couldn't find installable ISAM.
Excel 版本:對(duì)于 Excel 95 工作簿(Excel 版本 7.0),應(yīng)指定 Excel 5.0;對(duì)于 Excel 97、Excel 2000 或 Excel 2002 (XP) 工作簿(Excel 版本 8.0、9.0 和 10.0),應(yīng)指定 Excel 8.0 版本。
使用“數(shù)據(jù)鏈接屬性”對(duì)話框的 Jet 提供程序
如果在應(yīng)用程序中使用“ADO 數(shù)據(jù)控件”或“數(shù)據(jù)環(huán)境”,就會(huì)出現(xiàn)數(shù)據(jù)鏈接屬性對(duì)話框來(lái)收集必要的連接設(shè)置。
在提供程序選項(xiàng)卡上,選擇 Jet 4.0 提供程序;Jet 3.51 提供程序不支持 Jet ISAM 驅(qū)動(dòng)程序。如果指定了 Jet 3.51 提供程序,在運(yùn)行時(shí)會(huì)出現(xiàn)以下錯(cuò)誤信息:
Couldn't find installable ISAM.
在連接選項(xiàng)卡上,瀏覽到工作簿文件。忽略“用戶 ID”和“密碼”項(xiàng),因?yàn)檫@些不適用于 Excel 連接。(無(wú)法打開受密碼保護(hù)的 Excel 文件作為數(shù)據(jù)源。)
在所有選項(xiàng)卡上,從列表中選擇擴(kuò)展屬性,然后單擊編輯值。輸入 Excel 8.0;,用分號(hào) (;) 將其與任何其他已有的項(xiàng)分隔。如果忽略此步驟,測(cè)試連接時(shí)將出現(xiàn)一條錯(cuò)誤信息。這是因?yàn)槿绻涣硇兄付?,Jet 提供程序期望 Microsoft Access 數(shù)據(jù)庫(kù)。返回到連接選項(xiàng)卡,并單擊測(cè)試連接。將出現(xiàn)一個(gè)消息框,通知測(cè)試已成功完成即可。
這是vb2005的代碼,你試一下,這是我以前做的一段代碼,從庫(kù)中讀取到顯示。
olecon = New OleDbConnection(constr)
olecon.Open()
Dim comm As New OleDbCommand("select 照片 from 表 where name='李三', olecon)
Dim reader As OleDbDataReader = comm.ExecuteReader
reader.Read()
Dim photofile() As Byte
photofile = reader.GetValue(0)
Dim streamph As New MemoryStream(photofile)
PictureBox1.Image = Image.FromStream(streamph)
這段代碼是我從我做的小軟件中截出來(lái)的,我在2005中就用著,2005是通過(guò)的,不知道加到2010中能否執(zhí)行。
-------------------------------
根據(jù)你的發(fā)的圖,我看了,好像你從庫(kù)中取出的不是一條記錄呀,我的代碼只能取一條記錄的情況,你的明顯取出多條記錄,代碼只認(rèn)最后一條,你的文件長(zhǎng)度為0,當(dāng)然不行了
select 照片 from 表 where name='李三',這條語(yǔ)句只能取出單條記錄,且ole字段中確定有文件存在的,而且是圖片格式才能顯示
-------------------------------------------------------
Dim streamph As New MemoryStream(photofile)
你的是 Dim streamph = New MemoryStream(photofile)
這句你的和我的不一樣,是不是這里的問(wèn)題,2010沒(méi)用過(guò),要是還不行,我也不知道了
vb2010(vb.net)貌似已經(jīng)沒(méi)有OLE控件
下面的代碼是用PictureBox控件顯示CAD的DWG文件
Private?Structure?BITMAPFILEHEADER
Dim?bfType?As?Short
Dim?bfSize?As?Integer
Dim?bfReserved1?As?Short
Dim?bfReserved2?As?Short
Dim?bfOffBits?As?Integer
End?Structure
Public?Function?GetDwgImage(ByVal?FileName?As?String)?As?Image
If?Not?File.Exists(FileName)?Then?Exit?Function
Dim?DwgF?As?FileStream????'文件流
Dim?PosSentinel?As?Integer??'文件描述塊的位置
Dim?br?As?BinaryReader??'讀取二進(jìn)制文件
Dim?TypePreview?As?Integer?'縮略圖格式
Dim?PosBMP?As?Integer?'縮略圖位置
Dim?LenBMP?As?Integer?'縮略圖大小
Dim?biBitCount?As?Short?'縮略圖比特深度
Dim?biH?As?BITMAPFILEHEADER?'BMP文件頭,DWG文件中不包含位圖文件頭,要自行加上去
Dim?BMPInfo()?As?Byte??'包含在DWG文件中的BMP文件體
Dim?BMPF?As?New?MemoryStream??'保存位圖的內(nèi)存文件流
Dim?bmpr?As?New?BinaryWriter(BMPF)?'寫二進(jìn)制文件類
Dim?myImg?As?Image
Try
DwgF?=?New?FileStream(FileName,?FileMode.Open,?FileAccess.Read)????'文件流
br?=?New?BinaryReader(DwgF)
DwgF.Seek(13,?SeekOrigin.Begin)?'從第十三字節(jié)開始讀取
PosSentinel?=?br.ReadInt32?'第13到17字節(jié)指示縮略圖描述塊的位置
DwgF.Seek(PosSentinel?+?30,?SeekOrigin.Begin)?'將指針移到縮略圖描述塊的第31字節(jié)
TypePreview?=?br.ReadByte?'第31字節(jié)為縮略圖格式信息,2?為BMP格式,3為WMF格式
Select?Case?TypePreview
Case?1
Case?2,?3
PosBMP?=?br.ReadInt32?'DWG文件保存的位圖所在位置
LenBMP?=?br.ReadInt32?'位圖的大小
DwgF.Seek(PosBMP?+?14,?SeekOrigin.Begin)?'移動(dòng)指針到位圖塊
biBitCount?=?br.ReadInt16?'讀取比特深度
DwgF.Seek(PosBMP,?SeekOrigin.Begin)?'從位圖塊開始處讀取全部位圖內(nèi)容備用
BMPInfo?=?br.ReadBytes(LenBMP)??'不包含文件頭的位圖信息
br.Close()
DwgF.Close()
With?biH??'建立位圖文件頭
.bfType?=?H4D42
If?biBitCount??9?Then?.bfSize?=?54?+?4?*?(2?^?biBitCount)?+?LenBMP?Else?.bfSize?=?54?+?LenBMP
.bfReserved1?=?0?'保留字節(jié)
.bfReserved2?=?0?'保留字節(jié)
.bfOffBits?=?14?+?H28?+?1024?'圖像數(shù)據(jù)偏移
End?With
'以下開始寫入位圖文件頭
bmpr.Write(biH.bfType)?'文件類型
bmpr.Write(biH.bfSize)?'文件大小
bmpr.Write(biH.bfReserved1)?'0
bmpr.Write(biH.bfReserved2)?'0
bmpr.Write(biH.bfOffBits)?'圖像數(shù)據(jù)偏移
bmpr.Write(BMPInfo)?'寫入位圖
BMPF.Seek(0,?SeekOrigin.Begin)?'指針移到文件開始處
myImg?=?Image.FromStream(BMPF)?'創(chuàng)建位圖文件對(duì)象
Return?myImg
bmpr.Close()
BMPF.Close()
End?Select
Catch?ex?As?Exception
Return?Nothing
End?Try
End?Function