第一章
数据库疑难短问短答(一)
★、我建立了启动窗口,并添加了一个连接到数据库的按钮,想连接到自己建的数据库上。 在写命令是是抄袭例程的。输入“如果真 (外部数据库1.打开 (, ))”, 但系统提示无此容器,怎么解决?应该在什么位置定义容器?
西风:外部数据库是一个控件,你得先添加到窗口中去。
★、我的数据库中有10000条记录,如果创建索引的话,能加快记录的查找速度吗?
西风:绝对能。尤其是对记录数很多的数据库,那速度对比绝对非常明显的。注意创建索引后,要用“索引查找()”,如果继续用“查找()”,那…………
你可以在数据库打开时就打开索引,至于创建索引么,随你什么时候了。用易的数据库编辑器都可以。 反正你要做的就是保证在需要用索引的时候,它已经创建并打开。
★、请问数据库常量中的用户习惯是什么意思?
小米虫:就是你最后一次打开的数据库。
★、我在写记录的时候遇到下面的问题,麻烦给我讲一下是为什么呢?
1: 计次循环首 (图片列表框.取项目数 (), 图片数目)
加记录 (图片列表框.取项目文本 (图片数目 - 1))
计次循环尾 ()
2: 计次循环首 (图片列表框.取项目数 (), 图片数目)
写 (图片数目,图片列表框.取项目文本 (图片数目 - 1))
计次循环尾 ()
3: 计次循环首 (图片列表框.取项目数 (), 图片数目)
写字段(图片数目,,图片列表框.取项目文本 (图片数目 - 1))
计次循环尾 ()
除了第一句以外.后面两个操作都没有加入记录,是为什么呢?我的当前数据库里面有记录的。
世恒:加纪录()在操作时加入一条纪录
写()必须对已存在的纪录操作,不能加入纪录,可以先加入空纪录,再用写操作
写字段()用法同“写()” 。
★、我在写记录的时候遇到下面的问题,麻烦给我讲一下是为什么呢?
1: 计次循环首 (图片列表框.取项目数 (), 图片数目)
加空记录()
写 (图片数目,图片列表框.取项目文本 (图片数目 - 1))
计次循环尾 ()
为什么只能写一个记录呢?
猛子:
计次循环首 (列表框1.取项目数 (), 图片数目)
加空记录 ()
写 (1, 列表框1.取项目文本 (图片数目 - 1))
计次循环尾 ()
〈逻辑型〉 写 (字段名称或位置,[欲写入数据])第一个参数是字段名,不是行号 。
★、我想做一个数据库浏览器,可以象列表一样一行行的列出来,而且当前位置可以反色。 我应该有什么方法?或者有什么列程吗?大家一定要帮帮忙呀,我先谢了!
Candy:使用表格,数据源,数据库提供者控件实现,可以看E自带的表格教程。
★、表格的数据源如何确定和如何打印表格?譬如一个“易”数据库,如何把它作为表格显示在窗口上?又如何打印出来?
猛子:表格1.打印预览
飞扬工作室:看一下"易之表"里面的对应代码。
★、易语言的数据库用记事本就可以打开,并且可以修改数据。虽然格式不同于记事本,感觉这样不很安全。 能否在以后做上一些加密措施?
tianyu1398:现在可以自己加密呀.我昨天解决好了这个问题,把源程序帖在论坛了http://eyuyan.com/cgi-bin/lb5000/topic.cgi?forum=1&topic=3240&show=25
★、我要做一个客房管理的东东,是一个房间做一个库好还是全部房间都用一个库,或者还有其他的方法,能不能指点一下?
世恒:那就根据实际情况,但一般来说建一个库就差不多了。
★、怎要怎样把数据表格里的记录按符合条件记录重新显示在表格里?
西风:易的表格目前好象不支持条件筛选的。只能显示库中所有记录。笨办法是:先对数据库进行条件筛选,生成另外一个临时数据库,再在表格中显示临时数据库的内容。
世恒: 下载“世恒婚介管理系统“看看,里面有相关方法!
★、 易程序的表格文件能否转化为其他文件,比如edb文件,txt文件,mdb文件,xls文件。如果能够转化,应该如何转化,我认为至少应该可以转化我edb文件,以及txt文件,这样我才能够将表格文件转化我其他支持txt文件转化的文件格式,比如mdb文件。
飞扬工作室:所有数据提供者之间的数据格式都可以互相转换。比如将表格文件转换为edb,你可以通过将通用提供者中的数据添加到数据库提供者中即可。
★、在已有数据的表格里,怎样把表格里的数据清除后,再把数据库里符合条件的记录一条一条的加在表格里?
猛子:去看看《学生管理系统2.1》,那里边就有。
数据库疑难短问短答(二)
★、将所有局部容器都设置为全局容器,这样可以随时调用,对程序运行有影响吗?
bb88:有影响,比如你找一个空间存放运行你的程序,假如全局变量过多,空间商会取消你的空间。
西风:占用的内存资源: 全局容器>程序集容器>局部容器。不到万不得已,还是用局部容器好。
jak:太多的全局变量会使程序运行缓慢,比如说循环一个有50个字段10000条记录的数据库,呵呵。尽量使用局部变量或者程序集变量,可以不使用变量的最好就不使用。
★、请问如何查找一个字? 也就是说要查找一个字,第一个字,第二个字的项目也要列出。
xuexiyi:请参考《区号邮编易查询》。
★、子程序:__启动窗口_创建完毕
打开 (#shi数据库, , , , , , )
判断循环首 (取反 (尾记录后 ()))
列表框1.加入项目 (读 (1), 取记录号 ())
跳过 ()
判断循环尾 ()
※就是讲一下,它的运行方法,和作用,我没有理解到。谢谢。
电脑狂:我下面的子程序跟你那个子程序是等效的,只是各人使用的习惯不一样罢了,建议最好使用你说的那个, 因为可以不用定义局部容器,她的好处都明白了?
子程序2
局部容器:容器1 数据类型:整数型
容器1 = 1
计次循环首 (取记录数 (), 容器1)
跳到 (容器1)
列表框1.加入项目 (读 (1), 容器1)
计次循环尾 ()
※再来解释“判断循环首 (取反 (尾记录后 ()))”这一句:
判断循环首(条件):
本命令根据提供的逻辑参数的值,来决定是否进入循环。如果提供的逻辑参数值为真,程序顺序执行下一条命令进入循环,否则跳转到本命令所对应的“判断循环尾”命令的下一条命令处以跳出循环。
取反 (被反转的逻辑值):
如果参数值为真则返回假,如果参数值为假则返回真。
尾记录后 ():
如果当前数据库的当前记录指针已在尾记录的后面,返回真,否则返回假。
判断循环首 (取反 (尾记录后 ())):
意思是:如果当前记录指针没有在尾记录的后面,就执行循环。
例如:库中共有50条记录,现在当前记录指针指向第30号记录,那么,“尾记录后 ()”就等于“假”,而“取反 (尾记录后 ())”就等于“真”,执行循环体。OK?
西风:呵呵,“判断循环首(取反(尾记录后()))”的意思就是:“判断循环首(尾记录后()=假)” 。就是判断当前记录是否已到了数据库尾。各人的喜欢而已,我就比较喜欢用后者。
★、"将数据通过数据源导出到通用提供者中",请大虾说说如何实现?谢谢!
pingwind:易之表例程中的"浏览数据库"就是那么做的。直接运行E,选该例程,或者打开E目录下的“egrid.e”即可。
★、如何能实现“数据库”的排序?
西风:易语言自己就有数据库排序命令,其实我觉得易语言知识库对我帮助还是挺大的,去找一找吧。
★、请教易语言的数据库中有没有象VFP中的LIST命令,或者类似的,能直接完整的
显示数据库的内容的命令或方法?
大伟:数据库提供者1.数据库文件名 = “xxx.edb”这句话算不算?
jak:呵呵,“表格”控件就是LIST吧。
★、哪位大侠写过打印数据库程序的请给小弟推荐一个?不是打印表格,是按记录一个一个打印。
电脑狂:《通用库管理器28》,交流园地和我的主页上都有。
★、下面一段程序是删除当前记录的。请问为什么要在后面加“数据库提供者1.数据库文件名 = “chj.edb”才能真正删除该数据库中的当前记录?当后面没有这一句时,不会删除当前记录,而是变当前记录为空记录。程序如下:
子程序名:_删除按钮_被单击
删除 ()
彻底删除 ()
编辑框1.内容 = “” (清除该字段的内容)
编辑框2.内容 = “”
编辑框3.内容 = “”
编辑框1.获取焦点 ()
数据库提供者1.数据库文件名 = “chj.edb”
大伟:数据库提供者1.数据库文件名 = “chj.edb” 是对数据库进行重新刷新。程序中处理完记录后,采用此此语句可使记录得到同步更新,在对表格进行操作时,这种现象最明显。用按钮来删除跟“数据源”中的一个删除功能没有冲突。
★、我的程序有下面句子:
打开 (#aaa数据库, , , , , , )
运行 (读 (地址1), 假, )
但“运行 (读 (地址1), 假, )”并不执行,提示“错误(20003):现行容器或参数不能接受空数据”,为什么?
世恒:问题是你没有定义常量值,却又调用常量。比如没有在常量表中将qidong数据库的常量值命名为“qidong”之类,所以就成了所谓的“空数据”。 我在其中加入的标签是用来验证是否读取了数据库,你可以删掉,并将代码中所有有标签1的地方删去。
★、不好意思,哪位老师请告诉我,怎样全部显示数据库的内容?请给例程。
世恒:例程 http://www.zgjg.com/download/help/data.zip
数据库疑难短问短答(三)
★、软件中用到了数据库,我想让它在数据库更新以后马上刷新读取。所以用了(当窗口激活)的子程序,但是不知为何没有作用,现在只能变通的用一个时钟来让它定时刷新。谁能够帮帮我。
浪花:刷新我觉得好象没有用的。最正确的你应该是先关闭数据库,然后再打开,这样,比你用刷新的效果肯定要好得多。
湖海书生:用“写出缓存”。有时刚录入的数据就查询修改的话,可能数据库中没有。
★、怎么跳到数据库中的任意记录? 例如:数据库中有100条记录,当选择了跳到第5条记录后,数据库自动显示第5条记录。
iceroy :http://eyuyan.com/non-cgi/icon/zip.gif
★、怎样插入数据库记录? 例如:数据库中有5条记录,我想在2-3之中插入一条记录,使这记录号等于3,而原来的记录向后移一位, 等于4。以后的记录以此类推。
电脑狂:通用库管理器28中,你想要的都有。
★、有谁知道, 怎样用命令行方式直接存取备注字段(不用易自带的记录编辑器)? 谢谢!
Candy:字节集操作应该自动存取备注段。
★、为什么我在进行任一范围内复制记录时,复制后的库中会有空记录,(检查后发现是有一些记录没有复制上。)我的语句是这样写的:复制记录 (“库”,取记录数()-取记录号 ()<=30,)
世恒:
判断循环首(到尾纪录后())
复制记录 (“库”,取记录数()-取记录号 ()<=30,)
跳过(1)
判断循环尾()
————————————————————————————
雨点:
打开(数据库1,,,,,,) *此数据库为欲查找内容的库*
置当前库(数据库1)
复制结构(数据库2,所需字段) *此数据库为查找后的库*
打开(数据库2,,,,,,)
置当前库(数据库2)
清空()
添加(数据库1,条件语句,所需字段)
电脑狂:复制记录 (“库.edb”, 取记录号 () ≥ 2 且 取记录号 () ≤ 4, )
“取记录数()-取记录号 ()<=30”这条语句有问题,分析一下不难看出,执行后始终复制的是最后30个记录。
★、我的程序中有个将(数据库1)中例如以“单位”为字段,其中有“单位A”96个记录,“单位B”148个记录,“单位C”78个记录,“单位D”39个记录,这些记录都是穿插输入的。假如我以查找“单位B”且将“单位B”的所有记录复制到(数据库2)中,记录数148个是对的,可在后面有很多是空白记录。请各位高手们指点该如何处理。
iceroy:
判断循环首(到尾记录后())
复制记录(“库”,取记录数()-取记录号()<=30)
跳过(1)
判断循环尾()
另外,你可用一个编辑框和一个通用对话框。编辑框的内容=通用对话框的文件名然后再用复制记录() 命令,当然编辑框的内容(通用对话框的文件名)就是“数据库2”,这样就能将数据库复制。
电脑狂:
排序 (“数据库2.edb”, “单位”, , , )
打开 (“数据库2”, , , , , , )
置当前库 (“数据库2”)
删除 (读 (“单位”) ≠ “单位B”)
彻底删除 ()
编辑 (, , )
★、易数据库没有自动列表功能吗?就像电子表格一样的一个字段占一列的样子。怎么办哪?
雨点:
我给个例程于你试试,
窗口程序集:窗口程序集1
程序集容器:横线 数据类型:文本型
程序集容器:左线 数据类型:文本型
程序集容器:右线 数据类型:文本型
程序集容器:十线 数据类型:文本型
程序集容器:上左 数据类型:文本型
程序集容器:上右 数据类型:文本型
程序集容器:中左 数据类型:文本型
程序集容器:中右 数据类型:文本型
程序集容器:z 数据类型:文本型
程序集容器:倒丁 数据类型:文本型
程序集容器:丁线 数据类型:文本型
程序集容器:x 数据类型:文本型
程序集容器:w 数据类型:文本型
子程序:_按钮1_被单击
对话框.类型 = 0
对话框.初始目录 = 取当前目录 ()
打开 (对话框.文件名, “XS”, , , , , )
显示 ()
------------------------------
子程序:显示
局部容器:n 数据类型:整数型
局部容器:y 数据类型:文本型
编辑框2.内容 = “”
置当前库 (“XS”)
到首记录 ()
表格 ()
计次循环首 (取记录数 (), n)
y = y + 中右 + 取重复文本 (取字段尺寸 (1) ÷ 2, 横线) + 十线 + 取重复文本 (取字段尺寸 (2) ÷ 2, 横线) + 十线 + 取重复文本 (取字段尺寸 (3) ÷ 2, 横线) + 十线 + 取重复文本 (取字段尺寸 (4) ÷ 2, 横线) + 十线 + 取重复文本 (取字段尺寸 (5) ÷ 2, 横线) + 十线 + 取重复文本 (取字段尺寸 (6) ÷ 2, 横线) + 十线 + 取重复文本 (取字段尺寸 (7) ÷ 2, 横线) + 中左 + #换行符 + “│” + 读 (1) + 取空白文本 (取字段尺寸 (1) - 取文本长度 (读 (1))) + “│” + 读 (2) + 取空白文本 (取字段尺寸 (2) - 取文本长度 (读 (2))) + “│” + 读 (3) + 取空白文本 (取字段尺寸 (3) - 取文本长度 (读 (3))) + “│” + 读 (4) + 取空白文本 (取字段尺寸 (4) - 取文本长度 (读 (4))) + “│” + 读 (5) + 取空白文本 (取字段尺寸 (5) - 取文本长度 (读 (5))) + “│” + 读 (6) + 取空白文本 (取字段尺寸 (6) - 取文本长度 (读 (6))) + “│” + 读 (7) + 取空白文本 (取字段尺寸 (7) - 取文本长度 (读 (7))) + “│” + #换行符
跳到 (n + 1)
计次循环尾 ()
x = x + 右线 + 取重复文本 (取字段尺寸 (1) ÷ 2, 横线) + 丁线 + 取重复文本 (取字段尺寸 (2) ÷ 2, 横线) + 丁线 + 取重复文本 (取字段尺寸 (3) ÷ 2, 横线) + 丁线 + 取重复文本 (取字段尺寸 (4) ÷ 2, 横线) + 丁线 + 取重复文本 (取字段尺寸 (5) ÷ 2, 横线) + 丁线 + 取重复文本 (取字段尺寸 (6) ÷ 2, 横线) + 丁线 + 取重复文本 (取字段尺寸 (7) ÷ 2, 横线) + 左线 + #换行符
w = w + “│” + 取空白文本 ((取字段尺寸 (1) - 取文本长度 (取字段名 (1))) ÷ 2) + 取字段名 (1) + 取空白文本 ((取字段尺寸 (1) - 取文本长度 (取字段名 (1))) ÷ 2) + “│” + 取空白文本 ((取字段尺寸 (2) - 取文本长度 (取字段名 (2))) ÷ 2) + 取字段名 (2) + 取空白文本 ((取字段尺寸 (2) - 取文本长度 (取字段名 (2))) ÷ 2) + “│” + 取空白文本 ((取字段尺寸 (3) - 取文本长度 (取字段名 (3))) ÷ 2) + 取字段名 (3) + 取空白文本 ((取字段尺寸 (3) - 取文本长度 (取字段名 (3))) ÷ 2) + “│” + 取空白文本 ((取字段尺寸 (4) - 取文本长度 (取字段名 (4))) ÷ 2) + 取字段名 (4) + 取空白文本 ((取字段尺寸 (4) - 取文本长度 (取字段名 (4))) ÷ 2) + “│” + 取空白文本 ((取字段尺寸 (5) - 取文本长度 (取字段名 (5))) ÷ 2) + 取字段名 (5) + 取空白文本 ((取字段尺寸 (5) - 取文本长度 (取字段名 (5))) ÷ 2) + “│” + 取空白文本 ((取字段尺寸 (6) - 取文本长度 (取字段名 (6))) ÷ 2) + 取字段名 (6) + 取空白文本 ((取字段尺寸 (6) - 取文本长度 (取字段名 (6))) ÷ 2) + “│” + 取空白文本 ((取字段尺寸 (7) - 取文本长度 (取字段名 (7))) ÷ 2) + 取字段名 (7) + 取空白文本 ((取字段尺寸 (7) - 取文本长度 (取字段名 (7))) ÷ 2) + “│” + #换行符
z = z + 上右 + 取重复文本 (取字段尺寸 (1) ÷ 2, 横线) + 倒丁 + 取重复文本 (取字段尺寸 (2) ÷ 2, 横线) + 倒丁 + 取重复文本 (取字段尺寸 (3) ÷ 2, 横线) + 倒丁 + 取重复文本 (取字段尺寸 (4) ÷ 2, 横线) + 倒丁 + 取重复文本 (取字段尺寸 (5) ÷ 2, 横线) + 倒丁 + 取重复文本 (取字段尺寸 (6) ÷ 2, 横线) + 倒丁 + 取重复文本 (取字段尺寸 (7) ÷ 2, 横线) + 上左
编辑框2.内容 = x + w + y + z
x = “”
w = “”
z = “”
子程序:表格
横线 = “─”
左线 = “┐”
右线 = “┌”
十线 = “┼”
上左 = “┘”
上右 = “└”
中左 = “┤”
中右 = “├”
倒丁 = “┴”
丁线 = “┬”
其中字段可根据自己的需要而设
整齐显示所有记录
多记录浏览在数据库应用程序中是常常用到的,它给数据的查询、统计、汇总等带来方便。
这一讲仍然以一个简单的学生成绩总表来作例程,让大家了解如何整齐地显示所有数据。
★、第一步:规划用户界面。
⑴、画一个大大的编辑框用来显示所有记录。
⑵、在编辑框上方排一行5个标签。
⑶、画一个按钮。
★、第二步:设置对象属性。
五个标签的标题分别是“学号”、“姓名”、“语文”、“数学”、“英语”,五个标签的宽度与编辑框等宽,均匀地排列在编辑框上方。按钮的标题是“显示”。将编辑框设置纵向滚动条。
★、第三步:编写事件过程代码。
子程序:_按钮1_被单击
局部容器:容器1 数据类型:整数型
局部容器:容器2 数据类型:整数型
打开 (#chj数据库, , , , , , )
置当前库 (“chj”)
标签2.标题 = 到文本 (取记录数 ())
标签4.标题 = 到文本 (取字段数 ())
计次循环首 (取记录数 (), 容器1)
计次循环首 (取字段数 (), 容器2)
编辑框1.加入文本 (取文本左边 (到文本 (读字段 (容器2, )) + 取空白文本 (12), 12))
计次循环尾 ()
编辑框1.加入文本 (#换行符)
跳过 ()
计次循环尾 ()
关闭 (#chj数据库)
按钮1.禁止 = 真
※、程序解析:这一子程序用到了较复杂的区块循环(循环之内又有循环),其流程如下——
⑴、先执行的是下面这个循环:
计次循环首 (取字段数 (), 容器2)
编辑框1.加入文本 (取文本左边 (到文本 (读字段 (容器2, )) + 取空白文本 (12), 12))
计次循环尾 ()
上面的循环的意思是:
先在编辑框加上首记录的字段1的文本,再进入循环依次加入字段2、字段3、字段4、字段5的文本,循环次数等于字段总数。
⑵、为了使各字段整齐地显示出来,用这个代码:编辑框1.加入文本 (取文本左边 (到文本 (读字段 (容器2, )) + 取空白文本 (12), 12)) 。它的意思是每次循环(每加入一个字段的文本)加入的文本总字符数是12字节(包括空白字符),加入的空白字符数最多是12字节,这样即使该字段没有文字,其所占的位置仍然是12字节。这样各字段的文本就会整齐地显示在编辑框里。
⑶、添加完某记录的各字段文本后再换行,然后用“跳过 ()”指向下一记录再进入大循环,即依次循环到下一记录(循环次数等于记录总数),再依次添加各字段文本。
★、第四步:运行测试程序。
假设用“编辑框1.加入文本 (到文本 (读字段 (容器2, )))”代替上面“编辑框1.加入文本 (取文本左边 (到文本 (读字段 (容器2, )) + 取空白文本 (12), 12))
”,试比较一下显示效果会怎样。
记录的显示、增删和跳转
我们说过用数据提供者、数据源等控件配合可以自动生成记录显示的程序界面,虽然很方便,但它们能实现的功能还是有限的,灵活性也不够。比如,删除数据就直接删了,连个提示信息都没有,而正规一点的程序都应先弹出一个警告框,问你是否真的要删除数据。
所以这一讲,我们就来看看不用数据源、报表等控件怎样实现记录的显示、增删与跳转。我们会给删除按钮补充一个信息框,先询问你是否真的要删除数据,“添加”按钮给补充一个获得焦点语句使其在确认添加后能将焦点(这里指的就是光标)移到第一个编辑框上。这样就使数据的输入变得方便了。下面我们就来看看所需要的功能是如何实现的,继续沿用前面课程的学生成绩管理库(“chj.edb”)作为例库。
★、界面设计
在启动窗口上放上名称分别为“学号编辑框”、“姓名编辑框”、“语文编辑框”、“数学编辑框”和“英语编辑框”这五个编辑框(数据处理者),用来输入数据或显示记录的各个字段。再在下方放上标题为“添加”、“删除”、“更新”、“退出”、“首记录”、“向前”、“向后”、“尾记录”这八个按钮,名称分别是“添加按钮”、“删除按钮”、“更新按钮”、“退出按钮”、“首记录按钮”、“向前按钮”、“向后按钮”、“尾记录按钮”。
★、功能实现
㈠、数据记录的显示
我们在这里先设置载入程序界面时就显示首记录,并且使第一个编辑框获得焦点。子程序如下:
子程序:__启动窗口_创建完毕
打开 (#chj数据库, , , , , , )
※ 打开数据库时默认(初始)的记录指针在首记录上
置当前库 (“chj”)
学号编辑框.获取焦点 ()
填充 ()
具体实现首记录的显示要调用填充子程序。为什么要把首记录的显示另外放一个子程序呢?直接在“__启动窗口_创建完毕”子程序里放置显示记录的代码不就行了吗?原因是在其他子程序里也要显示运行后的结果(显示当前记录),所以我们把显示记录的代码另外做一个模块(子程序),以供各个子程序调用,也方便以后的修改维护。尤其是大型程序,当多个子程序都有相同的代码的时候,我们最好把这些代码另组模块来调用。在软件工程中,模块分析和建立是非常重要的,在这里我们也要学习一下。显示数据记录的子程序如下:
子程序:填充
如果真 (首记录前 () 或 尾记录后 ())
※ 判断记录指针是否到了首记录前面或超过了尾记录
连续赋值 (“”, 学号编辑框.内容, 姓名编辑框.内容, 语文编辑框.内容, 数学编辑框.内容, 英语编辑框.内容)
返回 ()
如果真结束
学号编辑框.内容 = 到文本 (读 (1))
※用编辑框来显示记录字段
姓名编辑框.内容 = 读 (2)
语文编辑框.内容 = 到文本 (读 (3))
数学编辑框.内容 = 到文本 (读 (4))
英语编辑框.内容 = 到文本 (读 (5))
㈡、数据记录的删除
在删除记录的子程序中,我们要做几样工作:先给要删除的记录加上删除标记,再彻底删除,然后清空该记录显示,再使第一个编辑框获得焦点以方便再次输入数据,在删除之前给予提醒,让你决定是否真的删除。子程序如下:
子程序:_删除按钮_被单击
如果真 (信息框 (“警告!你真的要删除该数据吗?删除了就不可恢复,造成严重经济损失本人概不负责,望三思!”, 52, “警告!”) = 5)
删除 () ※ 给要删除的记录加上删除标记
彻底删除 ()
连续赋值 (“”, 学号编辑框.内容, 姓名编辑框.内容, 语文编辑框.内容, 数学编辑框.内容, 英语编辑框.内容)
学号编辑框.获取焦点 ()
如果真结束
㈢、修改数据记录
修改记录的命令格式是:修改 ([修改数据],… )。子程序如下:
子程序:_更新按钮_被单击
如果 (修改 (文本到数值 (学号编辑框.内容), 姓名编辑框.内容, 文本到数值 (语文编辑框.内容), 文本到数值 (数学编辑框.内容), 文本到数值 (英语编辑框.内容)) = 假)
信息框 (“修改失败!”, 4, “失败”)
否则
信息框 (“修改成功!”, 4, “成功”)
如果结束
㈣、到首记录(将记录指针移到首记录)
到首记录的语句是:到首记录 ()。子程序如下:
子程序:_首记录按钮_被单击
到首记录 ()
填充 () ※ 显示首记录各字段
㈤、到尾记录
子程序:_尾记录按钮_被单击
到尾记录 ()
填充 () ※ 显示尾记录各字段
㈥、向前
将当前数据库中当前记录指针向前移动一条记录,并显示。移动记录的语句是:跳过 ([欲跳过的记录数])。该命令的默认值为 1 ,即向后移动一条记录。子程序如下:
子程序:_向前按钮_被单击
如果真 (取记录号 () > 1)
※ 使记录指针不要移到首记录之前
跳过 (-1)
※ “-1”表示指针向前移动一条记录
填充 ()
※ 显示指针移动的记录的各个字段
如果真结束
㈦、向后
子程序:_向后按钮_被单击
如果真 (取记录号 () < 取记录数 ())
※ 使记录指针不会超出尾记录
跳过 ()
※ 该命令的默认值为 1 ,即向后移动一条记录
填充 ()
如果真结束
㈧、添加数据记录
为了不用多开一个窗口来添加记录,我们加上判断:当添加按钮的标题为“添加”时就清空编辑框以便输入添加的数据,然后使添加按钮的标题变为“保存”。当添加按钮的标题变为“保存”时就添加记录。添加记录也最好加上提示信息。子程序如下:
子程序:_添加按钮_被单击
如果 (添加按钮.标题 = “添加”)
添加按钮.标题 = “保存”
学号编辑框.获取焦点 ()
连续赋值 (“”, 学号编辑框.内容, 姓名编辑框.内容, 语文编辑框.内容, 数学编辑框.内容, 英语编辑框.内容)
否则
如果 (加记录 (文本到数值 (学号编辑框.内容), 姓名编辑框.内容, 文本到数值 (语文编辑框.内容), 文本到数值 (数学编辑框.内容), 文本到数值 (英语编辑框.内容)) = 假)
信息框 (“添加记录失败!”, 0, “添加失败”)
否则
信息框 (“已成功添加为尾记录”, 0, “添加成功”)
如果结束
如果结束
(例程下载:http://www.91asp.com/bbs.nsf/c53885e4b38488454825681f0035243d/88fbcd16567942de48256bef0024560c/$FILE/_l2f5fq4turk9svl0jpav0_.zip )
一些数据库的接连代码,实现无DSN连接
用DSN连接比较麻烦,下面是一些数据库的接连代码,希望对大家有用。
MS Access ODBC DSNless 连接
Driver={Microsoft Access Driver (*.mdb)};Dbq=c:\somepath\dbname.mdb;Uid=Admin;Pwd=pass;
dBase ODBC DSNless 连接
Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\somepath\dbname.dbf;
Oracle ODBC DSNless 连接
Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=admin;Pwd=pass;
MS SQL Server DSNless 连接
Driver={SQL Server};Server=servername;Database=dbname;Uid=sa;Pwd=pass;
MS Text Driver DSNless 连接
Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist Security Info=False;
Visual Foxpro DSNless 连接
Driver={Microsoft Visual FoxPro Driver};SourceType=DBC;SourceDB=c:\somepath\dbname.dbc;Exclusive=No;
MySQL DSNless 连接
driver={mysql}; database=yourdatabase;uid=username;pwd=password;option=16386;
“外部数据提供者”的使用
1。 在窗体上放表格、数据源、外部数据提供者各一个;
2。 设置 表格1.数据源=数据源1
数据源1.数据提供者=外部数据提供者1;
3。 点击外部数据提供者1的“连接文本”属性,将弹出配ODBC置对话框,选择相应的*.dsn文件(如果没有,要新建一个,方法详见“ACCESS数据库使用详解.doc”);
4。 设置 外部数据提供者1.查询SQL=“select * from books”(这里books是表名,依数据库而定);
5。 运行。
这样就完成了用表格控件显示Microsoft Access数据库的任务。
千万注意:数据源的删除记录按钮不可随便点击。该操作是不可逆的。
Edb文件转为txt文件
窗口程序集:窗口程序集1
程序集容器:编辑框内容已改变
------------------------------
子程序:显示
局部容器:容器1 数据类型:整数型
局部容器:容器2 数据类型:整数型
打开 (编辑框2.内容, , , , , , )
置当前库 (编辑框2.内容)
计次循环首 (取记录数 (), 容器1)
计次循环首 (取字段数 (), 容器2)
编辑框1.加入文本 (取文本左边 (到文本 (读字段 (容器2, )) + 取空白文本 (12), 12))
计次循环尾 ()
编辑框1.加入文本 (#换行符)
跳过 ()
计次循环尾 ()
关闭 (编辑框2.内容)
------------------------------
子程序:_选择数据库_被单击
通用对话框1.打开 ()
编辑框2.内容 = 通用对话框1.文件名
显示 ()
------------------------------
子程序:_转换_被单击
保存文件 ()
------------------------------
子程序:_选择保存名_被单击
通用对话框2.打开 ()
编辑框3.内容 = 通用对话框2.文件名
------------------------------
子程序:保存文件
返回值类型:逻辑型
参数:文件名 数据类型:文本型
局部容器:文件号 数据类型:整数型
局部容器:现在文件名 数据类型:文本型
局部容器:rq66 数据类型:整数型
现在文件名 = “”
现在文件名 = 选择 (是否为空 (文件名), 现在文件名, 文件名)
如果真 (现在文件名 = “”)
现在文件名 = 编辑框3.内容 + “.txt”
如果真结束
文件号 = 打开文件 (现在文件名, #重写, )
如果 (文件号 ≠ 0)
写出文本 (文件号, 编辑框1.内容)
关闭文件 (文件号)
信息框 (“保存文件成功”, 0, )
编辑框内容已改变 = 0
否则
信息框 (“保存文件失败”, #警告图标, )
如果结束
关闭 (编辑框2.内容)
合并和分解易数据库
易本身的数据库操作有时较麻烦,比如合并或分解易数据库,要在两个数据库之间往返手工操作,所以用代码加载较方便一点。但一般的用代码操作易数据库的合并或分解,只针对固定的数据库文件名、固定的记录条件和字段范围。为了使这两项的操作更方便,下面提供比较通用的合并和分解易数据库的例程。
由于嫌麻烦,这里只提供例程代码,先不作解说,等以后再慢慢补充:
窗口程序集:窗口程序集1
------------------------------
子程序:_按钮1_被单击
载入 (窗口1, , 真)
------------------------------
子程序:_按钮2_被单击
载入 (窗口2, , 真)
窗口程序集:复制记录程序集
------------------------------
子程序:_按钮1_被单击
局部容器:记录号范围1 数据类型:整数型
局部容器:记录号范围2 数据类型:整数型
局部容器:数据名称 数据类型:文本型
局部容器:复制条件 数据类型:文本型
局部容器:字段范围 数据类型:文本型
局部容器:当前数据库 数据类型:文本型
当前数据库 = 编辑框4.内容
打开 (当前数据库, , , , , , )
数据名称 = 编辑框3.内容
记录号范围1 = 文本到数值 (编辑框1.内容)
记录号范围2 = 文本到数值 (编辑框2.内容)
复制记录 (数据名称, 取记录号 () > 记录号范围1 且 取记录号 () < 记录号范围2, 字段范围)
如果真 (复制记录 (数据名称, 取记录号 () > 记录号范围1 且 取记录号 () < 记录号范围2, 字段范围) = 真)
信息框 (“复制成功!”, 0, “操作成功”)
如果真结束
子程序:_按钮3_被单击
通用对话框1.打开 ()
编辑框4.内容 = 通用对话框1.文件名
窗口程序集:添加记录程序集
------------------------------
子程序:_按钮1_被单击
局部容器:记录号范围1 数据类型:整数型
局部容器:记录号范围2 数据类型:整数型
局部容器:数据名称 数据类型:文本型
局部容器:复制条件 数据类型:文本型
局部容器:字段范围 数据类型:文本型
局部容器:当前数据库 数据类型:文本型
当前数据库 = 编辑框4.内容
打开 (当前数据库, , , , , , )
数据名称 = 编辑框3.内容
记录号范围1 = 文本到数值 (编辑框1.内容)
记录号范围2 = 文本到数值 (编辑框2.内容)
添加 (数据名称, 取记录号 () > 记录号范围1 且 取记录号 () < 记录号范围2, 字段范围)
如果真 (添加 (数据名称, 取记录号 () > 记录号范围1 且 取记录号 () < 记录号范围2, 字段范围) = 真)
信息框 (“添加成功!”, 0, “操作成功”)
如果真结束
子程序:_按钮3_被单击
通用对话框1.打开 ()
编辑框4.内容 = 通用对话框1.文件名
解决ODBC数据库连接问题教程
解决ODBC数据库连接问题教程 作者:Wind Promise
这几天已经有许多人联系我,问如果解决数据库连接问题,现把方法写给大家:
要连接已经有数据库,注意不是第一次连接,以后就会自己打开的那种,而是在程序中已经进行关联了,而且会随程序和数据库的位置改变而改变。方法是:
外部数据库.打开([ODBC数据源连接文本],[是否只读])
这样就可以成功的打开数据库了,数据库联接文本指的是什么呢?就是和数据库联接时要操作的数据库参数,那么要如何知道联接文本呢?应该是什么呢?下面就是联接本文的内容:
ODBC;DBQ=d:\Downloads\e21\MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\a.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;
结合命令起来就是:
外部数据库.打开("ODBC;DBQ=d:\Downloads\e21\MSAccess.mdb;DefaultDir=d:\Downloads\e21;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\a.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;
",)
(注意哦不要忘了""号)
现在具体说明一下,这里头的参数:
ODBC;DBQ=d:\Downloads\e21\MSAccess.mdb; (指数据库所在位置)
DefaultDir=d:\Downloads\e21; (指数据库所在目录)
Driver={Microsoft Access Driver (*.mdb)};(指数据库何种类型)
FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\a.dsn (DSN文件位置)
UID=admin (数据库可访问的用户名,如果你没有设置用户安全设置,就不起作用)
PASS=admin (你设置访问密码后,UID就会生效,注意要先用ACESS里设置密码,这个功能可自行使用)
其它参数可以不用去管他,当然是有它们的意义,以后再说啦,参数并不单只有这些还很多。
当然大家还要问,上面的文件路径就只能死死的定义吗?如果我的文件位置改变了,不就不能使用了吗?其实你只要把上面的路径改成活动的就行了,如用取当前目录命令,当然前提是所有程序及数据库都在同一目录下,还有的是DSN和MDB文件都应该是事先已经建立好的。大家可以使用 易语言附的文件格式转换程序来建立,建立后那个转换的窗口就不要管他啦,当然你也可以用 LIGO的全面操作Access数据库这个程序来建立,建立完其它的就不管他,就只管取出刚建立的那两个文件来利用就行了。
就先说到这里吧,如果你还有什么问题,就跟贴啦!
顺便说一下,LIGO的全面操作Access数据库有个认识上的错误,就是数据库是允许接受空字符的,而不需要在程序中对空字符进行赋值!!!这种做法,大家可以想像如果我有一百个字段,那不是要死人,一百个都要判断是否是空字符,如果是还要赋值!!!解决方法是在建立数据库字段的时候,将字段允许接受空字符属性设置为是。就可以了。
数据的任意插入与删除
窗口程序集:窗口程序集1
------------------------------
子程序:_插入行_被单击
如果真 (编辑框1.内容 ≠ “”)
打开 (编辑框1.内容, , , , , , )
复制记录 (“haha1.edb”, 取记录号 () < 表格1.取光标行号 (), )
复制记录 (“haha2.edb”, 取记录号 () ≥ 表格1.取光标行号 (), )
打开 (“haha1”, , , , , , )
置当前库 (“haha1”)
加空记录 ()
打开 (“haha2”, , , , , , )
置当前库 (“haha1”)
添加 (“haha2”, , )
置当前库 (编辑框1.内容)
清空 ()
添加 (“haha1”, , )
关闭 (“haha1”)
关闭 (“haha2”)
删除文件 (“haha1.edb”)
删除文件 (“haha2.edb”)
数据库提供者1.数据库文件名 = 编辑框1.内容
数据源1.添加 (数据库提供者1, , )
关闭 (编辑框1.内容)
如果真结束
------------------------------
子程序:_选择数据库_被单击
通用对话框1.打开 ()
编辑框1.内容 = 通用对话框1.文件名
数据库提供者1.数据库文件名 = 通用对话框1.文件名
数据源1.添加 (数据库提供者1, , )
打开 (编辑框1.内容, , , , , , )
标签2.标题 = 到文本 (取记录数 ())
标签4.标题 = 到文本 (取字段数 ())
关闭 (编辑框1.内容)
------------------------------
子程序:__启动窗口_创建完毕
通用对话框1.初始目录 = 取当前目录 ()
------------------------------
子程序:_删除行_被单击
置当前库 (编辑框1.内容)
数据源1.删除行 (表格1.取光标行号 (), )
关闭 (编辑框1.内容)
用ODBC操纵MS_Access数据库
“用ODBC操纵MS_Access数据库”
演示用ODBC操纵MS_Access数据库。
关键是“外部数据库”组件的使用,提供了详细的解说,且附带一个Word帮助文档。
以下是全部源代码:
//----------------------------------------------------------------------------
窗口程序集:窗口程序集1
程序集容器:记录集句柄 数据类型:整数型
------------------------------
子程序:_连接外部数据库按钮_被单击
如果真 (外部数据库1.打开 (, ))
记录集句柄 = 外部数据库1.查询 (“select * from books”)
*备注:books: 是数据库中“表”的名称,表的名称在设计数据库时就已经决定了。“select * from books”是一个SQL语句,意思就是选择(select)"表books"中的所有字段。
如果 (记录集句柄 = 0)
信息框 (“查询失败!”, 0, )
否则
外部数据库1.到首记录 (记录集句柄)
读取并显示当前记录 ()
※备注:连接成功之后,立即显示第一条记录。
如果结束
如果真结束
------------------------------
子程序:__启动窗口_将被销毁
外部数据库1.关闭记录集 (记录集句柄)
外部数据库1.关闭 ()
※备注:两者都要关闭!别忘了!
------------------------------
子程序:_查看连接文本按钮_被单击
信息框 (外部数据库1.取连接文本 () + #换行符 + #换行符 + “以上仅供参考。Liigo向各位问好!”, 0, “当前ODBC数据源连接文本(由” + #左引号 + “取连接文本()” + #右引号 + “获得):”)
※备注:调用命令“取连接文本 ()”以获取数据源连接文本。获取的文本只是让大家有一些感性认识,此处不用。
------------------------------
子程序:_查看前一记录按钮_被单击
外部数据库1.到前一记录 (记录集句柄)
如果 (外部数据库1.首记录前 (记录集句柄))
信息框 (“前面已无记录!”, 0, )
外部数据库1.到首记录 (记录集句柄)
否则
读取并显示当前记录 ()
如果结束
------------------------------
子程序:_查看后一记录按钮_被单击
外部数据库1.到后一记录 (记录集句柄)
如果 (外部数据库1.尾记录后 (记录集句柄))
信息框 (“后面已无记录!”, 0, )
外部数据库1.到尾记录 (记录集句柄)
否则
读取并显示当前记录 ()
如果结束
------------------------------
子程序:_首记录按钮_被单击
外部数据库1.到首记录 (记录集句柄)
读取并显示当前记录 ()
------------------------------
子程序:_尾记录按钮_被单击
外部数据库1.到尾记录 (记录集句柄)
读取并显示当前记录 ()
------------------------------
子程序:读取并显示当前记录
备注:这是自定义子程序
编辑框1.内容 = 到文本 (外部数据库1.读 (记录集句柄, 1))
编辑框2.内容 = 外部数据库1.读 (记录集句柄, 2)
编辑框3.内容 = 外部数据库1.读 (记录集句柄, 3)
编辑框4.内容 = 外部数据库1.读 (记录集句柄, 4)
编辑框5.内容 = 外部数据库1.读 (记录集句柄, 5)
编辑框6.内容 = 到文本 (外部数据库1.读 (记录集句柄, 6))
编辑框7.内容 = 外部数据库1.读 (记录集句柄, 7)
※备注:以上7行分别读取数据库中的7个字段信息,并显示到对应的编辑框中。
※备注:命令“读()”所返回的数据的数据类型,就是设计数据库时确定的数据类型(不确切,但可以这么理解)。因为要把它们显示到编辑框中,所以不是“文本型”的要进行类型转换。
※备注:命令“读()”的第二个参数也可以是字段名称。如上面的第一行就等价于: 编辑框1.内容 = 到文本 (外部数据库1.读 (记录集句柄, “编号”))。 “编号”是什么?数据库的第一个字段的名称呀!是设计数据库时就确定的。
※备注:有人问,你Liigo怎么知道这个数据库有7个字段?你又怎么知道的各字段的数据类型和名称?哈哈,我设计的数据库,我当然知道了!(如果要操纵别人设计的数据库,也必须事先了解这些信息。)
※备注:您的朋友Liigo祝你生活愉快! Liigo@chinaren.com 2002/3/20
------------------------------
子程序:_退出按钮_被单击
销毁 ()
/////////////////////////////////////////////////////////////源代码结束。
另注:用“外部数据库.执行()”可以处理其它SQL语句如:Insert Update Delete...
数据源控件和数据库提供者控件的含义和使用
从这一讲开始讲解与数据库密切相关的控件的使用方法。
㈠、数据源控件和数据库提供者控件的含义和使用。
数据源控件(Data控件)是一个功能强大的数据访问软件。使用数据源控件我们可以做到不编写任何代码或只编写少量代码,就能对数据库中的数据进行查询、添加、删除、更新等基本操作。数据源控件的主功能属性是“数据提供者”,用于指定提供数据的一方。
数据源用作在数据处理者和数据提供者之间起协调和数据桥接的作用:
1、为所有基于本数据源的数据处理者提供来自数据提供者的数据;
2、将数据处理者处理后的数据写回到数据提供者中;
3、如果更换数据提供者或数据提供者内的数据发生改变,将自动通知所有基于本数据源的数据处理者。
怎样运用数据源控件?比如我们在窗口上只画上一个数据源控件,想设置它的“数据提供者”属性值,发现无法设置,原因是易语言数据源控件无法直接连接数据库,要通过其他控件导入数据库,再通过导人数据的控件设置“数据提供者”的属性值,为此我们还需要配合导人数据的控件来使用。易语言导人数据库的控件是“数据库提供者”控件。
用易语言数据框架图来表示一下与数据库相关的控件的使用关系就是:
数据库→数据提供者→数据源→数据处理者
数据提供者仅仅负责为数据源提供数据的获取和存储方法,即数据操作接口。目前有“通用提供者”和“数据库提供者”两种,以后还要继续增加,譬如“远程数据提供者”等等。
数据提供者的主功能属性是“数据库文件名”,用来设置需要连接的数据库。
各类数据提供者所支持的数据操作接口可能不相同,下面列出目前两种数据提供者的相关情况:
1、通用提供者:
使用内存作为数据的存储仓库,全面支持所有数据操作接口。因此必要时可以将其它类型数据提供者内的数据导入到此类型中,以全面发挥数据源对数据的操纵能力。
2、数据库提供者:
使用数据库作为数据的存储仓库,不支持以下数据操作接口:
1、置行高; 2、置类型; 3、置文本色; 4、置背景色; 5、置字体名; 6、置字体尺寸; 7、置字体属性; 8、置边距; 9、置文本输入格式; 10、置对齐方式; 11、置密码方式; 12、合并; 13、分解; 14、加线条; 15、删线条; 16、初始尺寸时同时改变列数; 17、在中间插入行; 18、插入列; 19、删除列。
如果想对数据进行以上操作,应该先将数据通过数据源导出到通用提供者中。
㈡、数据源控件和数据库提供者控件的使用例程:学生成绩管理。
本实例就是通过数据源控件来访问“学生成绩.edb”这个数据库,对该数据库进行顺序查询,并将所得的数据记录通过“学号”、“姓名”、“数学”、“语文”、“英语”对应的编辑框(用来作为数据处理者)显示出来。
这五个编辑框怎样才能作为数据处理者?需要对这五个编辑框设置两个重要的属性,一个是“数据源”属性,用于指定所使用的数据访问控件,即数据源控件;一个是“数据列”属性,用于绑定数据库中的相应字段,比如“编辑框1”用来显示“学号”字段,“编辑框2”用来显示“姓名”字段、、、这样绑定之后,我们所做的程序界面就可以和数据库端保持同步了,也就是数据库端所做的改变不仅会在我们这个程序界面中反映出来,而且我们在程序界面所做的变动也会使数据库端的数据发生相应的变动。
步骤一:创建程序界面及学生成绩数据库。
创建五个编辑框,分别用五个标签起名为“学号”、“姓名”、“数学”、“语文”、“英语”。
创建一个数据库提供者控件,一个数据源控件。
创建学生成绩数据库,包括“学号”、“姓名”、“数学”、“语文”、“英语”五个字段。
步骤二:设置各控件的主功能属性值。
⑴、设置数据库提供者控件的主功能属性“数据库文件名”的属性值为你目录下的数据库文件名,即“学生成绩.edb”。
⑵、设置数据源控件主功能属性“数据库文件名”的属性值为“数据库提供者1”。
⑶、设置五个编辑框的“数据源”属性值为“数据源1”,再设置这五个编辑框的数据列属性的属性值分别为“学号”、“姓名”、“数学”、“语文”、“英语”,以使编辑框绑定数据库的相关字段,可在下拉列表中选择。
步骤三、编写下列简单的代码(这一步不用也行):
子程序:__启动窗口_创建完毕
打开 (“#学生成绩数据库”, , , , , , )
标签8.标题 = “学生总人数: ” + 到文本 (取记录数 ()) + “人”
步骤四、运行程序。
对数据源控件进行操作。数据源控件的六个按钮从左到右排列分别是“到首记录”、“向前”、“向后”、“到尾记录”、“添加空记录”、“删除”。也就是说我们可以运用数据源控件,不用编写代码就可以进行六种操作。
新书推荐
近期最受关注书籍
|
|



