一套原来在Access上开发的桌面系统网页调阅使用ASP编程数据维护系统使C++Builder编程由于Access是一个桌面的共享型数据库所以在通用性和网络开发方面都存在一些问题因此需要将该系统移植到服务器型的数据库上使系统既可以通过桌面软件维护数据又可以有大量用户通过网页调看数据(结果)
系统初始软件为Windows第二版AccessC++BuilderC++BuilderMDAC(Microsoft Data Access Component 中文版)
一移植到Oracle的尝试
在机器上安装Oracle 桌面版由于使用不熟练所以选择默认安装除选择语言Simplified Chinese外其他都选择默认一路装下去没有问题重新启动系统运行Net Easy Config配置需要的数据库别名然后用SQL Net连接试验用户名输入system密码输入manager连接服务器注意不要输入服务器的地址而是输入刚才建立的别名进去了Ok!
此时开始测试ODBC建立ODBC数据源此时ODBC中有两个有关Oracle的驱动一个是Microsoft ODBC for Oracle另一个是Oracle 这是该公司自己开发的驱动可是怎么选择驱动程序都不行不是提示Oracle的驱动没有安装就是说某个DLL文件找不到真是说不行就不行行也不行
多次试验均无效
检查AUTOEXECBAT文件其中有ORACLE的路径那末问题会在什么地方呢?本着怀疑一切的态度在MSDOS方式下随手输入了一个PATH命令奇怪里面居然没有ORACLE的路径!打开AUTOEXECBAT文件一琢磨路径是不是太长?把路径中的其他目录全都注释掉重启系统嘿!数据源可以建立了而且两个驱动程序哪个都能够工作原来由于系统中安装了C++Builder的两个版本而该软件的目录又特别深造成PATH环境变量的溢出而在WINDOWS环境下启动时的提示我们看不到所以没有发现这个问题现在知道了重新调整一下AUTOEXECBAT文件保留一个C++Builder的路径以后得记住安装C++Builder时最好自己指定一个目录这样可以缩短路径这可是说行就行不行也行
经过对Oracle的测试发现将Access数据库直接移植到Oracle数据库中时对文本字段(TEXTMEMO)的迁移总有问题且该系统使用安装过于复杂对机器配置的要求也太高而该系统需要安装的用户较多且使用者水平参差不齐所以决定改用现在在自由软件界比较流行的免费数据库系统MySQL
二移植到MySQL的经历
该系统的安装比较简单若认为自己没有能力安装该软件的话还可以从网络上下载一个叫PHPTriad for windows的软件该软件安装时没有任何选项自动安装好MySQL(实际上该软件同时还安装好了APACHE服务器PHP语言解释器这正好符合将来把ASP的网页换到PHP上去;另外该软件还同时安装配置好了一个网页数据库维护工具PHPMyAdminPHPMyAdmin对于SQL语言不算熟的人来说管理数据库极其方便)
再安装MYODBC(即ODBC for MySQL我的是版本)注意下载该软件时要分清版还是NT版的安装也很简单一路OK好了建立数据源work填好IP地址数据库名填mymember(这时系统提供的数据库)进行测试不行?改用系统自动安装的samplemysql数据源连接链上了仔细检查配置没有错误为什么系统自己做的数据源可以用我做的就不行呢?把自己建立的删掉把samplemysql改名为work再连接嘿嘿不行了! 哈哈原来就出在名字上在work后面加上mysql再连接好了原来myodbc要求它的数据源名称必须以mysql结尾!
解决了数据源下面开始移植原来的Access数据库 移植工作比较简单打开Access数据库选中第一张表从File菜单中选择另存为/导出选择另存为一个外部文件或数据库选确定在弹出的对话框中的保存类型下拉选单中选择ODBC数据库又弹出一个导出的对话框如果打算给该数据表改名的话现在可以输入新的名字然后选择确定在弹出的选择数据源对话框中点Machine Data Source(机器数据源)找到自己建立的workMySQL数据源按确定此时会回到Access数据库如果数据表很大的话状态栏中会有一个导出的进度否则导出已经完成
导出成功后通过PHPMYADMIN检查导出的数据库结构内容都正常需要注意的是如果数据表中用到了Access提供的ID(自动增量)字段的话需要手工在目标数据库中修改对应字段的属性(这在PHPMyAdmin中很容易实现找到该字段后点改变在该字段的属性最后一项额外的下拉选单中选择auto_increment然后保存PHPMyAdmin的界面是英文的?其实只要在安装有PHPMyAdmin的目录Apache\Htdocs\PHPMyAdmin中找到configincphp文件搜索require把引号中的englishincphp改成chinese_gbincphp再去调用网页中的PHPMyAdmin嘻嘻是不是变成中文了?其实chinese_gbincphp是一个文件名就在该目录下你还可以把界面变成BIG码呢)
终于把移植的工作做完了下面开始用C++BUILDER编程对数据库使用ADO来访问
步骤如下
在ADO控件标签中选ADOTable在主窗口上先放置一个ADOTable然后点击左边对象观察器(Object Inspector)中ConnectionString右边的…图标选Use Connection String点Build在Provider标签中选择Microsoft OLE DB Provider for ODBC Drivers点Next>>按钮在specify the source of data中选use data source name从下拉选单中选择数据源workMySQL点Test Connection显示连接成功确定OK返回在对象观察器中Table Name属性点下拉选单选择需要的数据表
再从Data Access控件标签中选DataSource在主窗口上放置一个DataSource在对象观察器中DataSet属性点下拉选单选择ADOTable下面进行界面输出的布局选择Data Controls控件标签中的DBEdit根据需要放置并把DataSource属性设置为DataSource DataField属性设置为所需要的字段名如此放置几个字段最后从Data Controls控件标签中选DBNavigator放在窗口上再ADOTable的Active属性改为true咦怎么有的字段显示成(MEMO)先不管他运行程序输入一些内容点击提交怎么没了?有的字段还缩短了多试几次发现新输入的内容不能超过原来的长度那么原来是空的字段就永远没法输入内容了这是怎么回事?这种用法肯定没有问题以前在Access数据库上就是这么用的那么就是MySQL的ODBC有问题退出C++Builder打开数据源的选项仔细分析其中第一项vaaaa很象把它选中确定重新运行C++Builder再运行程序一切OK
原来MySQL这样的自由软件其ODBC选项很多是为了适应各方面需要不象微软或其他的数据库那样默认值就可以用这个选项可能是为了优化一些网络上的应用而把数据库字段的默认值总是假设为最小状态从而造成这个问题这可能也是自由软件的一个小缺点吧
三ASP访问MySQL数据库的问题
原来的主页中大量使用了ASP访问数据库其中典型的用法是
dim LK_CONN
set LK_CONN=servercreateobject(ADODBCONNECTION)
LK_CONNopen onduty_mysqlroot
以上建立数据库的连接
dim RS_NEWS
set RS_NEWS = servercreateobject(adodbrecordset)
sql = SELECT * FROM NewsPic
RS_NEWSopen sqlLK_CONN
以上建立对表的访问
下面显示内容为表达简单没有格式引号中为字段名
=RS_NEWS(Extract)
=RS_NEWS(Pic)
这一段代码没有问题实现了平滑过渡;但是有个别地方有写入操作数据不能正常读出该段代码如下
dim RS_COUNT
set RS_COUNT = servercreateobject(adodbrecordset)
RS_COUNTopen SELECT * FROM countLK_CONN
访问计数器
dim Zcount
Zcount=RS_COUNT(Count)
Zcount = Zcount +
RS_COUNT(Count)Value=Zcount
RS_COUNTUpdate
RS_COUNTClose
开始怀疑这一段后面有写入操作所以不能正确执行但经过仔细比较和测试发现问题不在是否写入上这一段的代码主要是用了ASP访问Access数据库时直接填入数据库名的方法而没有使用SQL语句我们把打开数据库的地方改为select * from 表名程序遂工作正常
结论编程时应该尽量使用通用性好的方法这样对于系统的通用性可移植性来说还是很重要的
四ODBC的问题
在C++Builder中有的地方要用到SQL查询因此有一段程序使用的是ADOQuery控件本来这种用法在其他机器上用过没有问题可是在这里却不行具体情况如下放置一个ADOQueryConnectionString属性TableName属性和前面的ADOTable属性设置一样Active属性保持false再添加一个DataSource控件和几个DBText控件设置同前然后在FormCreate(表单构造函数)中添加如下代码
ADOQuery>Active=false;
ADOQuery>SQL>Clear();
ADOQuery>SQL>Add(select * from Names order by ID);
ADOQuery>Active=true;
while (!ADOQuery>Eof)
{
ComboBox>Items>Add(ADOQuery>FieldByName(Name)>AsString);
ADOQuery>Next();
}
//后一段
ADOQuery>Active=false;
ADOQuery>SQL>Clear();
ADOQuery>SQL>Add(select * from Dutys order by ID);
ADOQuery>Active=true;
while (!ADOQuery>Eof)
{
ComboBox>Items>Add(ADOQuery>FieldByName(Duty)>AsString);
ADOQuery>Next();
}
就这么一段代码在该机器上怎么都不能运行系统总是提示BOF或EOF中有一个为真的错误将注释后面的一段删掉系统可以运行但退出程序时出现非法错误说明是带故障运行反复查看找不出程序的明显错误把程序拿到其他机器上可以通过两个机器的最主要差别就是ODBC的版本不同
于是想将ODBC降为英文版找到MDAC版安装了几次都不行只好手工删除了在WINDOWS目录中搜索出所有前缀为ODBC的文件然后删除program files\common files中的system目录再重新安装MDAC(Microsoft Data Access Component 英文版)再运行该程序一切正常
五结论
不知道是MDAC版本的问题还是因为它是中文版的问题总之造成系统的兼容性不是很好建议大家在编程时也应该尽量使用已经熟悉的环境而不要总是去尝试太新的东东
当然如果是我这一段代码有问题还希望有高手能出来指导
以上是我们在一次数据库系统的移植开发过程中出现问题和解决方法的真实记录虽然问题都很小但是让我们在开发过程中走了不少弯路所以把它记录下来供大家参考希望对朋友们的开发有所帮助其中的问题也希望有朋友能够指出更好的解决办法