关于asp+access中同时多用户同时提交..写入数据库的问题
发布时间:2025-05-21 20:23:00 发布人:远客网络
一、关于asp+access中同时多用户同时提交..写入数据库的问题
1、进行写数据库前先地数据库进行写锁定操作,写完后再解锁。数据库一旦写锁定成功后就只允许一个用户进行写操作的,你不用担心有多个用户同时提交请求。
2、你在打开数据连接时是有参数可以选择是使用何种锁的,默认是不进行任何锁定的,你只要启用写锁,数据库系统会自动帮你完成上面的等待任务的,就是说当一个用户需要写数据库时(假设它得到了当前服务器资源),数据库系统会自动挂起其它写锁定请求,直到这个用户写完数据库,解除了写锁定(释放操作会解除),第二个请求写锁定的用户才获得服务器资源。
二、怎样才能在VB6.0 中连接Access 2003数据库
大家知道,VB6.0最引人注目的特点,也是其最令程序员关心的地方,就是它访问多种数据库的强大功能。VB中将非MS Access数据库称为外来数据库(External Database),如dBASE、FoxPro、ODBC等。VB6.0中使用数据控制访问外来数据库同访问Access数据库类似,这里不再赘述。访问外来数据库(以dBASE为例)大致可分为以下几步:
一:建立一个Access型数据库,并在数据库中创建新表—即为附加表。通过设置
附加表的各属性值,使其与你所要访问的数据库建立链接关系。程序代码如下:
SetDb=OpenDatabase("MYDB.MDB")
Td.Connect="dBASE:DATABASE=c:\DATADIR"
二:设置INI文件路径。在VB的程序中使用了访问外来数据库操作,将应用程序生成EXE文件后,必须提供一个INI文件。若找不到这个INI文件,将会导致不能访问数据库,并出现“NOTFOUNDIN STOLLABKISAMS’的错误信息。设置INI文件路径后,VB的程序会在WINDOWS子目录中寻找与应用程序同名的INI文件。设置INI文件路径代码为:
SetDataAccessOption1,“Path\Filename”
三:编辑.INI文件可对不同种类的数据库进行设置,下面为一INI文件代码:
SystemDB=c:\MyPATH\SYSTEM.MDA
Paradox3.x=C:\VB\pdx110.DLL
FoxPro2.0=C:\VB\xbs110.DLL
FoxPro2.5=C:\VB\pdx110.DLL
dBASE=C:\VB\pdx110.DLL
dBASE=C:\VB\pdx110.DLL
Btrieve=C:\VB\btrv110.DLL
ParadoxNetPath=P:\PDXDB\
这样通过访问新数据库MYDB.MDB和表“DBASEAU THORTABK”即可访问你所要访问的外来数据库了。
使用这种方法访问外来数据库应该注意的是,附加表在所加到的数据库中只是建立了一个链接关系,表的实际所在,仍然存在于原数据库中,该表在所附加到的数据库中被删除时,只是删掉了链接关系,实际的表并没有被删除。
大家知道,在VB6.0中进行数据库记录的实际查询操作,必需根据打开数据库的方式来确定。以VB3.0为例,数据集对象有Table、Dynaset、Snapshot三种,下面几种查询方法分别适用于以上面不同的对象方式打开的数据库。
1.用SQL查询。SQL是一种结构化数据查询语言,SQL也只能适用Dynaset和Snapshot数据集对象,这种方法是根据SQL条件生成一个数据集对象。例如:
s=”select* from demo where姓名 like’刘*’”
〖注〗:本文中的db为数据库对象,打开方式为:
例如:set db=OpenDatabase(”C:\VB\SAMPLE.MDB”)。
2.用FILTER属性查询。Filter属性是Dynaset和Snapshot对象才具备的,所以也只能适用于这两者,不能用于Table。Filter是用来过滤数据的,只要我们给定过滤条件就可以将所需的记录筛选出来。需要说明的是,我们需要将以Filter属性筛选出来的数据集打开才能对其操作。例如:
set dy1=db.createDynaset(”demo”)
dy1.filter=”姓名 like’刘*’”
set dy2=dy1.createDynaset()
3.用FIND方法查询。FIND适用于Dynaset和Snapshot对象,有Findfirst和Findnext两个方法,每次查询到一个记录。例如:
set dy=db.createDynaset(”demo”:)
s=”工资>160 and姓名 like’刘*’”
4.用SEEK方法查询。这种方法只使用于以Opentable方式打开的Table类型的数据表,而且在查询之前必须要以查询字段建立索引文件,由于已建立了索引文件,所以查询速度很快,这种方式的查询结果是将指针移到符合条件的第一个记录。例如:
set tb=db.opentable("demo")
VB6.0的数据库编程方面按其难易程度可分为三类(由易到难);
1.使用数据库控制项和绑定控制项
在使用VB进行数据库编程时,通常,会首先选择三种基本方法之一来进行数据库应用程序的方案设计,现在就将以上三种设计方法的适应范围及其优缺点进行一个比较。
<1>.使用数据库控制项和绑定控制项
�它是三种方法中编码量最小的
�不必了解CDBC2.0API的细节
�允许使用标准的和第三方厂商制订的控制项
�支持所有的动态集方法及属性
�不能存取快照对象(snapshop)对象或表格对象(都属于记录集对象)
�不能存取数据库集合,比如表定义(TableDefs)字段(Fieds),索引( Indexes)及查询定义(QueryDefs)
�只能存取部分ODBC2.0管理函数
�不能进行真正的事务处理
�对中小规模的数据库表(通常少于一千条记录)只进行简章的浏览操作
�基本SQL查询所对应的结果集长度有限(通常结果集的记录数小于一百,这些记录从一个或两个长度有限的表中检索出来)
�应用程序的数据输入/输出项较少(通常只涉及一个或两个长度有限的表、并且表中的字段数在10个左右且不具有关系完整性限制
<2>.使用数据库对象变量进行编程
�可以在程序中存取ODBC2.0的管理函数
�可以控制多种记录集类型:Dynaset、Snapshop及Table记录集合对象
�可以存取存储过程和查询动作
�可以存取数据库集合对象,例如TableDefs、Fields、Indexes及QueryDefs具有真正的事务处理能力,包括启动事务( Begintrans)、提交事务(CommitTrans)及回滚事务(Rollback)
�比使用数据控制项的方法编码量较大
�只能进行间接的错误处理和错误恢复
�对每个数据库操作没有细粒度的控制
�对结果集和包含结果集的内丰资源的操作受到限制
�同直接使用ODBC2.0API函数的方法相比性能较低
�应用程序需要在执行期间动态地建立表、字段及索引
�应用程序涉及同步更新几张表(但在逻辑上保持一致性)的复杂事务
�应用程序使用结果集而不是Dynaset的窗体(FORMS),例如Snapshots或Tables,这里是设计要考虑的关键
�应用程序的表非常大,多于1000条记录
�应用程序具有复杂的数据输入/输出项,它涉及许多内部相关的字段并且包括数据库参照完整性或一致性规则
�应用程序需要执行一些额外的操作和对结果集的查询后处理,尤其是需要很高的数据格式化显示
�应用程序需要利用复杂的ODBC管理功能以选择、配置、校验及建立各种数据源
�应用程序需要在执行期间“显示”数据库的基本结构
�应用程序需要使用复杂的多码索引方式来检索或更新记录
�可以直接参与结果集的开发、管理及规范化
�对结果集游标提供了更多的控制,并且提供了更多的游标类型和执行动作
�能够确定ODBC驱动程序及SQL的一致性级别
�可以更好地控制Windows的执行调度及资源利用
�其他方面同其他方法差不多,因此这种方法很可能具有最好的性能
�较其他两种方法需要大量的代码
�代码复杂并且要求程序员具有编制API调用的经验
�在网络上Visual Basic运行期间库的错误处理缺乏安全性,因此代码运行期间出现的错误所造成的后果会非常严重
�如果系统环境为客户机/服务器模式下的大规模多用户环境,那么应用程序必须都能够准确地解决可能出现的系统错误和失败
�应用程序强调资源使用,这里如何对内存、网络服务器资源进行直接控制是首要的考虑因素
�应用程序使用超大规模数据库,例如数据库表可能包含几万或几十万条记录
大家知道,缺省情况下,VB删除记录只是把记录作上个删除标志而已,并没有真正删除。要真正删除记录,你可以使用 VB提供的以下方法:BeginTrans、CommitTrans、RollBack。其中,BeginTrans方法开始记录数据库的变动,CommitTrans方法确认数据库的变动,而 RollBack方法则可以恢复被删除或修改的记录。它们可以嵌套使用。因此,要恢复被删除的记录,应该在使用 BeginTrans方法之后及使用 CommiTrans方法之前使用 RollBack方法。
大家知道,在 VB中如果使用 DATA控件访问数据库,那么程序执行就必须要一些大型 DLL支持。这对于安装盘的发放是一个大问题。那么,在 VB中能不能不用 DATA控件访问数据库呢?
在 VB中不用 DATA控件而访问数据库,只有一法:将数据库文件当成2进制文件打开。但此法最大困难就是你必须了解数据库文件的结构形式。
比如:FoxBase的DBF文件(我不了解其它数据库的文件结构,大家可以去查查):它由记录头和记录构成。而记录头又由两部分构成:记录头=数据库说明+字段说明。下面列出 FoxBase数据库说明: FoxBase数据库说明起始地址字节数含义
2-4 3最后一次修改日期,3个字节分别为年、月、日
下面列出字段说明,每个字段由 32个字节构成。
12 1字段类型(分别为C、N、D、L等)
知道了字段信息说明,就可以使用复合变量+ 2进制文件来操作数据库了。
Text文件类型在很多软件中都为一般应用程序与数据库之间架起一座桥梁。你可以使用 Text ISAM驱动程序和 SQL来把 Text文件转换成 Access MDB数据库文件,首先,为文本文件创建一个 SCHEMA.INI文件。然后,你可以使用下面的代码来实现转换:
Dim db As Database, tbl as TableDef
Set db= DBEngine.CreateDatabase(App.Path&"\mymdb.mdb", dbLangGeneral, dbVersion_0)
Set tbl= db.CreateTableDef("Temp")
tbl.Connect="Text;database=c:\vbpj\data"
tbl.SourceTableName="Customer#txt"
db.Execute"Select Temp.* into NewTable from Temp"
把表达式 True=False放到表的 ValidationRule属性就能锁上。 HardLockTable?实现了该功能。
Function HardLockTable(ByVal whichAction As String,?ByVal aTable As String) As Integer
On Error GoTo HardLockTableError
MyDB.TableDefs(aTable).ValidationRule="True=False"
MyDB.TableDefs(aTable).ValidationText=?"This table locked via"&?"ValidationRule on"& Now
MyDB.TableDefs(aTable).ValidationRule=""
MyDB.TableDefs(aTable).ValidationText=""
If MyDB.TableDefs(aTable).ValidationRule="True=False" Then
MyDB.TableDefs(aTable).ValidationRule=""
MyDB.TableDefs(aTable).ValidationText=""
'optional, see next suggestion
MsgBox Error$&" error"&"in HardLockTable trying"&"to"& whichAction&""& aTable
Dummy= HardLockTable("Lock","TestTable")
Dummy= HardLockTable("UnLock","TestTable")
如果在代码中使用了数据控件如 DAO, RDO,或 ADO,在退出时应该关闭所有打开的 recordset, database,和 workspace。虽然对象能自动注销,但是数据连接不会马上断开,可能会导致一些内存不能被系统重新分配。
下面的代码可以关闭所有打开的 DAO workspace,并释放所占的内存。
Private Sub Form_Unload(Cancel As Integer)
用VB对FOXPRO数据库操作,经常会遇到这样一个问题:只能对记录进行DEL,也就是在该条记录上打一个删除标记,但不能象在数据库中那样,用"PACK"把这条记录真正删除.当记录数较多时,用DBGRID等控件做的程序都会出错.该怎样办呢?其实,VB中无法对DBF文件进行PACK。只能把ISAM的设置 Deleted设为On。这样相当于FoxPro的SET DELETED ON。不信你可以试一试。
Visual Basic(简称VB)是一种可视化的、事件驱动型的Windows应用程序开发工具,它在GUI设计、绘图、制表、运算、通信和多媒体开发方面都具有简单易行、功能强大等优点,所以越来越受到开发人员的亲睐。同时,VB在数据库开发方面也具有Foxpro所远不能及的强大功能。VB能够读取和访问Access、Excel、DbaseX、Foxpro、Btrieve和ODBC等多种数据库,并能利用VB自身所带的数据库引擎创建Access数据库。所以VB在管理信息系统(MIS)的开发和建设方面得到了是益广泛的应用。现在,笔者就VB应用数据库的一些方法作一简单的介绍。
VB访问数据库通常有三种途径:第一,通过数据库控制控件Data Control访问;第二,通过VB提供的数据库对象变量编程访问;第三,通过ODBC接口访问ODBC API函数。在这三种方法中,第一种方法操作起来最方便、灵活、易于掌握,同时也最能体现Visual Basic面向对象的特色,故这里以Foxpro2.5的数据库为例,介绍数据库控制控件(Data Control)访问数据库的方法与步骤:
一、在Form窗口中加入Data Control控件
用鼠标在工具窗口的Data Control控件按钮上双击左键,该对象即出现在Form窗口的中间(控件名为Data1),用鼠标调整好控件的大小及位置。如工具箱中无此控件,可打开主菜单的Tools/Custom,在列表中选中Microsoft Data Control复选框,确认后即可将此控件加入到工具箱中去。
用鼠标单击Data1,按下F4,打开属性窗口,设置Connect属性为Foxpro2.5,设置DatabaseName为c:\foxprow\student.dbf(假设磁盘上已有这个文件)。
三、加入字段显示、编辑控件(数据库捆绑控件)
在Form窗口中加入DGrid控件,如不在此控件,可打开主菜单Tools/Custom,在列表中选择Apex Data BroundGrid复选框,确认后即可向工具箱中加入此控件。在Form窗口中单击选中此控件(DGrid1),按下F4打开属性窗口,设置Datasource属性为Data1,在Form窗口中用鼠标右键单击控件DGrid1,选择 Retrieve Fields;再用鼠标右键单击控件DGrid1,选择Edit,用鼠标调整控件及有关字段大小;再用鼠标右键单击控件DGrid1,选择Properties(属性),在弹出窗口中,选择Colums标签,在下拉列表中选Colum1,将Caption属性改为“学号”,选择Colum2,Caption属性改为“姓名”,选择Colum3、4将Caption属性改为“性别”、“专业”,按下“确定”按钮。
再向Form窗口中加入一个按钮控件,将Caption属性设置为“退出”,双击该控件(Command1),在代码窗口中写入“END”,存盘。
此时,一个具备数据库读写、浏览功能的应用程序就建立了,按下F5运行,通过单击Data1的各按钮即可看出当前记录的变化情况。
在此基础上,我们还可以借助数据库控制控件的有关属性和方法进行更灵活的操作和控制。
1、设置Data1.Visiable=False’将控件设为不可见
2、将按钮Command2,3,4,5,6,7的Caption属性分别设置为“追加”、“首记录”、“上一条”、“下一条”、“尾记录”、“删除”,双击各按钮,分别写入事件代码:
Sub Command1-Click()’关闭应用程序
Sub Command2-Click()’追加记录
Sub Command3-Click()’移向首记录
Sub Command4-Click()’移向上一条记录
Sub Command3-Click()’移向尾记录
Sub Command4-Click()’移向下一条记录
除此之外,数据库控制控件还有Bookmark、RecordCount等许多属性与方法,能对数据库进行各种方便的操作。
由此可见,数据库控制控件具有数据库操作方面的强大功能。另外,数据库控制控件的RecordSource属性可用一个SQL语句赋值,
三、access能否做为网络数据库
1.将Access作为网络数据库直接使用是不可行的,因为它本质上是一个文件,当多个用户同时访问时容易出现冲突,并且缺乏必要的权限控制。
2.若要实现网络数据库的功能,通常需要设计一套网络程序和数据库的访问序列。这样,用户通过网络程序来间接访问数据库,而不是直接接触。
3.网络程序访问数据库的一个关键优势在于,只有在真正需要进行读写操作时才会打开数据库。一旦操作完成,数据库就会被及时关闭。这种做法可以避免因长时间打开数据库而引发的冲突,并且支持多用户同时使用。
4.例如,华创网表(网络版的Excel)的后台可以使用Access数据库,也可以使用SQL Server数据库。但用户前端操作的界面是一个基于网页的应用程序,通过这个程序用户可以访问后台数据库。