Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/zh CN: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Lazarus Database Tutorial/zh CN

OldNewLine
1+## 概述
2+
3+本教程是讲述在Lazarus 下如何为流行的多种数据库开发应用程序。
4+
5+Lazarus 支持多种数据库的‘开箱即用’,当然,开发者必须预先安装要使用的数据库系统。访问数据库,要么通过编写代码实现,要么通过可视化的拖拉控件到窗体来实现。数据感知(data-aware)控件将DataSource 属性指向TDataSource 控件,就能显示数据库字段内容. Datasource 控件将DataSets 属性连接到 database类组件(例如:TPSQLDatabase,TSQLiteDataSet),就能显示表的内容. 数据感知组件位于“数据控制(Data Control)”标签页。数据源(Datasource)和数据库控件位于“数据操作(Data Access)”标签。
6+
7+## Lazarus 和 MySQL
8+
9+### 在Lin或Win下使MySQL工作
10+
11+跟随小麦用户手册的介绍,确认小麦的守护进程(服务)运行可靠,并且所有潜在用户(包括:root、mysql、你自己还有任何需要的人)拥有他们需要的权限,来自多个主机或许(包括‘localhost’,本地主机名,任何其他主机在你的网络上)足够安全。最好包括root在内的所有账户都有密码。用手册中的例子测试数据库系统的动作,并且检查所有用户真的能够可靠存取。
12+
13+### 从FPC文本模式连接MySQL
14+
15+(Get MySQL working for FPC in text mode)
16+
17+(译注:略,请参见英文页面) See [[Lazarus Database Tutorial/SampleListing|Sample Console Listing]].
18+
19+### 从Lazarus程序连接到MySQL
20+
21+该教程显示如何连接辣子到小麦数据库,并且执行一个简单的查询,仅使用基本的辣子组件;这里没有用到数据感知组件,但能更好得阐述连接数据库接口的原理。
22+
23+#### 界面部分
24+
25+在辣子中创建一个新项目:
26+
27+`Project -> New Project -> Application`
28+
29+将出现一个自动生成的窗体。缩放窗体至半个屏幕大小,然后重命名窗体的标题为‘TryMySQL’(译注:随便起个名字,和下面一致就行)。
30+
31+程序界面截图:
32+
33+<figure>
34+<img src="lazarusmysqldb.png" title="lazarusmysqldb.png" />
35+<figcaption>lazarusmysqldb.png</figcaption>
36+</figure>
37+
38+程序界面设计过程如下:
39+
40+自标准组件标签页拖放三个编辑框(Edit Boxes)到表单的左上侧,然后马上给上面每个box一个标签(Label)。改变名字(name)和标题(caption)为‘Host’(还有HostLLabel,HostEdit),‘UserName’(还有UserLabel,UserEdit),‘Password’(在Passwdlabel和PasswdEdit,似乎是具体组件的属性值)。或者你还可以从额外的标签(Additional tab)中使用LabelledEdit组件。
41+
42+选择Passwd Edit按钮,并且找到 PasswordChar 属性:改变它为 * 符号或者类似的字符,这样,当你键入密码时,字符就不会显示在你的屏幕上,而是反映一系列的星号(x)。确认每一个编辑框的Text属性是空的。
43+
44+现在,放置另一个 Edit 盒子,并且label at 在你表单的右上角。改变标签为‘输入SQL命令吧’(Enter SQL Command),然后命名它为CommandEdit。
45+
46+放置三个按钮在表单上:两个在编辑框的左下脚,一个在右侧,命令行的下方。
47+
48+设置左侧的按钮为‘Connect to Database连接数据库’(ConnnectButton)和‘Exit退出’(ExitButton),右侧的按钮为‘Send Query递交查询’(QueryButton)。
49+
50+放置一个大的 备注框(Memo Box)标记命名为‘Results结果’(ResultMemo),在右下脚,填充所有空白位置。找到 ScrollBars(滚动条)属性,并且选择 ssAutoBoth (双向自动)以保证滚动条自动出现,当文本充满空间时。使 WordWrap(分词)属性为真。 (译注:说了这么多,不如先来一张图)
51+
52+放置一个Status Bar(状态条,从 Common Controls tab通用控制标签)到表单底部,命它的 SimpleText 属性为‘TryMySQL’(这个名字前面出现过)。
53+
54+#### 代码部分
55+
56+现在,我们需要写一些事件处理。
57+
58+左侧三个编辑框需要输入主机、用户名和密码。当这些被满意得输入后,点击连接按钮。该按钮的OnCLick 事件程序(event handler)是基于上文中 FPC文本模式中的一部分。(译注:略掉了,还要吗?)
59+
60+The responses from the database cannot now be written using the Pascal write or writeln statements: rather, the replies have to be converted into strings and displayed in the Memo box. Whereas the Pascal write and writeln statements are capable of performing a lot of type conversion 'on the fly', the use of a memo box for text output necessitates the explicit conversion of data types to the correct form of string, so Pchar variables have to be converted to strings using StrPas, and integers have to be converted with IntToStr. 来自数据库的响应现在还不能写,用Pascal写,或者写成(writeln)报表(statements):因为(rather),结果必须被转换为字串并显示在Memo框内。但是Pascal写和writeln语句是……大量类型转换‘,用memo况来显示文本需要详细地转换数据类型,正确的表单字串,所以,Pchar变量必须转换为字串,用 StrPas,整数用IntToStr转换。
61+
62+在Memo框中显示字符串需要:
63+
64+`procedure ShowString (S : string);`\
65+`(* display a string in a Memo box *)`\
66+`begin`\
67+`       trymysqlForm1.ResultsMemo.Lines.Add (S)`\
68+`end;`
69+
70+连接按钮的事件程序于是就成为这样:
71+
72+`procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);`\
73+`(* Connect to MySQL using user data from Text entry boxes on Main Form *)`\
74+`var strg: string;`\
75+`begin`\
76+` dummy1 :=  trymysqlForm1.HostEdit.text+#0;`\
77+` host := @dummy1[1];`\
78+` dummy2 := trymysqlForm1.UserEdit.text+#0;`\
79+` user := @dummy2[1] ;`\
80+` dummy3 := trymysqlForm1.PasswdEdit.text+#0;`\
81+` passwd := @dummy3[1] ;`\
82+` alloc := mysql_init(PMYSQL(@qmysql));`\
83+` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
84+` if sock=Nil then`\
85+`   begin`\
86+`     strg :='Couldn''t connect to MySQL.'; showstring (strg);`\
87+`     Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);`\
88+`  end`\
89+`   else`\
90+`   begin`\
91+`     trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';`\
92+`     strg := 'Now choosing database : ' + database; showstring (strg);`\
93+`{$ifdef Unix}`\
94+`     strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);`\
95+`     strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);`\
96+`{$endif}`\
97+`     Strg :='Host info       : ' + StrPas(mysql_get_host_info(sock));`\
98+`     showstring (strg);`\
99+`     Strg :='Server info     : ' + StrPas(mysql_stat(sock)); showstring (strg);`\
100+`     Strg :='Client info     : ' + Strpas(mysql_get_client_info);  showstring (strg);`\
101+` `\
102+`     trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';`\
103+` if mysql_select_db(sock,DataBase) < 0 then`\
104+` begin`\
105+`   strg :='Couldn''t select database '+ Database; ShowString (strg);`\
106+`   Strg := mysql_error(sock); ShowString (strg);`\
107+` end`\
108+` end;`\
109+`end;`
110+
111+右侧的文本框接下来输入一个SQL语句,末尾没有分号;当你对内容和语法满意时,按下SendQuery按钮,查询开始,结果将会写在ResultsMemo(结果)框内。
112+
113+The SendQuery event handler is again based on the FPC text-mode version, except that once again explicit type-conversion has to be done before strings are displayed in the box.
114+
115+A difference from the text-mode FPC program is that if an error condition is detected, the program does not halt and MySQL is not closed; instead, control is returned to the main form and an opportunity is given to correct the entry before the command is re-submitted. The application finally exits (with closure of MySQL) when the Exit Button is clicked.
116+
117+发送查询(SendQuery)的代码如下:
118+
119+`procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);`\
120+`var`\
121+` dumquery, strg: string;`\
122+`begin`\
123+`     dumquery := TrymysqlForm1.CommandEdit.text;`\
124+`     dumquery := dumquery+#0;`\
125+`     query := @dumquery[1];`\
126+`     trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';`\
127+`     strg := 'Executing query : ' + dumQuery; showstring (strg);`\
128+`     if (mysql_query(sock,Query) < 0) then`\
129+`     begin`\
130+`       Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);`\
131+`     end`\
132+`     else`\
133+`     begin`\
134+`       recbuf := mysql_store_result(sock);`\
135+`       if RecBuf=Nil then`\
136+`       begin`\
137+`         Strg :='Query returned nil result.'; showstring (strg);`\
138+`       end`\
139+`       else`\
140+`       begin`\
141+`         strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));`\
142+`         Showstring (strg);`\
143+`         Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));`\
144+`         showstring (strg);`\
145+`         rowbuf := mysql_fetch_row(recbuf);`\
146+`         while (rowbuf <>nil) do`\
147+`         begin`\
148+`              Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +`\
149+`               rowbuf[2] +')';`\
150+`              showstring (strg);`\
151+`              rowbuf := mysql_fetch_row(recbuf);`\
152+`         end;`\
153+`       end;`\
154+`     end;`\
155+`end;`
156+
157+保存你的项目(Project),并且执行:运行-》运行。
158+
159+- 下载 MYSQL 示例源代码
160+
161+一份完整的程序清单可以从这里获得: [Sample Source Code](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz)
162+
163+### 使用TMySQL50Connection控件连接
164+
165+英文版写的过多,不会翻译,自己写了个代码,不过英文版写的很详细,有兴趣或者会翻译的可以重新编辑一下本段。
166+
167+各个控件的连接方式:
168+
169+一、TMySQL50Connection;
170+
171+二、TSQLTransaction并且Database属性为TMySQL50Connection;
172+
173+三、TSQLQuery且Database属性为TMySQL50Connection、Transaction属性为TSQLTransaction;
174+
175+四、TDatasource的DataSet属性TSQLQuery;
176+
177+五、TDBGrid的Datasource属性为TDatasource
178+
179+ procedure TfrmMain.btnMYSQLClick(Sender: TObject);
180+ begin
181+ try
182+ //conn_mysql5是TMySQL50Connection
183+ conn_mysql5.HostName := '127.0.0.1';//主机
184+ conn_mysql5.UserName := 'root';//登录名
185+ conn_mysql5.Password := '123';//密码
186+ conn_mysql5.CharSet := 'utf8';//如果在MYSQL中建表设置了UTF8,此处也设置,中文显示是正常的
187+ conn_mysql5.DatabaseName := 'test'; //MYSQL的数据库
188+ conn_mysql5.Open;
189+ except
190+ on E: Exception do
191+ begin
192+ ShowMessage('连接出错:' + E.Message);
193+ Exit;
194+ end;
195+ end;
196+ //打开一个表
197+ SQLQuery1.Close;
198+ SQLQuery1.SQL.Text := 'select * from t1';
199+ try
200+ SQLQuery1.Open;
201+ except
202+ on E: Exception do
203+ begin
204+ ShowMessage('打开表出错:' + E.Message);
205+ Exit;
206+ end;
207+ end;
208+ end;
209+
210+## Lazarus 和 PostgreSQL
211+
212+这是一个很简短的教程,针对Lazarus 0.9.12及以后版本,连接到PostgreSQL数据库,本地或远程,使用TPQConnection组件。
213+
214+After correct install, follow these steps:
215+
216+- Place a PQConnection from the SQLdb tab
217+- Place a SQLQuery from the SQLdb tab
218+- Place a SQLTransaction from the SQLdb tab
219+- Place a DataSource from the DataAccess tab
220+- Place a DBGrid from the DataControls tab
221+
222+- In the PQConnection fill in:
223+ - transaction property with the respective SQLTransaction object
224+ - Database name
225+ - HostName
226+ - UserName + password
227+
228+- Check that the SQLTransaction was automatically changed to point to the PQConnection
229+
230+- In the SQLQuery fill in:
231+ - transaction property with the respective object
232+ - database property with respective object
233+ - SQL (something like 'select * from anytable')
234+
235+- In the DataSource object fill in the DataSet property with the SQLQuery object
236+
237+- In the DBGrid fill in the datasource as the DataSource Object
238+
239+Turn everything to connected and active and the DBGrid should be filled in design time. TDBText and TDBEdit seem to work but (for me) they only _show_ _data_.
240+
241+To change contents in the database, I called the DB Engine direct with the following code:
242+
243+` try`\
244+`   sql:= 'UPDATE table SET setting=1';`\
245+`   PQDataBase.Connected:=True;`\
246+`   PQDataBase.ExecuteDirect('Begin Work;');`\
247+`   PQDataBase.ExecuteDirect(sql);`\
248+`   PQDataBase.ExecuteDirect('Commit Work;');`\
249+`   PQDataBase.Connected:=False;`\
250+` except`\
251+`   on E : EDatabaseError do`\
252+`     MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
253+`   on E : Exception do`\
254+`     MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
255+` end;`
256+
257+- 备注:
258+ - Tested on windows, Lazarus 0.9.12 + PgSQL 8.3.1
259+ - Some tests in linux, Lazarus 0.9.12 and PgSQL 8.0.x
260+
261+- Instalation and errors:
262+ - In the tested version of Lazarus .12, fields of type "text" and "numeric" have bugs
263+ - I used with no problems char fixed size, int and float8
264+ - Sometimes restarting Lazarus solves stupid errors...
265+ - After some errors, the transactions remain active and should be deactivated mannually
266+ - Changes made in Lazarus are of course not visible until transaction commited
267+ - The integrated debugger seems buggy (at least in windows) - sometimes running outside of the IDE may help to find errors
268+ - In linux certain error messages are printed in the console -- run your program in the command line, sometimes there is some extra useful debugging info
269+ - Error: "Can not load Postgresql client. Is it installed (libpq.so) ?"
270+ - Add the path to seach libpq* from the PostgreSQL installation.
271+ - In linux add the path to the libpq.so file to the libraries section in your /etc/fpc.cfg file. For example : -Fl/usr/local/pgsql/lib
272+ - In windows, add these libs anywhere in the Path environment variable or project dir
273+ - I windows, I copied all the DLLs in my C:\Program Files\PostgreSQL\8.1\bin dir to another dir in the PATH
274+ - Or add this postgres\bin dir to the path
275+
276+## Lazarus and SQLite
277+
278+by Luiz Américo
279+
280+Visit the [sqlite4fpc homepage](http://www.geocities.com/camara_luiz/) to find the API reference and more tutorials.
281+
282+### Introduction
283+
284+TSqliteDataset and TSqlite3Dataset are TDataset descendants that access, respectively, 2.8.x and 3.x.x sqlite databases. Below is a list of the principal advantages and disadvantages:
285+
286+Advantages:
287+
288+- Flexible: programmers can choose to use or not to use the SQL language, allowing them to work with simple table layouts or any complex layout that SQL/sqlite allows
289+- Automatic database update: no need to update the database manually with SQL statements, a single method take cares of it
290+- Fast: it caches the data in memory, making browsing in the dataset fast
291+- No server installation/configuration: just ship together with sqlite dynamic library
292+
293+Disadvantages
294+
295+- Requires external file (sqlite library)
296+
297+### Requirements
298+
299+- For sqlite2 databases:
300+ - fpc 2.0.0
301+ - Lazarus 0.9.10
302+ - sqlite runtime library 2.8.15 or above (get from www.sqlite.org)
303+
304+- For sqlite3 databases:
305+ - fpc 2.0.2
306+ - Lazarus 0.9.11 (svn revision 8443 or above)
307+ - sqlite runtime library 3.2.1 or above (get from www.sqlite.org)
308+
309+**Before initiating a lazarus projects, ensure that:**
310+
311+- the sqlite library is on the system PATH or in the executable directory
312+- under Linux, put cmem as the first unit in uses clause of the main program
313+
314+### How To Use (Basic Usage)
315+
316+Install the package found at /components/sqlite directory (see instructions [[Install Packages|here]])
317+
318+At design time set the following properties:
319+
320+- FileName: path of the sqlite file \[required\]
321+- TableName: name of the table used in the sql statement \[required\]
322+- Sql: a SQL select statement \[optional\]
323+
324+**Creating a Table (Dataset)**
325+
326+Double click in the component icon or use the 'Create Table' item of the popup menu that appears when clicking the right mouse button. A simple self-explaining table editor will be show.
327+
328+` Here is all field types supported by TSqliteDataset and TSqlite3Dataset: `\
329+` `\
330+` Integer`\
331+` AutoInc`\
332+` String`\
333+` Memo`\
334+` Bool `\
335+` Float`\
336+` Word`\
337+` DateTime`\
338+` Date`\
339+` Time`\
340+` LargeInt`\
341+` Currency`\
342+` `
343+
344+**Retrieving the data**
345+
346+After creating the table or with a previously created Table, open the dataset with Open method. If the SQL property was not set then all records from all fields will be retrieved, the same if you set the SQL to:
347+
348+` SQL:='Select * from TABLENAME'; `
349+
350+**Applying changes to the underlying datafile**
351+
352+To use the ApplyUpdates function, the dataset must contain at least one field that fills the requirements for a Primary Key (values must be UNIQUE and not NULL)
353+
354+It's possible to do that in two ways:
355+
356+- Set PrimaryKey property to the name of a Primary Key field
357+- Add an AutoInc field (This is easier since the TSqliteDataSet automatically handles it as a Primary Key)
358+
359+If one of the two conditions is set then just call
360+
361+` ApplyUpdates;`
362+
363+PS1: If both conditions are set, the field corresponding to PrimaryKey is used to apply the updates.
364+
365+PS2: Setting PrimaryKey to a field that is not a Primary Key will lead to loss of data if ApplyUpdates is called, so ensure that the chosen field contains not Null and Unique values before using it.
366+
367+### Remarks
368+
369+- Although it has been tested with 10000 records and worked fine, TSqliteDataset keeps all the data in memory, so remember to retrieve only the necessary data (principally with Memo Fields).
370+- The same datafile (Filename property) can host several tables/datasets
371+- Several datasets (different combinations of fields) can be created using the same table simultaneously
372+- It's possible to filter the data using WHERE statements in the sql, closing and reopening the dataset (or calling RefetchData method). But in this case, the order and number of fields must remain the same
373+- It's also possible to use complex SQL statements using aliases, joins, views in multiple tables (remember that they must reside in the same datafile), but in this case ApplyUpdates won't work. If someone wants to use complex queries and to apply the updates to the datafile, mail me and I will give some hints how to do that
374+- Setting filename to a sqlite2.x datafile not created by TSqliteDataset and opening it is allowed but some fields won't have the correct field type detected. These will be treated as string fields.
375+
376+Generic examples can be found at fpc/fcl/db/sqlite CVS directory
377+
378+Luiz Américo pascalive(at)bol(dot)com(dot)br
379+
380+## Lazarus and MSSQL
381+
382+It is working with Zeoslib (latest cvs), see the links on bottom of page.
383+
384+## Lazarus and Interbase / Firebird
385+
386+See [[Install Packages]]. On this page is a first small example en explanation about how to connect to an IB or FB server.
387+
388+Also work with the latest Zeoslib (from cvs).
389+
390+### FBLib Firebird Library
391+
392+[1](http://fblib.altervista.org/%7CFBLib) is an open Source Library No Data Aware for direct access to Firebird Relational Database from Borland Delphi / Kylix, Freepascal and Lazarus.
393+
394+Current Features include:
395+
396+- Direct Access to Firebird 1.0.x 1.5.x Classic or SuperServer
397+- Multiplatform \[Win32,Gnu/Linux,FreeBSD)
398+- Automatic select client library 'fbclient' or 'gds32'
399+- Query with params
400+- Support SQL Dialect 1/3
401+- LGPL License agreement
402+- Extract Metadata
403+- Simple Script Parser
404+- Only 100-150 KB added into final EXE
405+- Support BLOB Fields
406+- Export Data to HTML SQL Script
407+- Service manager (backup,restore,gfix...)
408+- Events Alerter
409+
410+You can download documentation on [FBLib's website](http://fblib.altervista.org/).
411+
412+## Lazarus 和 dBase
413+
414+Tony Maro: You might also want to visit the beginnings of the [[Lazarus Tdbf Tutorial|TDbf Tutorial page]] (译注:略,建议另开新页)
415+
416+## Related Links
417+
418+- [[Databases|Creating Databases Applications with Lazarus using the DB-unit]]\
419+- [[MySQLDatabases|Creating a database application using MySQL]]\
420+- [[Zeos tutorial|Creating a database application using the Zeos components]]
421+- [Pascal Data Objects](http://pdo.sourceforge.net) is a database API that worked for both FPC and Delphi and utilises native MySQL libraries for version 4.1 and 5.0 and Firebird SQL 1.5, and 2.0. It's inspired by PHP's PDO class.
422+
423+## Contributors and Changes
424+
425+This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusDatabase).
426+
427+---
428+*From the Free Pascal wiki, page "Lazarus Database Tutorial/zh CN", as it stood on 2011-10-03 after a change by Lioncn, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
429+Category: zh

Back to history