利用Vb保存一幅图到Access数据库

合集下载

VB如何连接ACCESS数据库详解

VB如何连接ACCESS数据库详解

VB如何连接ACCESS数据库详解首先有一点要注意,数据库的使用与我们以往所使用的文本文件不同.例如我们使用文本文件,来记录各种有用的数据.那么大致有以下几步:读取文件--格式化数据--关闭文件--使用数据如果数据量很大,须要展开甄选,且存放数据的源文件可能将不定时更改,那么我们可以用一个临时文件去放置有价值的数据,这样可以大大提高程序的效率.必须[格式化数据]时,我们首先必须展开甄选,然后还得展开分类,这样文件中的字符串就可以被转换成有价值的信息以供程序采用.这样一来,不用说,处理速度将大大减缓,而且即使你设计的数据格式比较科学,当数据量非常小时,文件的容量也可以变小的使普通计算机无法忍受.相对文本文件来说数据库的使用也大致分为以下几步:打开数据库--查找数据--使用数据--关闭数据库从中可以窥见,里面太少了一步格式化数据,因为数据库本身在存储数据时,它就是按照一定的格式去展开存储的.其次是,数据库与文本文件返回数据的方法不同.如果把文本文件比作一个textbox的话,那么数据库更像是一个listbox.使用文本文件时我们需要从整个textbox中取出有用的信息,并进行处理,而listbox则可以根据需要返回特定的某一项.由于vb本身并不具有可以出访数据库的类,所以我们须要提及一个涵盖能够出访数据库的Derrien采用数据库.这里我们使用adodb,较之dao和能够出访数据库的api来说,它比dao更有效率,更强悍;而较之api,它更直观功能强大,更适宜初学者.而access数据库较之sql,也相对直观了很多,且能满足用户中小型应用程序的须要,所以我们在采用数据库时,挑选了access.就像使用文本文件来存储数据一样,我们需要先设计好数据结构,只不过在设计access 数据库的结构时,我们需要用到其它的程序来进行详细的规划.建议采用的程序是office 中的access或vb自带的visdata.当数据库设计不好了以后,我们可以已经开始\数据库编程\了.首先,我们需要引用ado.具体的方法是,在\工程\--\引用\中,找到\activexdataobject*.*library\这里的\是指的时ado的版本号,一般来说,应用程序或activex控件都具有向下兼容性,所以我们尽可能选择比较新的版本.以确保程序在能识别旧版本access的同时,也能识别较新版本的access.然后我们须要在程序中建立一个对象.就如同我们在窗体上嵌入一个filebox就可以看见文件名一样,只有建立了ado对象,我们才能出访数据库.常用的对象存有两个,connection和recordset.创建这两个对象的具体方法是:1.在引用后,使用new关键字,如privateconnasnewadodb.connectionprivaterecoasnewadodb.recordset2.在没有提及时,用createobject创建对象:dimconn,recosetconn=createobject(\setreco=createobject(\建立了对象之后,下一步我们必须搞的就是关上数据库了.先看看下面的代码,可以顺利的关上数据库.conn.open\这句代码打开了d盘中的main.mdb这个数据库.connection.open方法的第一个参数就是相连接代码,它将传达给系统的数据库引擎.前半部分后\microsoft.jet.oledb.4.0\它则表示了数据库的类型.相同的数据库可能会相同.后半句\它则表示了数据库所在的绝对路径.打开数据库之后,还要打开表.假如数据库中有一个表,表名为\字段有两个,一个为用户名,一个为密码.那么看以下代码.1.想要回到\中,[用户名]为\去年烟花\的[密码]recordset.open\密码fromuserswhere用户名='去年烟花'\之后我们就可以把用户输出的密码展开比较,看看与否容许登入.ifrecordset.eofandrecordset.bofthenmsgbox\用户不存有!\elseifpassword=recordset(\密码\msgbox\登录成功!\elsemsgbox\密码错误!\endifendifrecordset.close2.假设admin已经顺利登入系统,我们想要把所有的用户名和密码都表明出recordset.open\这时,表中已经被关上,我们就用以下代码把它表明出.dowhlienotrecordset.eofprint\用户名:\用户名\密码:\密码\recordset.movenextlooprecordset.close由以上代码示例可以看出,打开表时,可以只打开其中的一个字段,也可以打开所有.第一个参数是sql语句.select[字段名]from表名[where条件]这里的条件可以省略.且字段名也可以用\来代替所有字段.须要特别注意的就是,如果你用(1)中的方法关上,那么(2)后面表明的代码就无法皮德盖在(1)中.因为(1)里并没关上[用户名]字段,所以这一句recordset(\密码\就没值存有,除了可能将失效.后面的条件,可以用\、\、\等运算符.比如说\这里假设[id]为数字型.)这是打开的部分.第二个很重要的部分就是查询记录.数据库它并不是把所有记录全部放在一个变量中水泵的.而是以\当前记录\的形式去回到一个值.所以我们想要从中找出有价值的信息,就必须必须对信息展开定位/甄选.定位:移动到下一条recordset.movenext移动到上一条recordset.moveprevious移动到最后一条recordset.movelast移动至第一条recordset.movefrist移动至某一条recordset.movenumber甄选:recordset.find\条件\recordset.find\用户名=\ifrecordset.eof<>truethenmsgbox\该用户的密码是:\密码\elsemsgbox\未找到该用户的资料!\endifendsubmovenext只有当eof不为true时,才可用,否则发生错误.而moveprevious刚是bof不为true时....而只要eof和bof中存有一个不为真时,也就是说只要存有一条记录时,它就可以采用.find方法中的条件和open时的第一个参数中的条件表述方法是完全一致的.当在已打开的记录集中,找不到该记录时,eof为true.找到则当前的值就是符合条件的记录.第三个部分就是嵌入/修正记录.修改记录很简单,先按以上的方法找到相关记录之后,给记录赋值就可以了.比如:[(修改密码)按方法(1)打开表之后]recordset(\密码\recordset.updata须要特别注意的就是,在修正顺利完成后,必须调用updata方法,这样修正就可以生效.而嵌入记录则可以用以下代码去同时实现:recordset.addnewrecordset(\用户名\recordset(\密码\recordset.updata这里,先必须调用addnew方法,减少一条崭新记录,然后对这个崭新记录中的各字段赋值,最后再调用updata方法.到这里就差不多了,最后说一下上面提到的几个方法.recordset.opensql语句,数据源,游标类型,打开方法sql语句不用说了,就是select那啥的,目的就是按建议从表回到数据数据源就是一个关上之后的connection对象.回去他妈的游标类型,填上1就可以了[里头ing]打开方法对应了几个常数,具体哪几个可以从对象浏览器里看.对应数值的意义:1所读2独霸3展毛4自已可以写下,别人复本connection.open相连接代码,服务器用户名,密码这里的连接代码就不在多说了,服务器用户名,密码只有在连接远程数据库时才用到.在搞项目时,经常碰到必须将excel中的大量数据复制到access数据库中,原来的作法就是念一条写下一条,若引入上万条的数据须要几分仲时间,速度很慢。

vb高速存储到access数据库中

vb高速存储到access数据库中

Private Sub Command1_Click()Dim s As StringDim Conn As New ADODB.ConnectionDim Rs As New ADODB.RecordsetConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\mydb.mdb" '请将数据库名及路径换成你的实际数据库名及路径Dim UserName As StringDim Password As Strings = Text1.TextIf s = "1" Or s = "2" ThenUserName = InputBox("请输入用户名")Password = InputBox("请输入用户密码")sql = "Select * From [UserInfo] where User='" & UserName & "'"'UserInfo请换成你的实际数据表名Rs.Open sql, Conn, 1, 3If Rs.EOF ThenMsgBox "没有找到此用户"ElseIf Rs("Password") = Password ThenIf s = "1" ThenMsgBox "123"ElseIf s = "2" ThenMsgBox "456"End IfElseMsgBox "密码错误"End IfEnd IfEnd IfEnd Sub上面的例子实现了查询如果是要添加,删除,更新等操作,只要编写相应的SQL语句,再用Conn.Execute SQL 就可以了,如:添加的:SQL="Insert Into [UserInfo](User,Password) Values('aaaa','1234')" Conn.Execute SQL '执行后,就添加了一条记录删除:SQL="Delete From [UserInfo] Where User='aaaa'"Conn.Execute SQL '删除用户名为aaaa的用户记录更新:SQL="Update [UserInfo] Set Password='abcdefg' Where User='aaaa'" Conn.Execute SQL '执行后,修改用户aaaa的密码为abcdefg以上只是示例,在实际使用过程中,可以将一些内容用控件输入等方式进行,这样就有很大的灵活性了动态创建数据库引用 microsoft DAP 3.6 Object LibraryDim myDB As DAO.DatabaseSet myDB = CreateDatabase(App.Path + "\111.mdb", dbLangGeneral) '如果不存在数据库Set myDB = OpenDatabase(App.Path + "\111.mdb") '如果存在数据库Dim str_SQL As Stringstr_SQL = "Create Table NewTable1(Field1 Text(10),Field2 Short)" myDB.Execute str_SQLstr_SQL = "Create Table NewTable2(Field1 Text(10),Field2 Short)" myDB.Execute str_SQLmyDB.Close向已经建好的数据库中添加记录建立数据库a,表名字b,字段c,文本格式,在窗体上画一command ,画一个文本框,这个代码就是将文本内容写入数据库要先引用microsoft activeX data object 2.5 library代码如下:Private Sub Command1_Click()Dim cnDk As New ADODB.ConnectionDim strDk As StringDim rDk As New ADODB.RecordsetDim sql As StringstrDk = "DBQ=" & App.Path & "\a.mdb;Driver={Microsoft Access Driver (*.mdb)};"cnDk.Open strDksql = "insert into b (c) values ('" & text1.text& "')"cnDk.Execute sqlcnDk.CloseSet cnDk = NothingEnd Sub在数据库中添加多条记录只要可以进行输入文本的都可以改一下这些吧,你单击一次就提示输入一次,输完了自动保存改后Data1.Recordset.AddNewData1.Recordset.Fields("username") = trim(inputbox("请输入名字")) Data1.Recordset("password") =val(trim(inputbox("请输入电话")))Data1.UpdateRecord ——————————————————————————————Data1.Recordset.AddNewData1.Recordset.Fields("username") = "张三|"Data1.Recordset("password") = "fsdfsd"Data1.UpdateRecordData1.Recordset.AddNewData1.Recordset.Fields("username") = "李四|"Data1.Recordset("password") = "fsdf432d"Data1.UpdateRecordData1.Recordset.AddNewData1.Recordset.Fields("username") = "王五|"Data1.Recordset("password") = "f42342d"Data1.UpdateRecordMsgBox "adad"===================================================================== ===================vb+access 数据库的记录的添加与删除Dim cn As New ADODB.ConnectionDim rs As New ADODB.RecordsetPrivate Sub Command2_Click()Set rs = cn.Execute("select * from wenzhang where 内容='" & Text1.Text & "'")If Text1.Text = "" ThenMsgBox ("文章不能为空!")ElseIf rs.EOF = False ThenMsgBox ("文章不能重复!")Elsecn.Execute ("insert into wenzhang values('" & Combo1.Text & "','" & Text3.Text & "','" & Text4.Text & "','" &Text1.Text & "')")MsgBox ("ok")End IfEnd Sub'添加按钮Private Sub Command3_Click()Dim myval As StringSet rs = cn.Execute("select * from wenzhang where 内容='" & Text1.Text & "'")If rs.EOF Thenmyval = MsgBox("是否保存文章?", vbInformation + vbYesNoCancel, "提示")If myval = vbYes Thencn.Execute ("insert into wenzhang values('" & Combo1.Text & "','" & Text3.Text & "','" & Text4.Text & "','" &Text1.Text & "')")MsgBox ("保存成功")ElseCombo1.Text = ""End IfElseText1.Text = ""Combo1.Text = ""End IfEnd Sub'删除按钮Private Sub Command4_Click()If Text1.Text = "" ThenMsgBox ("不能删除空记录!")ElseDim myval As Stringmyval = MsgBox("是否删除文章?", vbInformation + vbYesNo, "提示")If myval = vbYes ThenSet rs = cn.Execute("delete from wenzhang where 内容 ='" & Text1.Text & "'")MsgBox ("删除成功!")End IfEnd IfEnd Sub'连接数据库Private Sub Form_Load()cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=\\temp.mdb;Persist Security Info=False"cn.CursorLocation = adUseClientcn.OpenEnd Sub在VB环境下做了一个东东替代前面讲的程序,并得到了很大的提速,觉得还有上升的空间希望大家来讨论1\VB创建及打开XLS文件似应可以更快2\只有6W多条记录由数组到工作表会用10多S?3\关闭及销毁的时间也用到了几S!4\感觉上EXCEL转到ACC上的速度再也无法上升了吧?这是结果:处理XL总时间: 21.12建工作表对象时间: 3.5打开工作表时间: 5.47工作表赋值时间: 9.64保存时间工作表: 2.25关闭清空工作表对象时间:.2659730条数据由XL到ACC时间:10.34下面是程序:Sub TestXlToAcc(Arr)Dim SQL$Dim A, i&, j&Dim AppExcel As New Excel.Application '使用前期绑定,快了点!Object '定义Excel应用程序对象Dim WbMyBook As New Excel.Workbook 'Object ' 定义工作簿对象Dim WsMySheet As Object '定义工作表对象Dim AAA!, S1!, S2!, S31, S4!, S5!AAA = TimerDim TempXls$TempXls = App.Path & "\TEMP.xls"'可以先关后存,最好是不用保存就可以转入AppExcel.Visible = False ' True ' '应用程序Excel可见S1 = Round(Timer - AAA, 2)If Len(Dir(TempXls)) > 0 ThenSet WbMyBook = AppExcel.Workbooks.Open(TempXls)ElseSet WbMyBook = AppExcel.Workbooks.Add '添加工作簿WbMyBook.SaveAs TempXlsEnd IfSet WsMySheet = AppExcel.Worksheets("sheet1") '指定工作表'将Arr转向只用了.9SReDim A(0 To UBound(Arr, 2), 1 To UBound(Arr))A(0, 1) = "工程号": A(0, 2) = "开始时间": A(0, 3) = "实际时间": A(0, 4) = "时间差"A(0, 5) = "温度": A(0, 6) = "压力": A(0, 7) = "湿度": A(0, 8) = "仪表号"For i = 1 To UBound(A)For j = 1 To UBound(A, 2): A(i, j) = Arr(j, i): NextNextS2 = Round(Timer - AAA - S1, 2)WsMySheet.Cells.ClearWsMySheet.Cells(1, 1).Resize(UBound(A) + 1, UBound(A, 2)) = A '向EXCEL里写数据?S3 = Round(Timer - AAA - S1 - S2, 2)WbMyBook.SaveS4 = Round(Timer - AAA - S1 - S2 - S3, 2)WbMyBook.CloseSet WbMyBook = NothingSet WsMySheet = NothingSet AppExcel = NothingS5 = Round(Timer - AAA - S1 - S2 - S3 - S4, 2)Debug.Print "处理XL总时间: " & Format(Timer - AAA, "0.00") '62000行用时,7S Debug.Print "建工作表对象时间: " & S1Debug.Print "打开工作表时间: " & S2Debug.Print "工作表赋值时间: " & S3Debug.Print "保存时间工作表: " & S4Debug.Print "关闭清空工作表对象时间:" & S5AAA = TimerSQL = "INSERT INTO 曲线(工程号,开始时间,实际时间,时间差,温度,仪表号) " & _ " SELECT CSTR(F1) AS 工程号, CDA TE(F2) AS 开始时间,CDATE(F3) AS 实际时间,CLNG(F4) AS 时间差,V AL(F5) AS 温度,CSTR(F8) AS 仪表号" & _" FROM [Excel 8.0;HDR=NO;Database=" & TempXls & "].[sheet1$A2:H" &UBound(A) & "]"CNN.CursorLocation = adUseServer '没有这个没有结果CNN.Execute SQLCNN.CursorLocation = adUseClientDebug.Print UBound(A) & "条数据由XL到ACC时间:"; Format(Timer - AAA, "0.00") '62000行用时,7Send sub发现速度特慢,就一个个的查原因,下面是其中一个地方因为是在VB环境下做的,不能用insert into select的方法数据库里的曲线表有约460W条数据,8个字段,两个没有,ID上是自动递增,工程号,开始时间及仪表号建立了索引是ACCESS数据库看到别人10000条/S还嫌慢.可想这样东东应该有改进的余地的!谢原程序及测试的数据如下:Sub ChangeToMe(Arr) '将数组的数字转到我的数据库中On Error Resume NextDim SQL$, i&Dim A!A = Val(InputBox("请输入控制室热电偶与记录仪表的温度差" & Chr(10) & Chr(10) & _"上次的检测值如下" & Chr(10) & Chr(10) & _"若不清楚是时直接按确定", "提示", "-4"))'这里是速度慢的原因吗?'62683条用时271S 231/SDim AAA!, ssss!'' AAA = Timer'' '每次插入是否是慢的原因'' SQL = "select * from 曲线WHERE 工程号='" & Arr(1, 1) & "'"'' Set Rs = Nothing'' Rs.CursorLocation = adUseClient'' Rs.Open SQL, CNN, 1, 2, 1'' With Rs'' For i = 1 To UBound(Arr, 2)'' .AddNew '数据类形有关吗?'' Rs("工程号") = CStr(Arr(1, 1))'' Rs("开始时间") = CDate(Arr(2, 1))'' Rs("实际时间") = CDate(Arr(3, i))'' Rs("时间差") = CLng(Arr(4, i))'' Rs("温度") = Val(Arr(5, i)) + A'' If Len(Arr(6, i)) > 0 Then Rs("压力") = Val(Arr(6, i))'' If Len(Arr(7, i)) > 0 Then Rs("湿度") = Val(Arr(7, i))'' Rs("仪表号") = CStr(Arr(8, i))'' .Update'' Next'' End With'' ssss = Timer - AAA''AAA = Timer'同样的数量用时174S约460/S较上面的方法快For i = 1 To UBound(Arr, 2)SQL = " insert into 曲线(工程号,开始时间,实际时间,时间差," & _IIf(Len(Arr(5, i)) > 0, "温度,", "") & _IIf(Len(Arr(6, i)) > 0, "压力,", "") & _IIf(Len(Arr(7, i)) > 0, "湿度,", "") & _" 仪表号)" & _" values ('" & Arr(1, i) & "' ," & _"#" & Arr(2, i) & "# ," & _"#" & Arr(3, i) & "# ," & _" " & Arr(4, i) & " ," & _IIf(Len(Arr(5, i)) > 0, V al(Arr(5, i)) + A & " ,", "") & _IIf(Len(Arr(6, i)) > 0, Arr(6, i) & " ,", "") & _IIf(Len(Arr(7, i)) > 0, Arr(7, i) & " ,", "") & _"'" & Arr(8, i) & "' " & _")"CNN.Execute SQLNext'MsgBox UBound(Arr, 2) & " AddNew:" & Format(ssss, "0.00") & " INSERT:" & Format(Timer - AAA, "0.00")End Sub优化本文描述了如何通过一些技术手段来提高编程代码的执行效率。

vb将数据导入access

vb将数据导入access

Private Function ImportFromExcel(excelFile As String) As LongDim xlApp As Excel.ApplicationDim xlBook As Excel.WorkbookDim xlSheet As Excel.WorksheetDim rst As New ADODB.RecordsetDim nCount As Long, strCardNo As StringOn Error GoTo errHSet xlApp = New Excel.ApplicationSet xlBook = xlApp.Workbooks.Open(excelFile) '打开EXCEL文件Set xlSheet = xlBook.Sheets(1) '打开第一页(sheet)ImportFromExcel = 0'打开数据库rst.Open "...", pConn, adOpenKeyset, adLockOptimistic, adCmdText'开始导入。

导入过程检查数据是否有重复。

nCount = 1DostrCardNo = Trim(xlSheet.Cells(nCount, 1))'这里根据第一列数据为空判断记录结束If Len(strCardNo) = 0 ThenImportFromExcel = nCount - 1Exit DoEnd IfIf Not rst.EOF Then rst.Find ("STCardNO='" & strCardNo & "'")If rst.EOF Thenrst.AddNewrst("STCardNO") = Format(strCardNo, "0000000000")...rst.UpdateElseIf MsgBox("卡号:" & strCardNo & " 已经存在。

vb连接Access数据库实例

vb连接Access数据库实例

vb连接Access数据库实例下面我们给出一个连接到Access数据库的实例,此例中用到的数据库为Access 2003。

首先在e盘建立一个名为vb的文件夹,然后打开Access 2003,单击“文件”→“新建”,在右侧出现的任务窗格中单击“空数据库”,在出现的对话框中,我们在"文件名"项后输入给新数据库起的名称并选择保存位置,这里我们为新数据库命名为Access_db并保存到我们刚才建立的文件夹中,如下图,单击"创建"按钮后,系统就生成了一个新的Access空数据库。

在空数据库中,还没有任何用户所创建的表,接下来我们就要使用设计器(如下图)为Access_db数据库建立表。

首先我们为Access_db创建一个名为“wzdz”的表,该表由以下4个字段组成:(1)编号:此为Access自动添加的主键字段,我们直接拿来使用。

我们可直接设置后三个字段,在输入完了wzdz表的各个字段之后,此时关闭表设计器,Access 会提示是否要进行保存表,选择“是”,然后为表起名为“wzdz”。

因为没有定义主键(primary Key),Access会提示为表加上一个主键,按提示将编号设置为主键即可。

(2)后三个字段分别为网站名称、网站地址和网站描述,三个字段的属性是相同的,如下:▲数据类型:文本。

▲字段大小:50▲有效性规则:无。

▲必填字段:否▲允许空字符串:否▲索引:无设置完以上字段后,再重新在设计视图中打开wzdz表(方法:在设计器中右击wzdz表名,选“设计视图”命令),应如下图所示:有了数据库和表之后,如果想让VB应用程序访问数据库,还需进行数据源的配置。

只有在配置完成了数据源之后,才能让VB应用程序同数据库进行正确的连接工作,在VB应用程序中才可以通过ADO对象来进行具体数据的操作,如果在建立了数据库之后没有对数据源进行配置或者对数据源的配置工作出现错误,则在此之前所做的一切工作都是白费的。

vb高速存储到access数据库中

vb高速存储到access数据库中

Private Sub Command1_Click()Dim s As StringDim Conn As New ADODB.ConnectionDim Rs As New ADODB.RecordsetConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\mydb.mdb" '请将数据库名及路径换成你的实际数据库名及路径Dim UserName As StringDim Password As Strings = Text1.TextIf s = "1" Or s = "2" ThenUserName = InputBox("请输入用户名")Password = InputBox("请输入用户密码")sql = "Select * From [UserInfo] where User='" & UserName & "'"'UserInfo请换成你的实际数据表名Rs.Open sql, Conn, 1, 3If Rs.EOF ThenMsgBox "没有找到此用户"ElseIf Rs("Password") = Password ThenIf s = "1" ThenMsgBox "123"ElseIf s = "2" ThenMsgBox "456"End IfElseMsgBox "密码错误"End IfEnd IfEnd IfEnd Sub上面的例子实现了查询如果是要添加,删除,更新等操作,只要编写相应的SQL语句,再用Conn.Execute SQL 就可以了,如:添加的:SQL="Insert Into [UserInfo](User,Password) Values('aaaa','1234')" Conn.Execute SQL '执行后,就添加了一条记录删除:SQL="Delete From [UserInfo] Where User='aaaa'"Conn.Execute SQL '删除用户名为aaaa的用户记录更新:SQL="Update [UserInfo] Set Password='abcdefg' Where User='aaaa'" Conn.Execute SQL '执行后,修改用户aaaa的密码为abcdefg以上只是示例,在实际使用过程中,可以将一些内容用控件输入等方式进行,这样就有很大的灵活性了动态创建数据库引用 microsoft DAP 3.6 Object LibraryDim myDB As DAO.DatabaseSet myDB = CreateDatabase(App.Path + "\111.mdb", dbLangGeneral) '如果不存在数据库Set myDB = OpenDatabase(App.Path + "\111.mdb") '如果存在数据库Dim str_SQL As Stringstr_SQL = "Create Table NewTable1(Field1 Text(10),Field2 Short)" myDB.Execute str_SQLstr_SQL = "Create Table NewTable2(Field1 Text(10),Field2 Short)" myDB.Execute str_SQLmyDB.Close向已经建好的数据库中添加记录建立数据库a,表名字b,字段c,文本格式,在窗体上画一command ,画一个文本框,这个代码就是将文本内容写入数据库要先引用microsoft activeX data object 2.5 library代码如下:Private Sub Command1_Click()Dim cnDk As New ADODB.ConnectionDim strDk As StringDim rDk As New ADODB.RecordsetDim sql As StringstrDk = "DBQ=" & App.Path & "\a.mdb;Driver={Microsoft Access Driver (*.mdb)};"cnDk.Open strDksql = "insert into b (c) values ('" & text1.text& "')"cnDk.Execute sqlcnDk.CloseSet cnDk = NothingEnd Sub在数据库中添加多条记录只要可以进行输入文本的都可以改一下这些吧,你单击一次就提示输入一次,输完了自动保存改后Data1.Recordset.AddNewData1.Recordset.Fields("username") = trim(inputbox("请输入名字")) Data1.Recordset("password") =val(trim(inputbox("请输入电话")))Data1.UpdateRecord ——————————————————————————————Data1.Recordset.AddNewData1.Recordset.Fields("username") = "张三|"Data1.Recordset("password") = "fsdfsd"Data1.UpdateRecordData1.Recordset.AddNewData1.Recordset.Fields("username") = "李四|"Data1.Recordset("password") = "fsdf432d"Data1.UpdateRecordData1.Recordset.AddNewData1.Recordset.Fields("username") = "王五|"Data1.Recordset("password") = "f42342d"Data1.UpdateRecordMsgBox "adad"===================================================================== ===================vb+access 数据库的记录的添加与删除Dim cn As New ADODB.ConnectionDim rs As New ADODB.RecordsetPrivate Sub Command2_Click()Set rs = cn.Execute("select * from wenzhang where 内容='" & Text1.Text & "'")If Text1.Text = "" ThenMsgBox ("文章不能为空!")ElseIf rs.EOF = False ThenMsgBox ("文章不能重复!")Elsecn.Execute ("insert into wenzhang values('" & Combo1.Text & "','" & Text3.Text & "','" & Text4.Text & "','" &Text1.Text & "')")MsgBox ("ok")End IfEnd Sub'添加按钮Private Sub Command3_Click()Dim myval As StringSet rs = cn.Execute("select * from wenzhang where 内容='" & Text1.Text & "'")If rs.EOF Thenmyval = MsgBox("是否保存文章?", vbInformation + vbYesNoCancel, "提示")If myval = vbYes Thencn.Execute ("insert into wenzhang values('" & Combo1.Text & "','" & Text3.Text & "','" & Text4.Text & "','" &Text1.Text & "')")MsgBox ("保存成功")ElseCombo1.Text = ""End IfElseText1.Text = ""Combo1.Text = ""End IfEnd Sub'删除按钮Private Sub Command4_Click()If Text1.Text = "" ThenMsgBox ("不能删除空记录!")ElseDim myval As Stringmyval = MsgBox("是否删除文章?", vbInformation + vbYesNo, "提示")If myval = vbYes ThenSet rs = cn.Execute("delete from wenzhang where 内容 ='" & Text1.Text & "'")MsgBox ("删除成功!")End IfEnd IfEnd Sub'连接数据库Private Sub Form_Load()cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=\\temp.mdb;Persist Security Info=False"cn.CursorLocation = adUseClientcn.OpenEnd Sub在VB环境下做了一个东东替代前面讲的程序,并得到了很大的提速,觉得还有上升的空间希望大家来讨论1\VB创建及打开XLS文件似应可以更快2\只有6W多条记录由数组到工作表会用10多S?3\关闭及销毁的时间也用到了几S!4\感觉上EXCEL转到ACC上的速度再也无法上升了吧?这是结果:处理XL总时间: 21.12建工作表对象时间: 3.5打开工作表时间: 5.47工作表赋值时间: 9.64保存时间工作表: 2.25关闭清空工作表对象时间:.2659730条数据由XL到ACC时间:10.34下面是程序:Sub TestXlToAcc(Arr)Dim SQL$Dim A, i&, j&Dim AppExcel As New Excel.Application '使用前期绑定,快了点!Object '定义Excel应用程序对象Dim WbMyBook As New Excel.Workbook 'Object ' 定义工作簿对象Dim WsMySheet As Object '定义工作表对象Dim AAA!, S1!, S2!, S31, S4!, S5!AAA = TimerDim TempXls$TempXls = App.Path & "\TEMP.xls"'可以先关后存,最好是不用保存就可以转入AppExcel.Visible = False ' True ' '应用程序Excel可见S1 = Round(Timer - AAA, 2)If Len(Dir(TempXls)) > 0 ThenSet WbMyBook = AppExcel.Workbooks.Open(TempXls)ElseSet WbMyBook = AppExcel.Workbooks.Add '添加工作簿WbMyBook.SaveAs TempXlsEnd IfSet WsMySheet = AppExcel.Worksheets("sheet1") '指定工作表'将Arr转向只用了.9SReDim A(0 To UBound(Arr, 2), 1 To UBound(Arr))A(0, 1) = "工程号": A(0, 2) = "开始时间": A(0, 3) = "实际时间": A(0, 4) = "时间差"A(0, 5) = "温度": A(0, 6) = "压力": A(0, 7) = "湿度": A(0, 8) = "仪表号"For i = 1 To UBound(A)For j = 1 To UBound(A, 2): A(i, j) = Arr(j, i): NextNextS2 = Round(Timer - AAA - S1, 2)WsMySheet.Cells.ClearWsMySheet.Cells(1, 1).Resize(UBound(A) + 1, UBound(A, 2)) = A '向EXCEL里写数据?S3 = Round(Timer - AAA - S1 - S2, 2)WbMyBook.SaveS4 = Round(Timer - AAA - S1 - S2 - S3, 2)WbMyBook.CloseSet WbMyBook = NothingSet WsMySheet = NothingSet AppExcel = NothingS5 = Round(Timer - AAA - S1 - S2 - S3 - S4, 2)Debug.Print "处理XL总时间: " & Format(Timer - AAA, "0.00") '62000行用时,7S Debug.Print "建工作表对象时间: " & S1Debug.Print "打开工作表时间: " & S2Debug.Print "工作表赋值时间: " & S3Debug.Print "保存时间工作表: " & S4Debug.Print "关闭清空工作表对象时间:" & S5AAA = TimerSQL = "INSERT INTO 曲线(工程号,开始时间,实际时间,时间差,温度,仪表号) " & _ " SELECT CSTR(F1) AS 工程号, CDA TE(F2) AS 开始时间,CDATE(F3) AS 实际时间,CLNG(F4) AS 时间差,V AL(F5) AS 温度,CSTR(F8) AS 仪表号" & _" FROM [Excel 8.0;HDR=NO;Database=" & TempXls & "].[sheet1$A2:H" &UBound(A) & "]"CNN.CursorLocation = adUseServer '没有这个没有结果CNN.Execute SQLCNN.CursorLocation = adUseClientDebug.Print UBound(A) & "条数据由XL到ACC时间:"; Format(Timer - AAA, "0.00") '62000行用时,7Send sub发现速度特慢,就一个个的查原因,下面是其中一个地方因为是在VB环境下做的,不能用insert into select的方法数据库里的曲线表有约460W条数据,8个字段,两个没有,ID上是自动递增,工程号,开始时间及仪表号建立了索引是ACCESS数据库看到别人10000条/S还嫌慢.可想这样东东应该有改进的余地的!谢原程序及测试的数据如下:Sub ChangeToMe(Arr) '将数组的数字转到我的数据库中On Error Resume NextDim SQL$, i&Dim A!A = Val(InputBox("请输入控制室热电偶与记录仪表的温度差" & Chr(10) & Chr(10) & _"上次的检测值如下" & Chr(10) & Chr(10) & _"若不清楚是时直接按确定", "提示", "-4"))'这里是速度慢的原因吗?'62683条用时271S 231/SDim AAA!, ssss!'' AAA = Timer'' '每次插入是否是慢的原因'' SQL = "select * from 曲线WHERE 工程号='" & Arr(1, 1) & "'"'' Set Rs = Nothing'' Rs.CursorLocation = adUseClient'' Rs.Open SQL, CNN, 1, 2, 1'' With Rs'' For i = 1 To UBound(Arr, 2)'' .AddNew '数据类形有关吗?'' Rs("工程号") = CStr(Arr(1, 1))'' Rs("开始时间") = CDate(Arr(2, 1))'' Rs("实际时间") = CDate(Arr(3, i))'' Rs("时间差") = CLng(Arr(4, i))'' Rs("温度") = Val(Arr(5, i)) + A'' If Len(Arr(6, i)) > 0 Then Rs("压力") = Val(Arr(6, i))'' If Len(Arr(7, i)) > 0 Then Rs("湿度") = Val(Arr(7, i))'' Rs("仪表号") = CStr(Arr(8, i))'' .Update'' Next'' End With'' ssss = Timer - AAA''AAA = Timer'同样的数量用时174S约460/S较上面的方法快For i = 1 To UBound(Arr, 2)SQL = " insert into 曲线(工程号,开始时间,实际时间,时间差," & _IIf(Len(Arr(5, i)) > 0, "温度,", "") & _IIf(Len(Arr(6, i)) > 0, "压力,", "") & _IIf(Len(Arr(7, i)) > 0, "湿度,", "") & _" 仪表号)" & _" values ('" & Arr(1, i) & "' ," & _"#" & Arr(2, i) & "# ," & _"#" & Arr(3, i) & "# ," & _" " & Arr(4, i) & " ," & _IIf(Len(Arr(5, i)) > 0, V al(Arr(5, i)) + A & " ,", "") & _IIf(Len(Arr(6, i)) > 0, Arr(6, i) & " ,", "") & _IIf(Len(Arr(7, i)) > 0, Arr(7, i) & " ,", "") & _"'" & Arr(8, i) & "' " & _")"CNN.Execute SQLNext'MsgBox UBound(Arr, 2) & " AddNew:" & Format(ssss, "0.00") & " INSERT:" & Format(Timer - AAA, "0.00")End Sub优化本文描述了如何通过一些技术手段来提高编程代码的执行效率。

vb操作access数据库的方法

vb操作access数据库的方法

VB操作Access数据库方法使用ADODB首先,声明一个链接变量,并根据需要声明记录集变量。

建立与数据库的链接,如果数据库没有口令,最后一行可以不写(写上也不会错)。

这种方法虽然代码长一些,但对数据环境要求低,且结构清晰,所编写的发布程序也大为减小。

由于与链接SQL Server等数据库的方法一样,因而大量的操作数据库的代码相同,当数据库需要由Access扩充到一些大型数据库,或由一些大型数据库裁剪出一个简单数据库时,程序的移植会比较方便。

另外,这种方法对于Access97及Access2000均能很好地支持,兼容性好。

对于大量插入、删除、修改等操作,只在Connection层进行即可,既可提高速度又可减少代码。

如果还要获取具体的记录集内容,则须再根据条件打开具体的库表,代码如下:ADO常用方法下面是我所掌握的使用ADO对数据库操作的一些常用方法,主要是提供给初学者作为参考,有不对的地方请指正。

如有补充不胜荣幸准备工作========Dim conn As New ADODB.Connection '创建一个 Connection 实例,在这里使用New等于将Dim和Set合并为一段代码执行Dim rs As ADODB.Recordset '创建一个 Recordset 实例,不使用New 是因为,经常需要重复使用Set,因此没必要在这里使用Dim CnStr As String, Sql As String '创建两个字符串变量分别存放两个集合的SQL语句代码段1、装载数据库(不属于Recordset集合)=============Dim FileNamw$, DbIp$, DbName$, DbUser$, DbPw$'以上5个字符串变量分别表示文件路径和文件名、数据库地址、数据库名、数据操作员用户名、操作员密码FileName = App.Path & "\'数据库名'"DbIp = "数据库地址"DbName = "数据库名"DbUser = "数据操作员用户名"DbPw = "操作员密码"'以上变量根据数据库类型的不同而不同,有可能只需要1至两个变量'1)连接Access数据库:'-------------------CnStr = "PROVIDER=microsoft.jet.oledb.3.51;persist security info =fal se;data source=" & FileName & ";Jet OLEDB:Database Password=" & DbPw'2)连接Oracle数据库:'-------------------CnStr = "PROVIDER=MSDAORA.1;Password=" & DbPw & ";User ID=" & DbUser & ";Data Source=" & FileName & ";Persist Security Info=True"'其中:'PASSWORD: 密码'User ID: 用户号'Data Source: 数据库名'Persist Security Info:'Provider:'3)连接VF的DBF库:'----------------CnStr = "PROVIDER=MSDASQL.1;Persist Security Info=False;Driver={Microsoft Visual FoxPro Driver};UID=" & DbUser & ";SourceDB=" & FileName & ";SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;"'4)连接SQL的数据库'------------------CnStr = "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;uid=" & DbUser & ";pwd=" & DbPw & ";DRIVER=SQL Server;DATABASE=" & DbName & ";WSID=GQS OFT;SERVER=" &DbIP'也可以使用这段简易代码 CnStr = "Provider=SQLOLEDB;Data Source=" & Db Ip & ";DATABASE=" & DbName & ";UID=" & DbUser & ";pwd=" & DbPwConn.Open cnstr '使用 Connection 集合的 Open 方法与数据库建立连接2、Recordset集合的常用方法=========================='1)打开一个表'------------Sql = "select * from 表名" 'SQL查询语句Set rs = New ADODB.Recordset '新建一个实例rs.Open Sql, conn '使用 Open 方法打开数据库中的一个表'注意,这种打开方式只能使用 rs.MoveNext (即,向后移动行坐标)而不能像其他方向,并且不能修改数据内容''rs.Open Sql, conn,1 '虽然只加了个“1”,但这种方法可以向任何方向移动行坐标。

vb操作access数据库的方法

vb操作access数据库的方法

VB操作Access数据库方法使用ADODB首先,声明一个链接变量,并根据需要声明记录集变量。

建立与数据库的链接,如果数据库没有口令,最后一行可以不写(写上也不会错)。

这种方法虽然代码长一些,但对数据环境要求低,且结构清晰,所编写的发布程序也大为减小。

由于与链接SQL Server等数据库的方法一样,因而大量的操作数据库的代码相同,当数据库需要由Access扩充到一些大型数据库,或由一些大型数据库裁剪出一个简单数据库时,程序的移植会比较方便。

另外,这种方法对于Access97及Access2000均能很好地支持,兼容性好。

对于大量插入、删除、修改等操作,只在Connection层进行即可,既可提高速度又可减少代码。

如果还要获取具体的记录集内容,则须再根据条件打开具体的库表,代码如下:ADO常用方法下面是我所掌握的使用ADO对数据库操作的一些常用方法,主要是提供给初学者作为参考,有不对的地方请指正。

如有补充不胜荣幸准备工作========Dim conn As New ADODB.Connection '创建一个 Connection 实例,在这里使用New等于将Dim和Set合并为一段代码执行Dim rs As ADODB.Recordset '创建一个 Recordset 实例,不使用New 是因为,经常需要重复使用Set,因此没必要在这里使用Dim CnStr As String, Sql As String '创建两个字符串变量分别存放两个集合的SQL语句代码段1、装载数据库(不属于Recordset集合)=============Dim FileNamw$, DbIp$, DbName$, DbUser$, DbPw$'以上5个字符串变量分别表示文件路径和文件名、数据库地址、数据库名、数据操作员用户名、操作员密码FileName = App.Path & "\'数据库名'"DbIp = "数据库地址"DbName = "数据库名"DbUser = "数据操作员用户名"DbPw = "操作员密码"'以上变量根据数据库类型的不同而不同,有可能只需要1至两个变量'1)连接Access数据库:'-------------------CnStr = "PROVIDER=microsoft.jet.oledb.3.51;persist security info =fal se;data source=" & FileName & ";Jet OLEDB:Database Password=" & DbPw'2)连接Oracle数据库:'-------------------CnStr = "PROVIDER=MSDAORA.1;Password=" & DbPw & ";User ID=" & DbUser & ";Data Source=" & FileName & ";Persist Security Info=True"'其中:'PASSWORD: 密码'User ID: 用户号'Data Source: 数据库名'Persist Security Info:'Provider:'3)连接VF的DBF库:'----------------CnStr = "PROVIDER=MSDASQL.1;Persist Security Info=False;Driver={Microsoft Visual FoxPro Driver};UID=" & DbUser & ";SourceDB=" & FileName & ";SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;"'4)连接SQL的数据库'------------------CnStr = "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;uid=" & DbUser & ";pwd=" & DbPw & ";DRIVER=SQL Server;DATABASE=" & DbName & ";WSID=GQS OFT;SERVER=" &DbIP'也可以使用这段简易代码 CnStr = "Provider=SQLOLEDB;Data Source=" & Db Ip & ";DATABASE=" & DbName & ";UID=" & DbUser & ";pwd=" & DbPwConn.Open cnstr '使用 Connection 集合的 Open 方法与数据库建立连接2、Recordset集合的常用方法=========================='1)打开一个表'------------Sql = "select * from 表名" 'SQL查询语句Set rs = New ADODB.Recordset '新建一个实例rs.Open Sql, conn '使用 Open 方法打开数据库中的一个表'注意,这种打开方式只能使用 rs.MoveNext (即,向后移动行坐标)而不能像其他方向,并且不能修改数据内容''rs.Open Sql, conn,1 '虽然只加了个“1”,但这种方法可以向任何方向移动行坐标。

关于VB 与Access 中图片的存取问题

关于VB 与Access 中图片的存取问题

关于VB 与Access 中图片的存取问题作者:钱晓燕来源:《中国信息技术教育》2014年第22期摘要:在数据库应用系统中,经常需要对图片进行处理,包括图片在数据库中的直接存储和只将图片地址存储于数据库中两种存储方式。

本文主要论述了图片的存储方式、读取方式,它们各自的优缺点以及怎样存取才能达到效率最高。

关键词:移植性数据负担 OlE 对象图片地址中图分类号:G718 ; ; ; 文献标识码:A 文章编号:1674-2117(2014)22-00-01在教学中,我们常常会用VB及Access做些小的数据库应用系统,如学籍管理系统、考试系统、图书管理系统等,在这些数据库应用系统中,经常需要对图片进行处理。

图片在数据库中应该如何存取、怎样存取才能达到效率最高,是我们最常碰到又急需解决的问题。

1 图片在数据库中的存储以考试管理系统为例来说,在考试报名界面上必须有考试照片,而这照片必须存入后台数据库中。

图书管理系统新书入库时需将新书封面图片存入数据库等。

一般来说,图片在数据库中的存储有两种方式:直接将图片存储在数据库中和在数据库中存储图片地址。

1.1 直接将图片存储在数据库这种存储方式采用的是数据流技术。

数据库设计时,存储图片的字段数据类型定义为“OLE对象”。

要插入图片直接双击该字段即可。

若要在程序中写入数据库,实现代码如下:SUB ;SFILE()DIM ;STR ;As ADODB.STREAMDIM ;REAS ADODB.RECORDSETDIM ;STR ;AS STRINGSET ;STM = NEW ADODB.STREAMSTM.TYPE= ADTYPEBINARYSTM.OPENSTM.LOADFROMFILE APP.PATH+”\ABC.JPG”SET ;RE= NEW ADODB.RECORDESETRE.OPEN”SELECT * ;FROM ;IMG” ,STM,1,3RE.ADDNEWRE.FIELDS(“PHOTO”)=STM.READRE.UPDATERE.CLOSESTM.CLOSEEND SUB从代码看图片操作与其他字段写入数据库基本一样,只不过使用的是流对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用Vb保存一幅图到Access数据库.txt31岩石下的小草教我们坚强,峭壁上的野百合教我们执著,山顶上的松树教我们拼搏风雨,严寒中的腊梅教我们笑迎冰雪。

在我们做的许多管理系统中,除了保存大量的文字信息以外,有时候也需要保存一定数量的图片。

例如:一个人事管理系统,就需要对每个人的照片进行保存,以便可以方便的对每个人的信息进行处理。

Office中的Access数据库除了保存文本,还可以保存图片,保存图片的数据类型就是"OLE对象":它用来保存 Excel 电子表格、 Word 文档、图形、声音或其他二进制数据。

我现在用一个例子介绍利用vb保存图片的方法,首先我们要介绍vb中处理二进制数据的语句:Put、Get。

Put、Get语句语法如下:Put [#] filenumber,[recnumber],varnameGet [#] filenumber,[recnumber],varnameFilenumber :必需的。

任何有效的文件号Recnumber :可选的。

Variant(Long)。

记录号(Random方式的文件)或字节数(Binary 方式的文件),指明在此处开始写入Varname :必需的。

包含要写入磁盘的数据的变量名说明:文件中的第一个记录或字节位于位置1,第二个记录或字节位于位置2,依次类推。

若省略recnumber,则将上一个Get或Put语句之后的下一个记录或字节写入。

所有用于分界的逗号都必须罗列出来。

现在我们来开始建一个工程,功能是保存一个文档,同时可以保存一幅图片。

首先我们建一个表(表名为photo),字段如下:字段名类型标题class 类别文档的分类photo OLE对象保存图片文件photo_ext 文本图片的扩展名inputtime 日期/时间文档输入的时间modifytime 日期/时间文档的修改时间subject 文本文本现在我们就可以创建finput窗口文件来保存图片。

首先我们要连接我们的数据库,代码如下:Dim cnstr As Stringcnstr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;" _amp; "Data Source=" amp; App.Path amp; "\realize.mdb;Jet OLEDB:database "cn.Open cnstrcn.CursorLocation = adUseClient这段代码可以放在form_load事件中,当做一个多窗口的系统时,最好放到一个模块文件中,这样在其它窗口中都可以调用这个cn连接。

下面是具体的窗口代码:VERSION 5.00Object= "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"Object= "{3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0"; "richtx32.ocx"Begin VB.Form finputBorderStyle = 0 'NoneCaption = "文档输入"ClientHeight = 6240ClientLeft = 0ClientTop = 0ClientWidth = 8955ControlBox = 0 'FalseLinkTopic = "Form1"MDIChild = -1 'TrueScaleHeight = 6240ScaleWidth = 8955ShowInTaskbar = 0 'FalseBegin monDialog CommonDialog1 Left = 8040Top = 3840_ExtentX = 847_ExtentY = 847_Version = 393216EndBegin boBox Combo1Height = 300Left = 7080TabIndex = 10Width = 1335EndBegin mandButton Command3 Caption = "关闭"Height = 375Left = 5280TabIndex = 8Top = 5640Width = 1095EndBegin mandButton Command2 Caption = "保存"Height = 375Left = 2520TabIndex = 7Top = 5640Width = 1095EndBegin mandButton Command1 Caption = "浏览"Height = 255TabIndex = 6Top = 4800Width = 735EndBegin VB.TextBox Text2Height = 375Left = 1200TabIndex = 5Top = 4800Width = 6375EndBegin RichTextLib.RichTextBox RichTextBox1 Height = 3615Left = 1200TabIndex = 3Top = 960Width = 6375_ExtentX = 11245_ExtentY = 6376_Version = 393217Enabled = -1 'TrueTextRTF = $"finput.frx":0000 EndBegin VB.TextBox Text1 Height = 375Left = 1200TabIndex = 2Top = 443Width = 4695EndBegin bel Label4 Caption = "类别"Height = 255Left = 6240TabIndex = 9Top = 480Width = 615EndBegin bel Label3 Caption = "图片"Height = 255Left = 480TabIndex = 4Top = 4800Width = 495EndBegin bel Label2Caption = "内容"Height = 255Left = 480TabIndex = 1Top = 960Width = 495EndBegin bel Label1Caption = "标题"Height = 255Left = 480TabIndex = 0Top = 503Width = 495EndEndAttribute VB_Name = "finput" Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = FalseAttribute VB_PredeclaredId = TrueAttribute VB_Exposed = FalseOption ExplicitPrivate Sub Command1_Click()CommonDialog1.DefaultExt = App.PathCommonDialog1.Filter = "Pictures (*.bmp;*.jpg;*.gif) *.bmp;*.jpg;*.gif" '注意要加引号CommonDialog1.ShowOpenText2.Text = CommonDialog1.FileNameEnd Sub'保存文档的标题,和文档的内容,以及相应的图片Private Sub Command2_Click()'判断是否所写的文档是否已经存在数据库了,如果没有,则保存,否则'不能保存(利用一个"临时rs"查询标题)Dim subject, sql As StringDim temp_photo As StreamDim rs As New ADODB.RecordsetDim rs1 As New ADODB.Recordset '定义rs1得到类别的idDim class_id As Integer '定义得到类别的ID号subject = Trim(Text1.Text) '获得标题sql = "select * from paper where subject='" + subject + "'"'开始查询rs.Open sql, cn, adOpenDynamic, adLockPessimistic'判断标题是否存在If rs.EOF Then '文档不存在,开始保存Dim tempdate As Date '临时时间变量tempdate = Daters.AddNew'得到类别的IDsql = "select cl_number,class from class where class='" + Combo1.Text + "'" rs1.Open sql, cn, adOpenDynamic, adLockPessimisticrs("class") = rs1("cl_number")rs1.Close '关闭rs1rs("subject") = subjectrs("content") = RichTextBox1.TextIf Trim(Text2.Text) <> "" Then '假如有图片,开始得到图片文件Dim image_data() As Byte '定义图片保存的变量Open Trim(Text2.Text) For Binary As #1ReDim image_data(LOF(1) - 1)Get #1, , image_data()rs("photo").AppendChunk image_data()End Ifrs("inputtime") = tempdaters("modifytime") = tempdaters.Update '可能出现保存不成功的现象,所以要考虑可能会出现错误MsgBox ("保存成功!") '保存成功Text1.Text = ""RichTextBox1.Text = ""Text2.Text = "" '此处清空选择图片的框Else '存在,不能保存,显示错误信息MsgBox ("文档已经存在,不能保存,请修改!")End Ifrs.Close '关闭结果集End SubPrivate Sub Command3_Click()Unload MeEnd SubPrivate Sub Form_Load()Me.Left = 0Me.Top = 0fmain.Width = Me.Width + 340fmain.Height = Me.Height + 1550'显示文档的类别Dim rs As New ADODB.RecordsetDim sql As Stringsql = "select * from class"rs.Open sql, cn, 1, 1Do While Not rs.EOF '类别不空,则添加进去,对应类别的number为索引Combo1.AddItem rs("class")rs.MoveNextLoopIf rs.RecordCount <> 0 Then '只有查询结果集不为空时,才能设定显示第一项,利用纪录总数不为0判定Combo1.ListIndex = 0 '不能用not rs.eof判定,因为现在cursor已经到了最后End Ifrs.CloseEnd Sub当然,在上面这段代码中,还用到了另一个表(表名为class),字段如下:字段名类型意义class 文本文档类别的名称cl_number 数字类别的编号上面的代码可以较好的保存我们的文档和图片,我们还需要显示我们的图片和文档,现在我们还要显示我们的图片,我做了一个显示窗口(fshow),现在我假设数据库中有一条记录,subject为"ipx协议简介",里面有一个图片(ipx体系结构),窗口代码如下:VERSION 5.00Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomctl.ocx"Object = "{3B7C8863-D78F-101B-B9B5-04021C009402}#1.2#0"; "richtx32.ocx"Begin VB.Form fshowBorderStyle = 0 'NoneCaption = "显示图片"ClientHeight = 7125ClientLeft = 0ClientTop = 0ClientWidth = 10275LinkTopic = "Form1"MDIChild = -1 'TrueScaleHeight = 7125ScaleWidth = 10275ShowInTaskbar = 0 'FalseBegin VB.Frame Frame2Height = 6615Left = 2880TabIndex = 1Top = 240Width = 7335Begin mandButton Command1Caption = "关闭"Height = 375Left = 5880TabIndex = 5Top = 5880Width = 1215EndBegin RichTextLib.RichTextBox RichTextBox1 Height = 4095Left = 120TabIndex = 4Top = 1200Width = 6975_ExtentX = 12303_ExtentY = 7223_Version = 393217TextRTF = $"fshow.frx":0000 EndBegin VB.Image Image1 Height = 855Left = 120Stretch = -1 'TrueTop = 5640Width = 1095EndBegin VB.Line Line4X1 = 5520X2 = 5520Y1 = 5520Y2 = 6600EndBegin VB.Line Line3X1 = 0X2 = 7320Y1 = 5520Y2 = 5520EndBegin VB.Line Line2X1 = 0X2 = 7320Y1 = 960Y2 = 960EndBegin bel Label1 BackColor = amp;H80000009amp; Height = 615Left = 120TabIndex = 3Top = 240Width = 7095EndEndBegin VB.Frame Frame1Height = 6735TabIndex = 0Top = 240Width = 2535Begin MSComctlLib.TreeView TreeView1 Height = 6375Left = 120TabIndex = 2Top = 240Width = 2295_ExtentX = 4048_ExtentY = 11245_Version = 393217PathSeparator = ""Style = 7Appearance = 1EndEndBegin VB.Line Line1BorderColor = amp;H80000001amp;X1 = 2760X2 = 2760Y2 = 6960EndEndAttribute VB_Name = "fshow"Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = FalseAttribute VB_PredeclaredId = TrueAttribute VB_Exposed = FalseOption ExplicitPrivate Sub Command1_Click()Unload MeEnd SubPrivate Sub Form_Load()Dim temptop, templeft As LongMe.Left = 0Me.Top = 0fmain.Width = Me.Width + 340fmain.Height = Me.Height + 1550fmain.Top = (Screen.Height - fmain.Height) / 2fmain.Left = (Screen.Width - fmain.Width) / 2'显示结果Dim rs As New ADODB.RecordsetDim image_filename As StringDim temp_image() As ByteDim sql As Stringsql = "select * from paper where subject=' ipx协议简介'"rs.Open sql, cn, adOpenDynamic, adLockReadOnlyLabel1.Caption = rs("inputtime")temp_image() = rs("photo")image_filename = App.Path + "\temp." + rs("photo_ext")rs.Close'建立临时文件Open image_filename For Binary As #1Put #1, , temp_image()Close #1Image1.Picture = LoadPicture(image_filename)'删除临时文件Kill image_filenameEnd Sub上面代码只能显示一条记录,而且需要先赋条件,显示图片用的是先建一个临时文件,然后把二进制数据读到这个文件里,同时要赋给正确的扩展名,然后可以显示图片,注意,要及时删除临时文件。

相关文档
最新文档