最近在一个项目,要求业务数据存放在本地。 最初考虑了MySQL和SQLite,但是MySQL体积略大,再者本人也不太习惯使用MySQL; SQLite呢功能太弱,效率随着数据量的增大会有所下降;Oracle功能强大,是我的最爱,但是又没有绿色版本的;Access什么的也就算了,不在考虑之列。
无意中找到了一个MiniSQL2000,其实就是多年前的GSQL,大小合适,又是关系型数据库,存储过程什么的都支持,功能足以满足业务需求。 本想联系一下MiniSQL2000的作者,咨询一下核心进程sqlservr.exe的运行原理,谁曾想入群竟然需要先交100块钱!!!! 虽说是小钱,我也尊重这位作者的付出,但是实在是无力吐槽,谁让人家掌握那么一点点我不知道的技术呢!
本着有事没事找度娘的原则,网上搜了一下运行参数和原理,其实很简单,只要虚拟注册一下SQL Server的注册表信息即可。 另外在网上又找到了一段GSQL作者写的注册虚拟注册表的关键代码,所以略加改动做了一个最简单的启用SQL Server 2000服务的小程序,源代码也分享给想学习的同学,希望可以节省大家的时间,少走弯路!
源码下载传送门:https://download.csdn.net/download/valesgubb/10864668
sa用户默认密码admin,SQL实例名:BMSSQL,或者通过8899端口访问。
源码说明:
有两个注册表信息RegUnInstall.Bin 和 RegInstall.Bin 放在资源文件里面,通过Brcc32 REG.rc编译到.res文件,程序中释放出来替换实例名和数据库文件路径之后进行虚拟注册。
另外下载的源码里面有两个地方要改一下,否则实例名和端口不能通过配置文件进行配置。
procedure ExecRegFile(AFile: string); function FMPath(APath: string): string; begin Result := StringReplace(APath, '\', '\\', [rfReplaceAll]); end; var TempData: string; REGBin: TStringList; rs: TResourceStream; begin rs := TResourceStream.Create(HInstance, AFile, 'reg'); rs.Position := 0; REGBin := TStringList.Create; REGBin.Clear; REGBin.LoadFromStream(rs); TempData := REGBin.Text; TempData := StringReplace(TempData, '$Name', InstanceName, [rfReplaceAll]); TempData := StringReplace(TempData, '$Port', InstancePort, [rfReplaceAll]); TempData := StringReplace(TempData, '$Path', FMPath(RunPath), [rfReplaceAll]); TempData := StringReplace(TempData, '$D', FMPath(RunPath + 'Data\master.mdf'), [rfReplaceAll]); TempData := StringReplace(TempData, '$L', FMPath(RunPath + 'Data\mastlog.ldf'), [rfReplaceAll]); REGBin.Text := StringReplace(TempData, '$E', FMPath(RunPath + 'Logs\SQL_Logs.log'), [rfReplaceAll]); RunRegScript(REGBin); FreeAndNil(REGBin); FreeAndNil(rs); end;
遗留问题:
本代码只适用于Delphi2007及以下版本进行编译,我用Delphi 10编译运行会报版本不一致的错误,这个问题尚未解决,如果哪位牛 人知道原因,请告知解决方案,万分感谢!
申明: SQL Server版权归 美国微软公司所有,本实例仅供参考学习!