ADO对查询出的数据分页显示delphi
delphi 查询数据语句

delphi 查询数据语句Delphi是一种使用Object Pascal语言开发的集成开发环境(IDE),用于创建Windows、macOS、iOS、Android和Linux平台的应用程序。
在Delphi中,可以使用SQL语句来查询数据库中的数据。
下面列举了一些常见的Delphi查询数据语句:1. 查询所有数据:```SELECT * FROM TableName;```2. 查询指定字段的数据:```SELECT Field1, Field2, Field3 FROM TableName;```3. 查询满足条件的数据:```SELECT * FROM TableName WHERE Condition;```4. 查询带有排序的数据:```SELECT * FROM TableName ORDER BY Field ASC/DESC;```5. 查询唯一的数据:```SELECT DISTINCT Field FROM TableName;```6. 查询带有聚合函数的数据:```SELECT COUNT(Field) FROM TableName;SELECT SUM(Field) FROM TableName;SELECT AVG(Field) FROM TableName;SELECT MAX(Field) FROM TableName;SELECT MIN(Field) FROM TableName;```7. 查询带有条件的聚合数据:```SELECT COUNT(Field) FROM TableName WHERE Condition; SELECT SUM(Field) FROM TableName WHERE Condition; SELECT AVG(Field) FROM TableName WHERE Condition; SELECT MAX(Field) FROM TableName WHERE Condition; SELECT MIN(Field) FROM TableName WHERE Condition; ```8. 查询带有分组的数据:```SELECT Field1, SUM(Field2) FROM TableName GROUP BY Field1;```9. 查询带有连接的数据:```SELECT * FROM Table1 INNER JOIN Table2 ON Table1.Field = Table2.Field;SELECT * FROM Table1 LEFT JOIN Table2 ON Table1.Field = Table2.Field;SELECT * FROM Table1 RIGHT JOIN Table2 ON Table1.Field = Table2.Field;```10. 查询带有子查询的数据:```SELECT * FROM TableName WHERE Field IN (SELECT Field FROM OtherTable);SELECT * FROM TableName WHERE Field = (SELECT Field FROM OtherTable);```11. 查询带有模糊匹配的数据:```SELECT * FROM TableName WHERE Field LIKE 'Value%';SELECT * FROM TableName WHERE Field LIKE '%Value%'; SELECT * FROM TableName WHERE Field LIKE '_Value';```这些是一些常见的Delphi查询数据语句,可以根据具体的需求进行使用。
Delphi通过ADO组件操作数据库

Delphi 通过ADO 读写数据库ADO 是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据。
ADO (ActiveX Data Objects,ActiveX 数据对象)是Microsoft 提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。
例如,如果您希望编写应用程序从DB2或Oracle 数据库中向网页提供数据,可以将ADO 程序包括在作为活动服务器页(ASP)的HTML 文件中。
当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO 代码的结果。
在Delphi 5.0 以上的版本都可以很好的支持ADO技术。
Delphi 中 ADO 主要有1、ADOConnection 用于链接数据库2、ADOCommand ADODataSet 用来查询或执行SQL 语名;3、DataSource 数据中间存储组件;4、DBGrid 数据显示出来;其实主要是用ADO 连接,而ADO 也是最常用的连接技术之一。
以下几个控件在连接数据库时是用得比较多的,并且通常的的连接架构是————————————————————数据库↑ADOConnection↑ ↑ADOCommand ADODataSet↑DataSource↑DBGrid————————————————————Hanks-Lu 2013.08.21 09:15:46 +08'00'或者————————————————————数 据 库↑ ↑ADOCommand ADODataSet↑DataSource↑DBGrid————————————————————也就是说,ADOCommand和ADODataSet既可以通过ADOConnection连接数据库,也可以不用,分别直接连接数据库,因为这三个控件都有一个共同的ConnectionString属性。
一、 TADOConnection组件该组件用于建立数据库的连接。
delphi用ADO连接VFP数据库或数据表

ADOTable1.TableName := 'dat.dbf';//dat.dbf为DBF文件名,下同
ADOTable1.Open;
3、ADOConnection + ADOQuery
ADOConnection1.ConnectionString := 'Provider=MSDASQL.1;Extended Properties="Driver={Microsoft Visual Foxpro Driver};SourceType=DBF;SourceDB=c:\"';
比如你的文件是 c:\temp\aaa.dbf ,那么输入c:\temp
同时CursorLocation 设置为: clUseServer Fra bibliotek还可以:
如果直接连的话,ADO的连接字串设为:
adoConnection1.ConnectionString:='Provider=MSDASQL.1;Extended Properties="Driver={Microsoft Visual Foxpro Driver};SourceType=DBF;SourceDB=c:\mydb"';
ADOQuery1.SQL.Text := 'select * from dat.dbf';
ADO 存取数据库时如何分页显示

ADO 存取数据库时如何分页显示✓出处:站长百科✓原文地址:/wiki/ADO存取数据库时如何分页显示✓本电子书整理自站长百科/wiki/ADO词条站长百科(/wiki)站长自己的百科全书分享自己的建站知识 WIKI平台与站长一道共建知识库站长百科活动不断论坛发帖赚银币! 参加1美元竞拍更有机会赢2G超大免费空间! 超值好礼等您拿推荐内容:电子书下载 | 站长百科礼品兑换什么是 ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。
这就是数据库查询的分页显示,如果你还不明白,去看看 yahoo 等搜索引擎的查询结果就会明白了。
那么究竟如何才能做到将数据库的查询结果分页显示呢?其实方法有✓出处:站长百科很多,但主要有两种:一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性:PageSize( 页大小)、PageCount( 页数目) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。
二、根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。
两者的主要差别在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示的效果,而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接达到分页显示的功能。
我们可以很明显的感觉到,当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记 娣旁诜 衿髂诖嬷校 缓笤诮 蟹忠车却 恚 绻 庇谐 ? 100 个的客户在线查询,那么 ASP 应用程序的执行效率将大受影响。
在Delphi中使用原生ADO控制数据库

在Delphi中使用原生ADO控制数据库我发现很多朋友在开发数据库时都使用Delphi 自带的ADO 组件或Diamond ADO,其实在Delphi 中使用原生ADO 接口也是十分方便和有效的。
我使用原生ADO 开发项目已有很长一段时间,也回答过一些朋友类似的问题,现在把自己的一点心得与大家分享,班门弄斧,只是希望能对大家有所帮助。
当然,这帖子也是原生的,不是转贴的。
一、优点1、大家知道Delphi 对ADO 接口进行了一番包装后形成了ADOExpress,我想Borland 的主要目的还是想与自己的数据敏感控件相连。
然而事实上数据敏感控件并不是那么耀眼,如果你希望你编出来的程序稍微有点水准的话那就别用那玩意;如果你很少使用数据敏感控件,那么ADOExpress 基本上失去了其应有的作用,无数冗余的属性、虚方法,不管你用不用得到一股脑给你编译进去,也会使你的程序再大上200K;效率么,不说了。
2、MSDN 和VB 中的例子你可以搬过来就用。
3、告诉那些Delphi 反对者,Delphi 不是离开组件就活不了。
4、关于代码重用:我给大家的例子都是以函数或过程形式,重用性不好么?5、别说帖子太长,那你看看DB.pas, ADODB.pas 多长?二、基本储备1、一些必须的单元usesVariants, ComObj;2、一些基本常数(其它查ADODB2000.pas):constadOpenDynamic = $00000002;adOpenStatic = $00000003;adLockOptimistic = $00000003;adLockBatchOptimistic = $00000004;adStateClosed = $00000000;adStateOpen = $00000001;adStateConnecting = $00000002;adStateExecuting = $00000004;adStateFetching = $00000008;adUseServer = $00000002;adUseClient = $00000003;adModeReadWrite = $00000003;adXactCursorStability = $00001000;adCmdText = $00000001;adCmdTable = $00000002;adCmdStoredProc = $00000004;adCmdFile = $00000100;adAffectCurrent = $00000001;adAffectGroup = $00000002;adAffectAll = $00000003;adAffectAllChapters = $00000004;3、一些基本函数和过程//创建Connection 对象function CreateConnection: OleVariant;//释放Connection 对象;cnn 为 Connection 对象procedure FreeConnection(var cnn: OleVariant);//创建Recordset 对象function CreateRecordset: OleV ariant;//释放Recordset 对象;rst 为Recordset 对象procedure FreeRecordset(var rst: OleVariant);//创建Command 对象function CreateCommand: OleVariant;//释放Command 对象;cmd 为Command 对象procedure FreeCommand(var cmd: OleVariant);//用Connection 连接到SQLServer 数据库;cnn 为Connection 对象,db 数据库名,host 主机名,usr 用户名,pwd 密码function ConnectT oDB(cnn: OleVariant; const db, host, usr, pwd: string): Boolean;//执行SQL 语句,有返回行,无事务处理;cnn 为Connection 对象,rst 为Recordset 对象,sql 为SQL 语句(可以是存储过程)function ExecSQL(cnn, rst: OleVariant; const sql: string): Boolean;//执行SQL 语句,无返回行,有事务处理;cnn 为Connection 对象,cmd 为Command 对象,sql 为SQL 语句(可以是存储过程)function ExecSQLA(cnn, cmd: OleVariant; const sql: string): Boolean;begintryResult := CreateOleObject('ADODB.Connection');Result.CursorLocation := adUseServer;Result.IsolationLevel := adXactCursorStability;Result.Mode := adModeReadWrite;Result.Provider := 'SQLOLEDB.1';exceptif not VarIsEmpty(Result) then Result := Unassigned; end;end;procedure FreeConnection(var cnn: OleVariant);beginif not VarIsEmpty(cnn) thenbeginif cnn.State <> adStateClosed then cnn.Close;cnn := Unassigned;end;end;function CreateRecordset: OleV ariant;begintryResult := CreateOleObject('ADODB.Recordset');Result.CacheSize := 1000;Result.CursorType := adOpenStatic;Result.CursorLocation := adUseServer;Result.LockType := adLockOptimistic;exceptif not VarIsEmpty(Result) then Result := Unassigned; end;end;procedure FreeRecordset(var rst: OleVariant);beginFreeConnection(rst);function CreateCommand: OleVariant;begintryResult := CreateOleObject('mand');mandType := adCmdT ext;mandTimeout := 5;exceptif not VarIsEmpty(Result) then Result := Unassigned;end;end;procedure FreeCommand(var cmd: OleVariant);beginif not VarIsEmpty(cmd) then cmd := Unassigned;end;function ConnectT oDB(cnn: OleVariant; const db, host, usr, pwd: string): Boolean; beginResult := not VarIsEmpty(cnn);if Result thenbeginif cnn.State <> adStateClosed then cnn.Close;cnn.ConnectionString :='Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog=' +db + ';Data Source=' + host + ';Connect Timeout=5;' +'Use Procedure for Prepare=1';trycnn.Open(cnn.ConnectionString, usr, pwd, -1);exceptResult := False;end;end;end;function ExecSQL(cnn, rst: OleVariant; const sql: string): Boolean;beginif Result thenbeginif rst.State <> adStateClosed then rst.Close;tryrst.Open(sql, cnn, adOpenStatic, adLockOptimistic, adCmdText);exceptResult := False;end;end;end;function ExecSQLA(cnn, cmd: OleVariant; const sql: string): Boolean;beginResult := not (VarIsEmpty(cnn) or VarIsEmpty(cmd)) and (cnn.State = adStateOpen); if Result thenbegincnn.BeginTrans;trycmd.ActiveConnection := cnn;mandT ext := sql;cmd.Prepared := True;cmd.Execute;mitTrans;exceptcnn.RollbackTrans;Result := False;end;end;end;三、访问数据1、最前rst.MoveFirst;2、最后rst.MoveLast;3、向前rst.MovePrevious;4、向后rst.MoveNext;5、取当前记录rst.Fields[0].Value 或rst.Fields['字段名'].Value;6、修改当前记录rst.Update(rst.Fields[0].Name, 某值);8、删除当前记录rst.Delete(adAffectCurrent);9、删除所有记录rst.Delete(adAffectAll);10、追加记录rst.AddNew;rst.Fields[0].Value := 值1;rst.Fields[1].Value := 值2;rst.Update;11、刷新rst.Refresh;12、记录数rst.RecordCount15、其它方法和属性查MSDN 或ADO 的帮助;四、一些例子//变量声明varcnn, rst, cmd: OleVariant;//创建对象procedure TForm1.FormCreate(Sender: TObject);begincnn := CreateConnection;rst := CreateRecordset;cmd := CreateCommand;end;//释放对象procedure TForm1.FormDestroy(Sender: TObject); beginFreeCommand(cmd);FreeRecordset(rst);FreeConnection(cnn);end;//连接数据库procedure TForm1.Button1Click(Sender: TObject); beginif ConnectT oDB(cnn, 'mydb', '127.0.0.1', 'sa', 'ok') thenelse Caption := '连接失败';end;//取记录procedure TForm1.Button2Click(Sender: TObject);beginExecSQL(cnn, rst, 'select * from 表a');Caption := VarToStr(rst.Fields['字段a'].Value);end;五、原生ADO 与Delphi ADOExpress 组件的对应关系1、Connection <=> ADOConnection.ConnectionObject;2、Recordset <=> ADODataSet.Recordset;3、Command <=> mandObject;4、? <=> ADOQuery,因为ADOQuery 根本就不是原生ADO 对象5、ExecSQL <=> ADODataSet.Open;6、ExecSQLA <=> ADOCommand.Execute;7、有了上面几个其它的就不多说了六、与数据库结构有关的一些函数1、动态改变字段名称uses ComObj;//Access//TableName: 表名; OldColNam e: 原字段名; NewColNam e: 新字段名; procedure RenameField(const TableName, OldColName, NewColName: string); varDB, Col: OleVariant;beginDB := CreateOleObject('ADOX.Catalog');DB.ActiveConnection := ADOConnection1.ConnectionObject;Col := CreateOleObject('ADOX.Column');Col := DB.Tables[TableName].Columns[OldColName]; := NewColName;end;//SQLServerprocedure RenameField(const TableName, OldColName, NewColName: string);with ADOCommand1 dobeginCommandT ext := 'EXEC sp_rename ''' + TableNam e + '.' + OldColName +''',''' + NewColName + ''',''COLUMN'';';Excute;end;end;2、取得Access 库中的表结构typeTTableDef = recordName,DateCreated,LastUpdated,Description: string;end;TTableDefs = array of TTableDef;procedure GetT ableDefs(const DBNam e: string; out T ableDefs: TTableDefs);varDBEngine, DB: OleVariant;I: Longint;begintryDBEngine := CreateOleObject('DAO.DBEngine.36');DB := DBEngine.OpenDatabase(DBName);SetLength(T ableDefs, Longint(DB.TableDefs.Count));for I := Low(TableDefs) to High(T ableDefs) dobeginTableDefs[I].Name := DB.TableDefs[I].Name;TableDefs[I].DateCreated := DB.TableDefs[I].DateCreated;TableDefs[I].LastUpdated := DB.TableDefs[I].LastUpdated;tryTableDefs[I].Description := DB.TableDefs[I].Properties['Description'].Value;exceptTableDefs[I].Description := '';finallyDB := Unassigned;DBEngine := Unassigned;end;end;3、取得Access 表中的字段结构typeTFieldDef = recordName: string;Types,Size: Longint;Description: string;end;TFieldDefs = array of TFieldDef;procedure GetFieldDefs(const DBNam e, TableName: string; out FieldDefs: TFieldDefs);varDBEngine, DB: OleVariant;I: Longint;begintryDBEngine := CreateOleObject('DAO.DBEngine.36');DB := DBEngine.OpenDatabase(DBName);SetLength(FieldDefs, Longint(DB.TableDefs[T ableName].Fields.Count));for I := Low(FieldDefs) to High(FieldDefs) dobeginFieldDefs[I].Name := DB.TableDefs[TableName].Fields[I].Name;FieldDefs[I].Types := DB.TableDefs[T ableName].Fields[I].Type;FieldDefs[I].Size := DB.TableDefs[TableName].Fields[I].Size;tryFieldDefs[I].Description := DB.TableDefs[TableName].Fields[I].Properties['Description'].Value;exceptFieldDefs[I].Description := '';end;DB := Unassigned;DBEngine := Unassigned;end;end;4、至于如何动态创建Access 数据库之类我就不罗嗦了,到处都有相关的月经贴七、其它1、我使用ADO 的经历:ADOExpress-->ADOExpress的原生接口-->引用ADO2.1接口单元,即ADODB_TLB-->直接使用ADO 的COM 接口;2、希望此贴能对朋友门有所帮助,我写的这些都是经过实战检验的;3、觉得有用的朋友可以试一下,如果觉得没用就当我没写,耽误你时间了。
用delphi实现数据的分页显示

2020.03在用Delphi 制作数据库应用程序的时候,如果要显示的数据较多,那么采用分页显示是一种较好的解决方法,现在简单讲解一下其实现过程。
1窗体控件在窗体上放置若干控件,其名称及用途如表1所示。
2数据库的连接该程序数据库采用了Access 自带的样板数据库Northwind.mdb,相关数据库控件的关键属性的值如表2所示。
3相关程序(1)创建窗体的公有变量maxpages、curpage,二者都是整形变量,分别表示总页数和当前页数,设置为公有变量的目的是为了便于访问,再创建常量const countsPerPage=12,表示每页12条记录,根据需要可作更改。
程序的关键过程是movepage,该过程根据cur⁃page 变量的值显示该页数据,程序假定表中存在有记录,代码如下:procedure TForm1.movepage;var curPageMaxno:integer;//该页记录中最大的记//录号idbegin:integer;idend:integer;beginADOTable1.DisableControls;//切断数据组件和数据源的连接,防止因数据源的//改动而造成界面的闪动ADOTable1.Filtered :=false;//关闭过滤if curpage <maxpages then curPageMaxno:=curpage *countsPerPage elsecurPageMaxno :=ADOTable1.RecordCount;Adotable1.First;Adotable1.MoveBy((curpage-1)*countsPerPage);idbegin :=ADOTable1.FieldByName ('订单Id').AsInteger;Adotable1.First;Adotable1.MoveBy(curPageMaxno-1);idend :=ADOTable1.FieldByName ('订单Id').As⁃Integer;ADOTable1.Filter :='订单Id >='+IntToStr(id⁃begin)+'and '+'订单Id <='+IntToStr(idend);ADOTable1.Filtered :=true;//使用过滤实现当前页数据的显示ADOTable1.EnableControls;//恢复数据组件和数据源的连接end;(2)窗体的FormCreate 事件代码用Delphi 实现数据的分页显示曹健(江苏省南通市海安县人力资源和社会保障局,江苏南通226600)摘要:介绍了在数据库应用程序中实现数据分页显示的方法,其中涉及到Delphi 数据库应用程序设计的一些技巧。
ADOQuery用法(Delphi)

ADOQuery用法(Delphi)一、ADOQuery的LockType今天终于把纠缠了几天的问题改完了,说到底只是一个很小的问题,就是ADOQuery的一个小属性。
把控件DBGridEh的一列的checkbox设为true,将其绑定DataSourceA和DOQuery。
用Button添加了一个事件,用来取消对checkbox的操作:ADOQuery.CancelBatch();可是只能取消最后一步的操作。
检查了很长时间才发现在DBGridEh的DataSource的Dataset 下的LockType的属性设置问题,我设置成了:ItOptimistic 后来将此属性改为:ltBatchOptimistic 就可以了在网上查了一下,有如下说法:1.ADOQuery.Update;ADOQuery.Delete;不用设置属性.2.locktype指定用户打开数据集时对数据集的锁定级别:ltUnspecified 未指定锁定级别ltReadOnly Read-only 只读ltPessimistic 记录级别(该记录被编辑时其它用户不能用)ltOptimistic 独立模式(与原来结果集对照,如果在此期间其它用户修改了结果,则你的结果不能保存)ltBatchOptimistic 批量模式(使用缓存,进行批量提交)ADOQuery的属性含义:ltUnspecified 不特別指定ltReadOnly 选出來的资料表只能读,无法写入ltPessimistic 选出来的资料表可以写入,当改记录写入时会立刻写入并锁定ltOptimistic 选出来的资料表可写入,当该记录表写入时不会立刻写入但会锁定,当执行updates时才正式写入改记录ltBatchOptimistic 选出来的资料表可写入,当该记录写入时不会立刻写入但会锁定,当执行updates才正式整批写入该记录(可以修改多条整批update)二、Delphi中的ADOquery 用法都知道Delphi在数据库操作是非常好用的,delphi把ADO一些方法属性都集成了,以下是我的一些总结:***************************************通过sql的存储过程来实现:添加With ADOQuery1 dobeginClose;SQL.Clear;SQL.Add(' Insert Into Table1(Field1,Field2)')SQL.Add(' Values(10,20)');ExecSQL;end;修改With ADOQuery1 dobeginClose;SQL.Clear;SQL.Add(' Update Table1 Set Field1=20,Field2=30)') ExecSQL;end;删除With ADOQuery1 dobeginClose;SQL.Clear;SQL.Add(' Delete From Table1')SQL.Add(' Where Field1=20 and Field2=30'); ExecSQL;end;查询With ADOQuery1 dobeginClose;SQL.Clear;SQL.Add(' Select Field1,Field2 From T able1') SQL.Add(' Where Field1=20 and Field2=30'); Open;end;***************************************************通过Delphi自有的方法属性实现:添加:with ADOQuery1 doappend;......post;删除:with ADOQuery1 dodelete(选择删除的记录); //默认删除记录指针指向的记录修改:with ADOQuery1 doedit;......post;adotable1.Append; //添加ADotable1.Fields.FieldByName('gxid1').Value:=gx; adotable1.Post;adotable1.delete; //删除adotable1.edit; //修改ADotable1.Fields.FieldByName('gxid1').Value:=gx;adotable1.post;WITHI adoquery dobegin//添加adoquery.open;//motice set adoquery.sql adoquery.append;//OR adoquery.insert;fieldbyname(fieldname).asstring:=trim(edit1.text);......adoquery.post;end;删除:adoquery.delete修改:adoquery.edit;fieldbyname(fieldname).asstring:=trim(edit1.text);有关细节可以参看帮助OR DEMO三、ADOQuery的几个事件:procedure ADOQuery1_BeforePost ( DataSet : TDataSet);beginend;是在ADOQuery1或者相关联的DataSource的数据集改动后,在将改动保存到内存之前激发的事件,上次使用这个事件是用来判断修改之后的数据是否规范,如果不规范,就给出提示示例如下:要修改的列关联的Column 是Scoreprocedure ADOQuery1_BeforePost ( DataSet : TDataSet);】varscore:string;beginscore:=DataSet.FieldByName(‘score’).AsString; // 提取修改之后的数据if (‘score不符合规则’) thenself.msgWarning(‘’输入的数据有错);end;procedure ADOQuery1_AfterScroll (DataSet: TDataSet);beginend;是在点击与ADOQuery1相关联的DBGridEh1中的记录后激发的事件,可以用来做两个DBGridEh控件的关联事件。
在Delphi中开发使用多显示器的应用程序

在Delphi中开发使用多显示器的应用程序Windows可以将多个显示器映射为虚拟桌面,使我们可以利用这一点设计出方便工作的应用程序。
例如PowerPoint就充分发挥了双显示器的优势(大多数的笔记本电脑都支持),它可以在一个显示器上播放幻灯片,而在另一个显示器上显示备注,可以控制播放的进程,使使用者做商务演说的时候非常等心应手。
那么我们怎么开发这种应用程序呢?这篇文章将向你展示如果用Delphi实现使用多显示器的应用程序。
Windows还支持克隆显示方式,每个显示器输出同样的内容,这对某些应用也是有意义的。
还有些显卡虽然也支持两个显示器,不过他们并不是真正意义上的多显示器,而是虚拟高分辨率显示模式(如2048×768或者1024×1536),通过显卡将画面分别显示到两个显示器上。
这两种显示模式都不是本文介绍的zhongdian,而且也非常简单,所以我们也就不再赘述了。
Windows最多支持10个显示器,Windows将所有显示器映射为一个大的虚拟桌面。
可以将显示器理解为桌面某个局部的视图。
在显示属性中可以根据显示器的物理位置任意排布这些显示器。
如果显示器的排列不规则,虚拟桌面上的某些部分可能无法显示在任何一个显示器上。
为了不使一个窗体显示在两个显示器之间等原因的考虑,Windows将一个显示器作为主显示器。
启动计算机时,登录对话框就显示在主显示器中。
绝大多数程序启动示,都会显示在主监视器中。
根据上述介绍,不难发现几个重要的概念:桌面、显示器、主显示器等。
首先必须先弄清楚这些概念以及他们之前的关系。
这是掌握多显示器应用程序开发方法的重点。
理解了这些概念,其他的部分就非常好理解了。
桌面实际上是指Windows可显示的逻辑区域。
实际上是可以将一个窗体显示到桌面之外的。
然而这并不是说桌面的所有部分都会显示在某台显示器上(原因如前所述);但反过来说,任何一个显示器显示的内容都必然是桌面的一部分。
delphi多页组件(TPageControl)使用方法详解实例

delphi多页组件(TPageControl)使用方法详解实例TPageControl 组件是一组页面集,用于构造一个多页对话框,它显示多个交互页(TTabSheet 对象),用户通过选择出现在控制上部的标签,可以选择不同的页。
在设计时要加入新页,用鼠标右键单击该组件对象,出现一弹出菜单,选择“New Page”菜单项。
此组件用于需要显示大量信息的时候,屏幕上不可能把这些信息同时显示出来,解决的办法之一就是打开多个窗口,但是要管理好这些窗口不是一件很简单的事。
最好的解决办法就是把这些信息分门别类,放在同一个窗口的不同页上,这样能够节省大量的屏幕空间,翻阅起来又非常方便,就好比一本书,如果把书的每一页拆下摊在桌子上,要占很大的地方,如果装订成书,就只占一本书的地方。
Windows 风格的多页组件是用TPageControl 组件实现的,在TPageControl 组件上按下鼠标右键,在弹出的菜单中选择“New Page”命令,Delphi 7 将自动增加一页,默认的标签为“TabSheet+序号”。
多页组件具有如下特点:在设计期就能够直接按多页组件在页与页之间切换,而Win 3.1 风格的多页组件只有在修改ActivePage 属性后才能切换到另一页,不方便也不直观。
不需要与TTabControl 组件配合使用,在程序中也不需要响应按钮的事件。
TPageControl 组件的每一页都是一个TTabSheet 对象,为在运行时操纵每一页提供了极大方便。
1.TPageControl 组件的典型用法TPageControl 组件主要用于程序的选项窗口,因为选项窗口拥有很多方面的设置。
在TPageControl组件上单击鼠标右键,在弹出式菜单中选中“New Page”菜单命令,将会增加一个新的页面。
对于TPageControl 组件,利用鼠标左键单击标签与单击页面位置选中的对象是不同的。
如果单击标签,则选中了整个组件,同时设置当前激活页,这时按下Delete 键,会把整个组件删除。
ADO对查询出的数据分页显示delphi

ADO对查询出的数据分页显示delphiADO对查询出的数据分页显示delphi(转)unit MainFrm;interfaceusesClasses, Controls, Forms, Grids, ToolWin, ComCtrls, StdCtrls, ExtCtrls, DB, ADODB;typeTfrmMain = class(TForm)cnn: TADOConnection;rst: TADODataSet;pnlNavigate: TPanel;btnFirst: TButton;btnPrior: TButton;btnNext: TButton;btnLast: TButton;edtPageNO: TEdit;sgData: TStringGrid;procedure FormCreate(Sender: TObject);procedure btnFirstClick(Sender: TObject);procedure edtPageNOKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); privateFPageNo: Integer;procedure SetPageNo(Value: Integer);publicproperty PageNo: Integer read FPageNo write SetPageNo;end;varfrmMain: TfrmMain;implementationusesWindows, SysUtils;{$R *.dfm}constPAGE_SIZE = 6;procedure TfrmMain.FormCreate(Sender: TObject);vari: Integer;beginSetWindowLong(edtPageNO.Handle,GWL_STYLE,GetWindo wLong(edtPageNo.Handle, GWL_STYLE) or ES_CENTER or ES_NUMBER);rst.Active := True;rst.Recordset.PageSize := PAGE_SIZE;sgData.ColCount := rst.FieldCount + 1;for i := 0 to rst.FieldCount - 1 dobeginsgData.ColWidths[i + 1] := rst.Fields[i].DisplayWidth * Canvas.TextWidth('0');sgData.Cells[i + 1, 0] := rst.Fields[i].DisplayName;end;sgData.Cells[0, 0] := '序号';PageNo := 1;end;procedure TfrmMain.btnFirstClick(Sender: TObject);beginif Sender = btnFirst thenPageNo := 1else if Sender = btnPrior thenPageNo := PageNo - 1else if Sender = btnNext thenPageNo := PageNo + 1else PageNo := rst.Recordset.PageCount;end;procedure TfrmMain.edtPageNOKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);beginif edtPageNO.T ext <> '' thenPageNo := StrT oInt(edtPageNO.Text);end;procedure TfrmMain.SetPageNo(Value: Integer);constadStateOpen = $00000001;varn, i, j: Integer;beginwith rst.Recordset doif (FPageNo <> Value) and (Value >= 1) and (Value <= PageCount) and(State = adStateOpen) thenbeginFPageNo := Value;AbsolutePage := FPageNo;n := (FPageNo - 1) * PAGE_SIZE;edtPageNo.Text := IntToStr(FPageNo);for i := 1 to PAGE_SIZE dobeginsgData.RowCount := i + 1;sgData.Cells[0, i] := IntToStr(n + i);for j := 0 to Fields.Count - 1 dosgData.Cells[j + 1, i] := Fields[j].Value;MoveNext;if Eof then Exit;end;end;end;end.*************************************************************** **********************************************随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。
ADONET中实现查询结果的分页显示

中实现查询结果的分页显示一、问题分析:我们利用进行数据库编程时,一般是将查询结果填充到DataSet的DataTable对象中,再通过与其绑定的DataGrid控件显示出来。
很多时候查询结果的记录数会比较大,虽然理论上一个DataTable 对象可以容纳16000000行,但在实际操作中,我们实在没有必要将全部记录装入DataTable,原因在于:用户肯定不会同时浏览这么多行,滚动条的出现使程序操作更繁琐,并且通过网络传输的记录太多,程序的效率也会大大降低。
因此应尽量减少读取的记录数,采用分页机制:一次显示一页内容,只读取需要的记录。
在填充DataTable时,将起始记录和记录个数作为参数传递给DataAdapter的Fill方法,就能实现简单的分页效果,代码如下:da.Fill(dt,(n-1)*10,10,"订单") '读订单表的第n页(每页10行)填充dt实际在执行时,DataAdapter仍然要读取指定记录前的所有记录(即包括前n-1页),然后放弃它们。
所以该方法只适用于较小的数据表,若处理大型数据库,并不能实质上提升效率。
为了更好的实现分页机制,必须编写一些灵活的SQL语句。
二、实现方法:(订单表)如图所示,假设有一个12条记录的数据表“订单”,按“订单ID”列排序,我们要分3页显示,每页4行,获取第1页的SQL语句很简单:SELECT TOP 4 * FROM 订单 ORDER BY 订单ID移到下一页的语句也很简单,假设当前正处于表的第2页,想读出后4行,这些行的订单ID值应大于当前页最后一条记录的订单ID值:SELECT TOP 4 * FROM 订单 WHERE 订单ID>8 ORDER BY 订单ID获取最后一页的语句稍复杂一些:按反向顺序读取记录,然后选择结果中的前4行。
为简化问题,我们假设表中的总记录数是每页记录数的整数倍:SELECT TOP 4 * FROM 订单 ORDER BY 订单ID DESC但这样得到的结果,行的顺序是反的(即按订单ID从大到小排列),所以需要颠倒这些行的顺序,我们将以上查询当作另一个正向排序查询命令的子查询:SELECT * FROM 订单 WHERE 订单ID IN(SELECT TOP 4 订单ID FROM 订单 ORDER BY 订单ID DESC)ORDER BY 订单ID假设当前页是第2页,移到上一页的语句如下,同样要将行的顺序颠倒一次:SELECT * FROM 订单 WHERE 订单ID IN(SELECT TOP 4 订单ID FROM 订单 WHERE 订单ID<5 ORDER BY 订单ID DESC)ORDER BY 订单ID现在可以在Windows窗体或Web窗体中实现第一页、上一页、下一页、最后一页等按钮了,我们再添加一个“转到”按钮,实现直接显示第n页的效果。
用Delphi结合ADO开发Excel数据服务器应用技术(二)——DeIphi操作Excel数据文件的ADO方法

用 过 程 中 ,更具 灵活 性 ,在 多层 数 据 库 应 用 开 发 中 使 用 更 为 普
遍 。 为 了将 A D O 的 这 种 技 术 说 清 楚 ,以 下 分 两 节来 介 绍 。
萝 尊 堂 一
1 AD O 连 接 串生 成
在 D e l p h i中 A D O T a b l e , A D O D a t a S e t . A D O Q u e r y 和 A D 0 C 0 n n e c t i 0 n控 件 几 乎 都 能 采 用 数 据 连 接 串 的 连 接 到 数 据 连 接 成 功
E x c e l 应 用 程 序 的 友 好 界 面 ,D e l p h i 标准组件访 问方式 与 C O M
件 ,如 果 在 当 前 路 径 ,就 直 接 填 人 “ 学期 选课 总表. x l s ” 。
( 4 )在 “ 所 有 ”选项 卡 中找到 “ E x t e n d e d P r o p e r t i e s ”, 双
就选 择 “ 全部 文件 ( . ) ”Байду номын сангаас吧 ,接 着 选 择 要 连 接 的 E x c e l文
C O M、扩 展 O L E C o n t a i n e r 和D e l p h i 标 准 组 件 方 式 等 ,这 几 种 方 法各 有特 色 ,适 用 程 度 也 不 同 。A D O方 式 访 问 E x c e l 文 件 适 用 于 以 数据 库 访 问方 式 维 护 E x c e l 文 件 ,C O M 方 式 动 态 访 问编 程设计 与 V B A访 问接 口方 式 相 似 ,适 用 于 E x c e l 文件 数 据 维 护 和 复杂 报表输 出 ,扩展 O L E方式 访问 E x c e l 文 件 时 能 够 保 持
Delphi-ADOQuery连接数据库的查询、插入、删除、修改

Delphi-ADOQuery连接数据库的查询、插入、删除、修改//查询记录procedure TForm1.Button1Click(Sender: TObject);beginADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('select * from YourTABLE where 查询条件');ADOQuery.Open;//插入记录procedure TForm1.Button2Click(Sender: TObject);beginADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Text:='insert into YourTABLE(字段1,字段2) values(:字段1,:字段2)'; // ADOQuery.SQL.Add('insert into YourTABLE values(:字段1)');ADOQuery.Parameters.ParamByName('字段1').Value:=trim(Edit1.Text); ADOQuery.Parameters.ParamByName('字段2').Value:=trim(Edit2.Text); ADOQuery.ExecSQL;end;//删除记录procedure TForm1.Button3Click(Sender: TObject);beginADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Text:='Delete from YourTABLE where 字段3=:字段3';//这里没有添加where的条件判断,实际使用时,注意添加判断// ADOQuery.SQL.Add('Delete from NEW_TABLE where 字段3=:字段3'); ADOQuery.Parameters.ParamByName('字段3').Value:=trim(Edit3.Text); ADOQuery.ExecSQL;//删除记录也可用DeleteRecords()函数procedure DeleteRecords(AffectRecords: TAffectRecords = arAll);这个函数有一个参数:AffectRecords可以取如下的值:1、arCurrent :删除当前记录2、arFiltered :删除符合Filter过滤后的所有记录(如果你使用Filter过滤的话)3、arAll :删除所有记录4、arAllChapters :Delete affects all chapters(ADO chapters)//修改记录procedure TForm1.Button4Click(Sender: TObject);beginADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Text:='Update YourTABLE SET 字段4=:字段4';//这里没有添加where的条件判断,实际使用时,注意添加判断// ADOQuery.SQL.Add('Update YourTABLE SET 字段4=:字段4');ADOQuery.Parameters.ParamByName('字段4').Value:=trim(Edit4.Text);ADOQuery.ExecSQL;//即时更新插入、删除、修改后的记录在上面插入、删除、修改的语句后添加如下代码即可:ADOQuery.Close;ADOQuery.SQL.Add('select * from YourTABLE where 查询条件');ADOQuery.Open;//使用ADOQuery时注意:1、如果你需要更改数据,query.requestlive必须为true2、如果有输入参数的时候,容易出错,通常的错法是这样:比如:“WHERE abc = : abc”改正如下:“WHERE abc=:abc”就是说=:前后都不能留空格。
Delphi——ADO组件的使用

8.3 TADOCommand组件概述
5. CammandTimeout属性 CammandTimeout属性是一个整型数,指定执行一个命 令的最大允许时间,默认值是30秒。在TADOCommand组 件通过TADOConnection 组件与数据连接的情况下,如果同 时两者指定了CammandTimeout属性,则优先考 TADOCommand组件中设置的值。 6. ExecuteOption属性 指定调用Execute方法时的命令特征。 7. ParamCheck属性 指定在运行时如果SQL命令被改变,是否需要重建 TADOCommand组件的参数列表。 8. Parameters属性 在 SQL 命令中或在存储过程中需要传递参数的时候才 需要设置这个值,并且,在命令类型(CommandType)指 定为cmdText或 cmdStoredProc时,参数才有效。
第8章 ADO组件的使用
本章主要内容: • TADOConnection组件的使用 • TADOCommand组件的使用 • TADODataSet组件的使用 • TADOQuery组件的使用
8.1 TADOConnection组件概述
TADOConnection组件用于建立数据库的连接,该连 接可被多个数据集所共享。 TADOConnection 组件提供的功能: •控制数据库的连接 •控制服务器的注册 •管理事务 •为关联的数据集提供数据库连接 •将SQL命令发送到数据库中 •从数据库中提取数据 8.1.1 TADOConnection 的常用属性 1. Attributes属性 此属性用于设置连接的数据库的自动处理事务的行为 ,它是TXactAttributes类型的集合,包括两个集合元素。
8.1 TADOConnection组件概述
ADO_NET中实现查询结果的分页显示

Delphi下的ADO使用方法

Delphi下的ADO使用方法本文向您揭示在Delphi中使用ADO是如何轻而易举,结合了ADO的Delphi应用程序,将不再依赖于BDE。
ADO的精髓在于利用简单的COM指令来快速方便的访问ODBC数据源,微软的表格、列表框等ActiveX控件使得用户可以简便的利用ADO工作;然而,本文中笔者仅仅向您展示了如何利用程序访问数据库,将不采用任何可视化数据控件。
本文将向您展示如何利用Variant或interfaces访问和修改ADO数据库,示例程序非常简单,可运行于Delphi 3或4。
安装和访问一个ADO数据库。
示例程序的代码不足150行,然而运行本程序必须首先安装ADO以及设置ODBC数据源。
ADO是一组COM组件的集合,允许程序员利用利用少量的简单代码访问数据库。
ADO通常和OLEDB、Universal Data Access以及Microsoft Data Access Components(MDAC)联系在一起。
OLEDB产生较ADO为早,是后期各种技术的基础。
如果你已经安装了ADO,你会在你的计算机中发现ADODB.DLL或者是MSADO15.DLL,这些文件中包含了一个类库,其中包括了利用ADO编程所需的全部接口和常量。
在Delphi 中,选择菜单Project Import Type Library,选择以上的DLL文件,然后确定,系统生成了一个基于ADODB.DLL的ADODB_TLB.Pas文件,这个文件中包含了所有Delphi ADO编程所需的声明。
最后一步的准备工作就是将Delphi演示数据库中的Clients.DBF设置为ODBC系统DSN,其别名为DBDemosDBase,驱动程序为Dbase 5。
以下程序清单同时利用Variants和Interfaces访问ADO:unit Main;{---------------------------------------------------------------------Created Jan 5, 1999. Copyright (c) 1999 by Charlie Calvert----------------------------------------------------------------------}interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls, ComObj, Grids, ADODB_TLB, ExtCtrls;constSELECTSTRING = ’SELECT * FROM Clients.dbf’;DSNSTRING = ’DBDemosDBase’;type TForm1 = class(TForm)StringGrid1: TStringGrid;Panel1: TPanel;VariantBtn: TButton;InterfaceBtn: TButton;UpdateBtn: TButton;Edit1: TEdit;procedure VariantBtnClick(Sender: TObject);procedure InterfaceBtnClick(Sender: TObject);procedure UpdateBtnClick(Sender: TObject);procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);privateprocedure Display(RecordSet: _RecordSet); { Private declarations } public { Public declarations }end;var Form1: TForm1;implementationusesActiveX;{$R *.DFM}procedure TForm1.Display(RecordSet: _RecordSet); varY, i: Integer;beginY := 1;repeatfor i := 0 to 6 doStringGrid1.Cells[i, Y] := RecordSet.Fields[i].Value; RecordSet.Move(1, EmptyParam);Inc(Y);until RecordSet.EOF;end;procedure TForm1.InterfaceBtnClick(Sender: TObject); var RecordSet: _RecordSet;DSN: string;begin// 生成空的recordset objectOleCheck(CoCreateInstance(CLASS_RecordSet, nil,CLSCTX_ALL, IID__RecordSet, RecordSet));DSN := ’dsn=’ + DSNSTRING;// 填写数据RecordSet.Open(SelectString, DSN, adOpenForwardOnly, adLockReadOnly, adCmdUnspecified);// 显示数据Display(RecordSet);UpdateBtn.Enabled := True;end;procedure TForm1.UpdateBtnClick(Sender: TObject);var RecordSet: _RecordSet;DSN: string;beginOleCheck(CoCreateInstance(CLASS_RecordSet, nil, CLSCTX_ALL, IID__RecordSet, RecordSet));DSN := ’dsn=’ + DSNSTRING;// Fill the recordsetRecordSet.Open(SELECTSTRING, DSN, adOpenDynamic, adLockOptimistic, adCmdUnspecified);// 修改RecordSet.Move(StringGrid1.Row - 1, EmptyParam); RecordSet.Fields[StringGrid1.Col].V alue := Edit1.Text;RecordSet.Update(EmptyParam, EmptyParam); RecordSet.MoveFirst;Display(RecordSet);end;procedure TForm1.VariantBtnClick(Sender: TObject); varRecordSet: OleV ariant;Y, i: Integer;begin// Create an empty recordset objectRecordSet := CreateOleObject(’ADODB.Recordset’); // Fill the recordsetRecordSet.Open(SELECTSTRING, DSNSTRING); // Display the dataY := 1;repeatfor i := 0 to 6 doStringGrid1.Cells[i, Y] := RecordSet.Fields[i].Value; RecordSet.Move(1);Inc(Y);until RecordSet.EOF;end;procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean);beginEdit1.Text := StringGrid1.Cells[ACOl, ARow];end;end.这个程序有三个按钮,一个StringGrid以及一个编辑框,第一个按钮利用以Variants连接的ADO填充表格,第二个则利用Inteface进行连接。
Dellphi-ADO组件系列教程--ADOTable

Delphi ADO组件系列教程之二ADOTable组件应用教程本节将介绍Delphi中ADOTable数据访问组件。
ADOTABLE以及其灵活的方式访问数据库表。
功能相当强大,在Delphi数据库应用程开发中,起者很重要的作用。
下面先介绍其属性、事件及常用方法,最后介绍应用示例。
一、TADOTable组件属性,见下图。
常用属性说明:Active 是否激活Table连接,可选True或False,为True时激活连接,注意,激活前必须指定ConnectionString或Connection属性并且指定TableName(表名)。
AutoCalcFillds是否是自动计算字段CacheSize 指定缓存大小CommandTimeOut 命令执行超时期限ConnectionString 指定数据库连接字符串Connection 连接对象,可以和ADOConnection对象绑定,即如果创建了ADOConnection对象,在列表可以直接选择数据库连接对象CusorType 游标类型默认为键集游标,Ctkeyset 键集游标。
可上下移动的游标,给打开的记录创建了一个关键字列表,类似记录集的描述,访问的时候才去取得数据值,就是说可以即时看到数据集中数据修改信息,但是不能即时得到数据是否删除的信息。
Ctdynamic 可以上下移动,可得到数据的最新状态,但是执行效率会有所降低ctopenForwardOnly 前向游标。
只能用MOVENEXT 读取。
并且打的同时建立数据库的备份,不能即时体现数据库记当的状态。
比如记录的编辑和增删。
ctStatic 静态游标。
完全滚动,它先将数据库备份文件之后进行操作.可以断开数据库连接后继续使用.ctUnspecified 未定义。
游标类型Filter 过滤器。
TADOTable的过滤字符串Filtered 是否使用过滤器IndexFiledNames索引字段列表IndexName 索引名称LockType 锁类型。
delphi读取excel两种方法,一是用ADO连接,问题是Excel文件内容要规则,...

delphi读取excel两种方法,一是用ADO连接,问题是Excel文件内容要规则,...delphi 读取excel 两种方法,一是用ADO连接,问题是Excel文件内容要规则,二是用OLE打开2011-08-11 15:26转载自分享最终编辑 leezio两种方法,一是用ADO连接,问题是Excel文件内容要规则,二是用OLE打开,但操作就没有象操作数据库那么方便了.一、用ADO连接:设置属性ConnetionString选择 Microsoft Jet 4.0 OLE DB providerSelect or enter a datasorce name -> 选择你要打开Excel文件User name默认是Admin 密码默认为空,可以不用理会Extended properties 设为:Excel 8.0sql语句 select * from [yourtablename] (注意要有[])二、用OLE打开(以下是一个范例,注释掉的代码也是有用的语句,注意要uses ExtCtrls,ComObj单元):var ExcelApp:Variant;beginExcelApp:=CreateOleObject('Excel.Application');//ExcelApp.visible:=true;ExcelApp.Caption:='应用程序调用 Microsoft Excel';ExcelApp.WorkBooks.Add; //新增工作簿//ExcelApp.workBooks.Open('C:\MyDocuments\Ca09lin1.xls'); //打开已存在工作簿ExcelApp.Worksheets[2].activate; //打开第2个工作表//ExcelApp.WorkSheets['第四章'].activate; //打开名为第四章的工作表ExcelApp.Cells[1,4].Value:='第一行第四列';ExcelApp.Cells[1,5].Value:='第一行第五列';ExcelApp.ActiveSheet.Columns[4].ColumnWidth:=15;ExcelApp.ActiveSheet.Rows[1].RowHeight:=15;//ExcelApp.WorkSheets[1].Rows[8].PageBreak:=1; //设置分页符,但似无效//Excelapp.ActiveSheet.Rows[8].PageBreak:=1; //同上ExcelApp.ActiveSheet.Range['B3:D4'].Borders[2].Weight:=3;ExcelApp.ActiveSheet.Range['B3:D4'].Borders[1].Weight:=3;ExcelApp.ActiveSheet.Range['B3:D4'].Borders[3].Weight:=3;ExcelApp.ActiveSheet.Range['B3:D4'].Borders[4].Weight:=3;//ExcelApp.ActiveSheet.Range['B3:D4'].Borders[5].Weight:= 3; //会直接在范围内的各Cell内加上斜杠|//ExcelApp.ActiveSheet.Range['B3:D4'].Borders[6].Weight:= 3; //与上句类似//Bordrs:1-左 2-右 3-顶 4-底 5-斜( \ ) 6-斜( / )ExcelApp.Cells[3,2].Value:='三行二列';ExcelApp.Cells[3,3].Value:='三行三列';ExcelApp.Cells[3,4].Value:='三行四列';ExcelApp.Cells[4,2].Value:='四行二列';ExcelApp.Cells[4,3].Value:='四行三列';ExcelApp.Cells[4,4].Value:='四行四列';//ExcelApp.ActiveSheet.Range['B3:D4'].Value.CopyToClipBoa rd;ExcelApp.activeSheet.Cells[1,4].ClearContents; //清除一行四列的内容,activeSheet可以省略Excelapp.Rows[3]:='隶书'; //这里Rows前省略了activeSheet,但针对也只是当前工作表而非整个工作簿ExcelApp.Rows[3].font.Color:=clBlue;ExcelApp.Rows[3].Font.Bold:=True;ExcelApp.Rows[3].Font.UnderLine:=True;ExcelApp.Range['B3:D4'].Copy;RichEdit1.PasteFromClipboard;//ExcelApp.ActiveSheet.PageSetup.CenterFooter:='第$P页';//所有页面设置(PageSetup的属性)都不能进行,不知为何//ExcelApp.ActiveSheet.PrintPreview; //打印预览//ExcelApp.ActiveSheet.PrintOut; //直接打印输出//if not ExcelApp.ActiveWorkBook.Saved then //工作表保存:// ExcelApp.ActiveSheet.PrintPreview;//ExcelApp.SaveAs( 'C:\Excel\Demo1.xls' ); //工作表另存为ExcelApp.ActiveWorkBook.Saved := True; // 放弃存盘ExcelApp.WorkBooks.Close; //关闭工作簿ExcelApp.Quit; //退出 ExcelExcelApp:=Unassigned;//释放excel进程end;另:得到excel的行数、列数:Maxc :=ExlApp.WorkSheets[1].UsedRange.Columns.Count;Maxr :=ExlApp.WorkSheets[1].UsedRange.Rows.Count;得到列宽a:=createoleobject('excel.application');a.workbooks.add;a.activecell.columnwidth:=10;showmessage(inttostr(a.activecell.columnwidth));。
Delphi环境下使用ADO技术访问数据库的方法研究

Delphi环境下使用ADO技术访问数据库的方法研究叶文【摘要】阐述了ADO技术访问数据库的结构、Delphi2010中ADO对象模型、Delphi2010中ADO编程模型(工作流程),通过一个完整的实例,介绍了Delphi环境下使用ADO技术访问数据库的方法.【期刊名称】《长江大学学报(自然版)理工卷》【年(卷),期】2012(009)011【总页数】3页(P133-134,145)【关键词】Delphi;ADO;数据库【作者】叶文【作者单位】武汉铁路职业技术学院实训中心,湖北武汉430205【正文语种】中文【中图分类】TP311ADO(ActiveX Data Objects,ActiveX数据对象)是Microsoft公司提供的一种应用程序级接口中,提供统一的方式访问多种数据源。
ADO 技术是微软提出来的处理关系型数据库和非关系型数据库的新技术,是专门为了给大范围商业数据源提供访问而设计的,包括传统的关系型数据表、电子邮件系统、图形格式、Internet 资源等[1-2]。
ADO 所需内存少,适合大流量和大事务量的网络计算机系统。
由于ADO技术的迅速普及,从Delphi5.0开始加入了ADO技术的模块,并逐渐形成Delphi数据库设计的主流。
下面,笔者主要研究了在Delphi2010环境下使用ADO技术实现数据库访问的方法。
1)ADO技术访问数据库的结构 ADO技术访问数据库的体系结构如图1所示。
2)Delphi2010中ADO对象模型 Delphi2010中ADO对象模型位于dbGo面板中,如图2所示。
3)Delphi2010中ADO编程模型(工作流程) 在Delphi2010中,用户直接通过ADO组件访问数据库(包括本地数据库和远程数据库)的工作流程[3]如图3所示。
用ADOConnection组件连接数据库,用ADOCommand组件指定数据库的操作(增加、删除及查询),用ADODataSet指定操作结果集,通过数据通道控件DataSource建立数据控制控件与操作结果集间的关系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ADO对查询出的数据分页显示delphi(转)unit MainFrm;interfaceusesClasses, Controls, Forms, Grids, ToolWin, ComCtrls, StdCtrls, ExtCtrls, DB, ADODB;typeTfrmMain = class(TForm)cnn: TADOConnection;rst: TADODataSet;pnlNavigate: TPanel;btnFirst: TButton;btnPrior: TButton;btnNext: TButton;btnLast: TButton;edtPageNO: TEdit;sgData: TStringGrid;procedure FormCreate(Sender: TObject);procedure btnFirstClick(Sender: TObject);procedure edtPageNOKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); privateFPageNo: Integer;procedure SetPageNo(Value: Integer);publicproperty PageNo: Integer read FPageNo write SetPageNo;end;varfrmMain: TfrmMain;implementationusesWindows, SysUtils;{$R *.dfm}constPAGE_SIZE = 6;procedure TfrmMain.FormCreate(Sender: TObject);vari: Integer;beginSetWindowLong(edtPageNO.Handle,GWL_STYLE,GetWindowLong(edtPageNo.Handle, GWL_STYLE) or ES_CENTER or ES_NUMBER);rst.Active := True;rst.Recordset.PageSize := PAGE_SIZE;sgData.ColCount := rst.FieldCount + 1;for i := 0 to rst.FieldCount - 1 dobeginsgData.ColWidths[i + 1] := rst.Fields[i].DisplayWidth * Canvas.TextWidth('0');sgData.Cells[i + 1, 0] := rst.Fields[i].DisplayName;end;sgData.Cells[0, 0] := '序号';PageNo := 1;end;procedure TfrmMain.btnFirstClick(Sender: TObject);beginif Sender = btnFirst thenPageNo := 1else if Sender = btnPrior thenPageNo := PageNo - 1else if Sender = btnNext thenPageNo := PageNo + 1else PageNo := rst.Recordset.PageCount;end;procedure TfrmMain.edtPageNOKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);beginif edtPageNO.Text <> '' thenPageNo := StrToInt(edtPageNO.Text);end;procedure TfrmMain.SetPageNo(Value: Integer);constadStateOpen = $00000001;varn, i, j: Integer;beginwith rst.Recordset doif (FPageNo <> Value) and (Value >= 1) and (Value <= PageCount) and(State = adStateOpen) thenbeginFPageNo := Value;AbsolutePage := FPageNo;n := (FPageNo - 1) * PAGE_SIZE;edtPageNo.Text := IntToStr(FPageNo);for i := 1 to PAGE_SIZE dobeginsgData.RowCount := i + 1;sgData.Cells[0, i] := IntToStr(n + i);for j := 0 to Fields.Count - 1 dosgData.Cells[j + 1, i] := Fields[j].Value;MoveNext;if Eof then Exit;end;end;end;end.*************************************************************************************************************随着“金盾工程”建设的逐步深入和公安信息化的高速发展,公安计算机应用系统被广泛应用在各警种、各部门。
与此同时,应用系统体系的核心、系统数据的存放地――数据库也随着实际应用而急剧膨胀,一些大规模的系统,如人口系统的数据甚至超过了1000万条,可谓海量。
那么,如何实现快速地从这些超大容量的数据库中提取数据(查询)、分析、统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理员亟待解决的难题。
在以下的文章中,我将以“办公自动化”系统为例,探讨如何在有着1000万条数据的MS SQL SERVER 数据库中实现快速的数据提取和数据分页。
以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构:CREATE TABLE [dbo].[TGongwen] ( --TGongwen是红头文件表名[Gid] [int] IDENTITY (1, 1) NOT NULL ,--本表的id号,也是主键[title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,--红头文件的标题[fariqi] [datetime] NULL ,--发布日期[neibuYonghu] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,--发布用户[reader] [varchar] (900) COLLATE Chinese_PRC_CI_AS NULL ,--需要浏览的用户。
每个用户中间用分隔符“,”分开) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GO下面,我们来往数据库中添加1000万条数据:declare @i intset @i=1while @i<=250000begininsert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-2-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最先的25万条记录')set @i=@i+1endGOdeclare @i intset @i=1while @i<=250000begininsert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-9-16','办公室','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是中间的25万条记录')set @i=@i+1endGOdeclare @h intset @h=1while @h<=100begindeclare @i intset @i=2002while @i<=2003begindeclare @j intset @j=0while @j<50begindeclare @k intset @k=0while @k<50begininsert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(@i as varchar(4))+'-8-15 3:'+cast(@j as varchar(2))+':'+cast(@j as varchar(2)),'通信科','办公室,通信科,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,外事科','这是最后的50万条记录')set @k=@k+1endset @j=@j+1endset @i=@i+1endset @h=@h+1endGOdeclare @i intset @i=1while @i<=9000000begininsert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-5-5','通信科','通信科,办公室,王局长,刘局长,张局长,admin,刑侦支队,特勤支队,交巡警支队,经侦支队,户政科,治安支队,外事科','这是最后添加的900万条记录')set @i=@i+1000000endGO通过以上语句,我们创建了25万条由通信科于2004年2月5日发布的记录,25万条由办公室于2004年9月6日发布的记录,2002年和2003年各100个2500条相同日期、不同分秒的由通信科发布的记录(共50万条),还有由通信科于2004年5月5日发布的900万条记录,合计1000万条。
一、因情制宜,建立“适当”的索引建立“适当”的索引是实现查询优化的首要前提。
索引(index)是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。