﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-magicgod's blog-文章分类-原创</title><link>http://www.blogjava.net/magicgod/category/6194.html</link><description>magicgod's blog</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 07:04:49 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 07:04:49 GMT</pubDate><ttl>60</ttl><item><title>针对hibernate,jdbc,sql的思考</title><link>http://www.blogjava.net/magicgod/articles/24763.html</link><dc:creator>magicgod's blog</dc:creator><author>magicgod's blog</author><pubDate>Tue, 20 Dec 2005 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/magicgod/articles/24763.html</guid><wfw:comment>http://www.blogjava.net/magicgod/comments/24763.html</wfw:comment><comments>http://www.blogjava.net/magicgod/articles/24763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/magicgod/comments/commentRss/24763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/magicgod/services/trackbacks/24763.html</trackback:ping><description><![CDATA[                             
<p><P>想了很长时间hibernate的特点。</P><br/>
<P>1.对象与数据库的映射，关键在于对象关系的映射，但是没做到很理想，配置过多，控制复杂，另外还会出错。其实本质在于对象不够自由。</P><br/>
<P>2.事务处理。这点上更容易出问题，相对于各种各样的事务管理器，要兼容是一个大问题，总归在各种应用服务器上有很多问题。其本质在于创建了一个自我数据存取小环境，必然面临各种兼容问题。</P><br/>
<P>3.HQL语言。建立对象查询语言，类SQL，但是不同于任何一种SQL，调试环境复杂。本质在于创建了一种语言，增加学习成本。</P><br/>
<P>减化hibernate，将其退化成一个sql生成器，既可以保留原有的主要功能，又可以兼容各种应用服务器和数据库服务器，另外还不需要学习HQL语言。</P><br/>
<P>只需要一系列的功能函数，作一下包装，再根据不同数据库生成不同的SQL即可，连数据库类型都不用指定，因为从Connection中可以获得数据库类型属性。</P><br/>
<P>假想中的API：</P><br/>
<P>public Object ResultMapObject(ResultSet rs,String xml)　//一行映射单个对象，可以用XML绑定，也可以不用。</P><br/>
<P>public List SQLMapObjects(Connection conn,String []sqls,String xml)&nbsp; //将一堆SQL映射成一个对象树，可以用xml来描述绑定，也可以不用，仅使用ror方式的约定。</P><br/>
<P>借助JDBC和SQL可以构建整个数据存取层。</P><br/>
<P>映射单个对象的代码，将一行记录映射成单个对象。sql可以是任意的。</P><br/>
<P>&nbsp;&nbsp;&nbsp; Connection conn=DriverManager.getConnection(url);<BR>&nbsp;&nbsp;&nbsp; PreparedStatement ps = conn.prepareStatement(sql);<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; ResultSet rs = ps.executeQuery();<BR>&nbsp;&nbsp;&nbsp; while(rs.next())<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user=(Users)<FONT color=#ff0000>ResultMapObject</FONT>(rs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TODO 可以使用user<BR>&nbsp;&nbsp;&nbsp; }<BR></P><br/>
<P>映射对象树。</P><br/>
<P>&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp; sale_orders销售订单表<BR>&nbsp;&nbsp;&nbsp; sale_order_details销售订单细表<BR>&nbsp;&nbsp;&nbsp; products商品表<BR>&nbsp;&nbsp;&nbsp; product_catalogs商品类别表<BR>&nbsp;&nbsp;&nbsp; 从sql中就可以分析出<BR>&nbsp;&nbsp;&nbsp; id是主鍵<BR>&nbsp;&nbsp;&nbsp; sale_order_details.sale_order_id===&gt;sale_orders.id<BR>&nbsp;&nbsp;&nbsp; sale_order_details.product_catalog_id==&gt;product_catalogs.id<BR>&nbsp;&nbsp;&nbsp; sale_order_details.product_id==&gt;products.id<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; String []<FONT color=#ff0000>sqls</FONT>=new String []{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, total_sum, memo, state, modify_date, creator, checker from sale_orders ",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, sale_order_id, product_id, product_name, product_catalog_id, model, product_unit, product_amount, product_price, product_sum, memo from sale_order_details ",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, name, catalog, model, price, unit, memo, createtime, state, code, productno from products ",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, name, memo from product_catalogs"<BR>&nbsp;&nbsp;&nbsp; };<BR>&nbsp;&nbsp;&nbsp; //不帶XML映射的，但是無法得知一对一还是一对多还是多对多的关系，所以一律建成多对多关系。<BR>&nbsp;&nbsp;&nbsp; List l=<FONT color=#ff0000>SQLMapObjects</FONT>(conn,sqls);<BR>&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp; l的结构：<BR>&nbsp;&nbsp;&nbsp; sale_orders[]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----sale_order_details[](sale_order_details.sale_order_id===&gt;sale_orders.id)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----products[](sale_order_details.product_id==&gt;products.id)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----product_catalogs[](sale_order_details.product_catalog_id==&gt;product_catalogs.id)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR></P><br/>
<P>&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp;&nbsp; 带xml<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp; sale_orders销售订单表<BR>&nbsp;&nbsp;&nbsp; sale_order_details销售订单细表<BR>&nbsp;&nbsp;&nbsp; products商品表<BR>&nbsp;&nbsp;&nbsp; product_catalogs商品类别表<BR>&nbsp;&nbsp;&nbsp; 从sql中就可以分析出<BR>&nbsp;&nbsp;&nbsp; id是主鍵<BR>&nbsp;&nbsp;&nbsp; sale_order_details.sale_order_id===&gt;sale_orders.id<BR>&nbsp;&nbsp;&nbsp; sale_order_details.product_catalog_id==&gt;product_catalogs.id<BR>&nbsp;&nbsp;&nbsp; sale_order_details.product_id==&gt;products.id<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; String []sqls=new String []{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, total_sum, memo, state, modify_date, creator, checker from sale_orders ",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, sale_order_id, product_id, product_name, product_catalog_id, model, product_unit, product_amount, product_price, product_sum, memo from sale_order_details ",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, name, catalog, model, price, unit, memo, createtime, state, code, productno from products ",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " select id, name, memo from product_catalogs"<BR>&nbsp;&nbsp;&nbsp; };</P><br/>
<P>&nbsp;&nbsp;&nbsp; /*<BR>&lt;?xml version="1.0"?&gt;<BR>&lt;<FONT color=#ff0000>MapObject</FONT>&gt;<BR>&lt;!--类似hibernate的映射，但是更容易理解，而且可以省略字段映射--&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Object tablename="sale_orders" class="org.test.pojo.SaleOrder"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;OneToMany tablename="sale_order_details" class="org.test.pojo.SaleOrderDetail"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--主细表映射--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ParentKey&gt;id&lt;/ParentKey&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ChildKey&gt;id&lt;/ChildKey&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/OneToMany&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--字段映射可选，一般是相同或根据ROR规则--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FieldMap&gt;可选...&lt;/FieldMap&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/Object&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Object tablename="sale_order_details" class="org.test.pojo.SaleOrderDetail"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 附加代码表映射１对１关系 --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;OneToOne tablename="products" class="org.test.pojo.Product"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ParentKey tablename="sale_order_details"&gt;product_id&lt;/ParentKey&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ChildKey tablename="products"&gt;id&lt;/ChildKey&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/OneToMany&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FieldMap&gt;可选...&lt;/FieldMap&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/Object&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Object tablename="sale_order_details" class="org.test.pojo.SaleOrderDetail"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;OneToOne tablename="product_catalogs" class="org.test.pojo.ProductCatalog"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ParentKey tablename="sale_order_details"&gt;product_catalog_id&lt;/ParentKey&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ChildKey tablename="product_catalogs"&gt;id&lt;/ChildKey&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/OneToMany&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FieldMap&gt;可选...&lt;/FieldMap&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/Object&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;Object tablename="product_catalogs" class="org.test.pojo.ProductCatalog"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;FieldMap&gt;可选...&lt;/FieldMap&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/Object&gt;<BR>&lt;/MapObject&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; */</P><br/>
<P>&nbsp;&nbsp;&nbsp; String xml="...";<BR>&nbsp;&nbsp;&nbsp; //带xml映射<BR>&nbsp;&nbsp;&nbsp; List l=<FONT color=#ff0000>SQLMapObjects</FONT>(conn,sqls,xml);<BR>&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp; l的结构：<BR>&nbsp;&nbsp;&nbsp; sale_orders[]<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----sale_order_details[](sale_order_details.sale_order_id===&gt;sale_orders.id)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----products[](sale_order_details.product_id==&gt;products.id)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----product_catalogs[](sale_order_details.product_catalog_id==&gt;product_catalogs.id)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>当然类要事先写好，这里就不详细写了。</P><br/>
<P>保存问题更严重，取出来用sql映射已经可以很好地解决了，基本上一个函数、一群SQL，加上少少的XML就可以表达清楚了，但是这不能解决保存对象的问题。</P><br/>
<P>假想中的保存API。</P><br/>
<P>public void <FONT color=#ff0000>saveObject</FONT>(Connection conn, Object obj,String xml);&nbsp; //保存单个对象，简单地将对象扩展成sql，允许xml映射，也可以不映射</P><br/>
<P>public void <FONT color=#ff0000>saveObjects</FONT>(Connection conn, List objs, String xml);&nbsp; //将对象树保存到数据库</P><br/>
<P>上一篇取出的List或人工组合的List可以用saveObjects来保存，这个函数的任务就比较重了，因为没有状态，所以要判断修改过非常麻烦。</P><br/>
<P>一种思路是在对象是增加属性，然后由开发者维护，比如界面上是否修改很有可能是有状态位的，这个状态位就可以用起来，然后函数根据这个状态位来判断是否去更新。</P><br/>
<P>一种思路是从Class本身中就得知对象是否被改过，类似AOP，在修改的时候记录一下，然后函数来判断是否改过，然后组成SQL来更新。</P><br/>
<P>至于批量修改是强项，直接用SQL即可，学习SQL比HQL的成本要低，毕竟这么多年了。</P><br/>
<P>外围实用函数的思考：基本上都针对SQL的生成，或数据库函数的替换</P><br/>
<P>public String generateInsertSQL(DBType type,Object obj);//生成insert语句</P><br/>
<P>public String generateUpdateSQL(DBType type,Object obj);//生成update语句</P><br/>
<P>public String generateSelectSQL(DBType type,Object obj);//生成select语句</P><br/>
<P>总之这个函数工具箱的思路有这几条：</P><br/>
<P>1.<FONT color=#ff0000>使用函数</FONT>，而不是使用环境来代替JDBC或应用服务器。</P><br/>
<P>2.<FONT color=#ff0000>使用成熟的SQL</FONT>，而不是自创语言，最多增加SQL预处理器，将一些函数转成数据库相关，简单的文本功能。</P><br/>
<P>3.<FONT color=#ff0000>保持对各种环境的兼容性</FONT>。对象是干净的，当然如果用AOP就很难说对象干不干净了，不过基本上应该适用于所有的环境中。</P><br/>
<P>缺点：由于没有了环境，保存对象有点麻烦，用SQL来解决批量更新和删除，必要时增加几个SQL语句生成器即可。保存对象树是一个大缺点，没有非常好的办法能够将对象树整个保存下来而且效率非常高，只有上面提到的两种不太完美的办法，这都是因为JVM没有提供对象状态的原因。</P><br/>
<P>不过这样用函数的方法来解决多继承的问题还是比较干净舒服的，既可以动态，又可以静态，随心所欲，灵活性、效率和兼容性兼得。</P></p>


         <br>文章来源:<a href='http://blog.matrix.org.cn/page/magicgod?entry=%E9%92%88%E5%AF%B9hibernate_jdbc_sql%E7%9A%84%E6%80%9D%E8%80%83'>http://blog.matrix.org.cn/page/magicgod?entry=%E9%92%88%E5%AF%B9hibernate_jdbc_sql%E7%9A%84%E6%80%9D%E8%80%83</a><img src ="http://www.blogjava.net/magicgod/aggbug/24763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/magicgod/" target="_blank">magicgod's blog</a> 2005-12-20 13:57 <a href="http://www.blogjava.net/magicgod/articles/24763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NSIS setup 来打包安装程序，用到了Oracle,BDE,ODBC,mysql,PATH,ini文件</title><link>http://www.blogjava.net/magicgod/articles/24764.html</link><dc:creator>magicgod's blog</dc:creator><author>magicgod's blog</author><pubDate>Tue, 20 Dec 2005 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/magicgod/articles/24764.html</guid><wfw:comment>http://www.blogjava.net/magicgod/comments/24764.html</wfw:comment><comments>http://www.blogjava.net/magicgod/articles/24764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/magicgod/comments/commentRss/24764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/magicgod/services/trackbacks/24764.html</trackback:ping><description><![CDATA[                             
<p><P>这次用<A href="http://blog.matrix.org.cn/editor/nsis.sourceforge.net/">NSIS setup</A> 来打包，基本上常用功能都用全了。</P><br/>
<P>1.Oracle</P><br/>
<P>基本上一个目录，一堆注册表，可以兼容8i开始的oracle服务器，当然不要用到复杂的功能。</P><br/>
<P>2.BDE</P><br/>
<P>基本也是一个目录，一堆注册表，反正borland很多年没更新过了，不过运行的还不错。</P><br/>
<P>3.MySQL</P><br/>
<P>这个只要一个目录就行了，注册表不用管，主要是执行一个命令把服务建起来。</P><br/>
<P>4.ODBC</P><br/>
<P>MyODBC要安装到系统目录下，注册也是一个命令就行了，另外要创建一个ODBC的DSN，还好已经提供了包。</P><br/>
<P>5.配置文件</P><br/>
<P>需要建一个对话框，叫作InstallOptions Dialog。然后把变量捆绑上，最后替换一下文件就行了。</P><br/>
<P>技术上的解决。</P><br/>
<P>1.NSIS的套件。</P><br/>
<P>下一个中文版的套装，非常好用，可以用HM VNISEdit，连帮助都汉化了。而且有导向帮助建立初始化的nsi文件，非常实用，因为nsi全是命令，没有可视化的编辑，所以这个框架非常重要。<A href="http://www.hanzify.org/index.php?Go=Show::List&amp;ID=9491">这个是汉化新世纪的一个版本</A>&nbsp;。</P><br/>
<P>2.资料查找，在<A href="http://nsis.sourceforge.net/Category:Browse_NSIS_Repository_by_Topic">NSIS的官方站</A>上有大量的资料，而且是分过类的，很好用，有插件、有函数、有代码例子。</P><br/>
<P>3.oracle&amp;bde client，这个压缩包我不知从哪儿下载的，反正是不错的，已经事先过滤了一把，而且把注册表也导出来了，非常小，只有10m，我又去掉了一些html帮助，更简洁了。</P><br/>
<P>4.拷贝文件。</P><br/>
<P>这个最简单，使用命令：&nbsp;</P><br/>
<P>CopyFiles "$INSTDIR\mysql4\my.cnf" "$WINDIR"<BR>用于安装后的复制文件，也可以用File命令。</P><br/>
<P>5.注册表。</P><br/>
<P>可以用菜单上的Reg2Nsi，非常容易，根据.reg自动生成代码，可以放在拷贝文件后面。</P><br/>
<P>代码类似：&nbsp;WriteRegStr HKLM "SOFTWARE\ORACLE" "inst_loc" "$INSTDIR\Program Files\Oracle\Inventory"</P><br/>
<P>6.&nbsp; 执行程序</P><br/>
<P>mysql的服务可以用命令行来安装。<BR>&nbsp; nsExec::ExecToLog '"$INSTDIR\mysql4\bin\mysqld-nt" install mysqldb --defaults-file="$INSTDIR\mysql4\my.ini"'<BR>当然这个不限于安装服务，可以执行任何命令。</P><br/>
<P>启动服务&nbsp; nsExec::ExecToLog 'net start mysqldb'<BR>注册MyODBC&nbsp; nsExec::ExecToLog '"$SYSDIR\myodbc3i" -a -d -t"MySQL ODBC 3.51 Driver;DRIVER=myodbc3.dll;SETUP=myodbc3S.dll"'</P><br/>
<P>7.生成ODBC　DSN</P><br/>
<P>这里需要一个插件<A href="http://nsis.sourceforge.net/ODBC_Manager">NsODBC</A>，在<A href="http://nsis.sourceforge.net/ODBC_Manager">官方站</A>可以下载。</P><br/>
<P>&nbsp; nsODBC::AddSysDSN "MySQL ODBC 3.51 Driver" "DSN=local" "SERVER=localhost" "DATABASE=erp" "UID=erp" "PWD=123456" "OPTION=65536"</P><br/>
<P>当然不限于MyODBC，任何ODBC源都可以注册。<BR>8.加入搜索路径PATH</P><br/>
<P>这个比较简单，但是需要自已建立一个函数</P><br/>
<P>&nbsp; Push "PATH"<BR>&nbsp; Push "$INSTDIR\oracle\ora81\bin"<BR>&nbsp; Call AddToEnvVar<BR>这样就可以加入环境变量了。</P><br/>
<P>9.替换文件中的变量</P><br/>
<P>需要建一个函数，也是官方网上有的。</P><br/>
<P>&nbsp; Push MYSQL_BASE_DIR #text to be replaced<BR>&nbsp; Push $INSTDIR\mysql4 #replace with<BR>&nbsp; Push all #replace all occurrences<BR>&nbsp; Push all #replace all occurrences<BR>&nbsp; Push $INSTDIR\mysql4\my.ini #file to replace in<BR>&nbsp; Call AdvReplaceInFile<BR>这样就是替换字符串了，#是注释。</P><br/>
<P>10.创建一个对话框。</P><br/>
<P>被称为InstallOptions，在菜单上就可以新建，画好后存在同目录下。保存的是一个ini文件可以手动修改，每一节都是控件名，State属性代表了变量内容。</P><br/>
<P>11.显示一个对话框和赋值变量</P><br/>
<P>先定义一个变量</P><br/>
<P>var SUB_NUM<BR>写一个显示对话框的函数，要放在最后面</P><br/>
<P>Function SubSelect<BR>&nbsp; !insertmacro MUI_HEADER_TEXT "填写门店号" "填写正确的门店号"<BR>&nbsp; !insertmacro MUI_INSTALLOPTIONS_DISPLAY "sub.ini"</P><br/>
<P>&nbsp; ;读出输入值<BR>&nbsp; !insertmacro MUI_INSTALLOPTIONS_READ $SUB_NUM "sub.ini" "Field 1" "State"<BR>FunctionEnd<BR>显示对话框，放在一堆页面中间，界面最好用MUI。</P><br/>
<P>Page custom SubSelect<BR>12.打开日志记录</P><br/>
<P>!ifdef NSIS_CONFIG_LOG<BR>&nbsp;LogSet on<BR>!endif<BR>13.系统变量　</P><br/>
<P>$INSTDIR：安装目录</P><br/>
<P>$SYSDIR：系统目录，c:\windows\system32。</P><br/>
<P>$WINDIR：c:\window</P><br/>
<P>${PRODUCT_NAME}：产品名称</P><br/>
<P>${PRODUCT_WEB_SITE}：网址</P><br/>
<P>$SMPROGRAMS：开始菜单</P><br/>
<P>感觉这个NSIS功能确实比较全，而且资源丰富，但是缺少友好的界面，不过相比installShield慢如老牛的速度，编这点程也算不了什么。官方站的资源基本上全了，如果去找一找一般都能找到，实在不行，调用一些API也是小事，就是语法怪了一点，习惯了就好。</P><br/>
<P>附：<A href="http://blog.matrix.org.cn/resources/magicgod/nsis.jpg">例子</A>&nbsp;把后缀改成rar，里面有一个例子，两个函数和一个ODBC的插件。</P><br/>
<P>注：MyODBC要下载非安装版。</P></p>


         <br>文章来源:<a href='http://blog.matrix.org.cn/page/magicgod?entry=nsis_setup_%E6%9D%A5%E6%89%93%E5%8C%85%E5%AE%89%E8%A3%85%E7%A8%8B%E5%BA%8F_%E7%94%A8%E5%88%B0%E4%BA%86oracle_bde'>http://blog.matrix.org.cn/page/magicgod?entry=nsis_setup_%E6%9D%A5%E6%89%93%E5%8C%85%E5%AE%89%E8%A3%85%E7%A8%8B%E5%BA%8F_%E7%94%A8%E5%88%B0%E4%BA%86oracle_bde</a><img src ="http://www.blogjava.net/magicgod/aggbug/24764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/magicgod/" target="_blank">magicgod's blog</a> 2005-12-20 13:57 <a href="http://www.blogjava.net/magicgod/articles/24764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>