可以做一个安装程序把自己的程序安装到机器上,数据库(SQL Server2000已安装到机器上)能不能也在这个过程安装上呢,就是把所有的表和存储过程也建好,这个能用什么安装程序做上去呢?
另外,用于数据库连接的字符串如“DSN=db;UID=test;PWD=123”大家是怎么设置的呢?是定死在程序中还是写在配置文件中,用户可更改也可以看见呢?
另外,用于数据库连接的字符串如“DSN=db;UID=test;PWD=123”大家是怎么设置的呢?是定死在程序中还是写在配置文件中,用户可更改也可以看见呢?
能不能具体一点啊to ytweiwei(爱江山憎恨美人)
看MSDN的API吗?
下面是我做这个的时候,别人给我的指导。
http://www.csdn.net/expert/topic/652/652012.xml?temp=.6688349
http://www.csdn.net/expert/topic/644/644566.xml?temp=.8845331
http://www.yesky.com/20010128/154960.shtml
///////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: OnFirstUIAfter
//
// EVENT: FirstUIAfter event is sent after file transfer, when installation
// is run for the first time on given machine. In this event handler
// installation usually displays UI that will inform end user that
// installation has been completed successfully.
//
///////////////////////////////////////////////////////////////////////////////
function OnFirstUIAfter()
STRING szTitle, szMsg1, szMsg2, szOption1, szOption2;
NUMBER bOpt1, bOpt2;
string szMsg;
string szField1;
string svEdit1;
string svEdit2;
string svRsPath;
string svUSPath,svMEPath;
object WebSite, WebServer, WebRoot, VDir;
object FTPSite, FTPServer, FTPRoot,objISAdmin,cat,sp;
object server,db,res,dbf,fg,dbs;
object Server;
begin
//得到服务器参数
SdShowDlgEdit1 ( "输入服务器IP地址" , "输入服务器IP地址" , "服务器IP地址" , svEdit1 );
SdShowDlgEdit1 ( "输入sa密码" , "输入sa密码" , "输入sa密码" , svEdit2 );
AskPath ( "资源文件存放目录" ,"" , svRsPath );
svUSPath=TARGETDIR+"\\userupload";
AskPath ( "媒体文件存放目录" ,"" , svMEPath); //创建Web站点
try
set WebSite=CreateObject ("IISNamespace");
set WebSite=WebSite.GetObject("IIsWebService", svEdit1+"/w3svc");
set WebServer=WebSite.create("IIsWebServer",911); //
WebServer.ServerComment="中小学教育资源库";
WebServer.Serverbindings=":8010:";
WebServer.defaultDoc="default.asp";
WebServer.AccessScript= TRUE;
WebServer.AccessExecute=TRUE;
WebServer.AccessRead= TRUE;
WebServer.SetInfo;
set WebServer = WebSite.GetObject("IIsWebServer", 911);
set VDir = WebServer.Create("IIsWebVirtualDir", "root");
VDir.AccessRead = TRUE;
VDir.Path = TARGETDIR+"\\web";
VDir.AccessScript = TRUE;
VDir.AccessExecute =TRUE;
VDir.AccessRead= TRUE;
VDir.SetInfo;
set VDir = WebServer.Create("IIsWebVirtualDir", "root/resource");
VDir.AccessRead = TRUE;
VDir.Path = svRsPath ;
VDir.AccessScript = TRUE;
VDir.AccessExecute =TRUE;
VDir.AccessRead= TRUE;
VDir.SetInfo; set VDir = WebServer.Create("IIsWebVirtualDir", "root/data");
VDir.AccessRead = TRUE;
VDir.Path = svUSPath;
VDir.AccessScript = TRUE;
VDir.AccessExecute =TRUE;
VDir.AccessRead=TRUE;
VDir.SetInfo;
WebServer.Start;
catch
SdShowMsg ( "web 服务创建失败!" , TRUE );
endcatch;
try
//创建FTP站点
set FTPSite = CreateObject("IISNamespace");
set FTPSite = FTPSite.GetObject("IIsFTPService", svEdit1+"/MSFTPSVC");
set FTPServer=FTPSite.create("IIsFTPServer",913);
FTPServer.ServerComment="中小学教育资源库FTP";
FTPServer.Serverbindings=":211:";
FTPServer.AccessRead= TRUE;
FTPServer.AccessWrite= TRUE;
FTPServer.SetInfo;
set FTPServer = FTPSite.GetObject("IIsFTPServer",913);
set VDir = FTPServer.create("IIsFTPVirtualDir", "root");
VDir.AccessRead = TRUE;
VDir.Path = svRsPath ;//edit8.Text;
VDir.AccessRead= TRUE;
VDir.AccessWrite=TRUE;
VDir.SetInfo; set VDir = FTPServer.create("IIsFTPVirtualDir", "root/resource");
VDir.AccessRead = TRUE;
VDir.Path = svRsPath;//edit8.Text;
VDir.AccessRead= TRUE;
VDir.AccessWrite=TRUE;
VDir.SetInfo; set VDir = FTPServer.create("IIsFTPVirtualDir", "root/data");
VDir.AccessRead = TRUE;
VDir.AccessWrite=TRUE;
VDir.Path = svUSPath;// edit9.Text;
VDir.AccessRead= TRUE;
VDir.SetInfo;
FTPServer.Start;
catch
SdShowMsg ( "ftp 服务创建失败!" , TRUE );
endcatch;
//配置Index Server
try
set objISAdmin = CreateObject("Microsoft.ISAdm");
set cat=objISAdmin.AddCatalog("mettsc-zyk","c:\\"); set sp=cat.AddScope(svRsPath,FALSE);
sp.Alias="resource";
set sp=cat.AddScope(svUSPath,FALSE);
sp.Alias="data";
catch
SdShowMsg ( "索引服务创建失败!" , TRUE );
endcatch; //创建媒体服务
try
set Server = CreateObject("NsoAdminControl.NsoAdminControl.1");
Server.Connect(svEdit1);
Server.VirtualRoots.Item("/").DirectoryPath=svMEPath;
catch
SdShowMsg ( "媒体服务创建失败!" , TRUE );
endcatch;
//配置注册表
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"AppPath" , REGDB_STRING , TARGETDIR , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBIP" , REGDB_STRING , svEdit1 , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBname" , REGDB_STRING , "ziyuanku_db" , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBPWD" , REGDB_STRING , svEdit2 , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"DBUser" , REGDB_STRING , "sa" , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"FTPIP" , REGDB_STRING , svEdit1 , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"FtpPort" , REGDB_STRING , "211" , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"HttpIP" , REGDB_STRING , svEdit1 , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"HttpPort" , REGDB_STRING ,"8010" , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"mediaIP" , REGDB_STRING ,svEdit1 , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"resourcePath" , REGDB_STRING ,svRsPath , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"UsrUpload" , REGDB_STRING ,svUSPath , -1 );
RegDBSetKeyValueEx ( "SOFTWARE\\Mettsc\\EduRes\\IIS" ,"webpath" , REGDB_STRING ,TARGETDIR+"\\web" , -1 );
RegDBSetKeyValueEx ( "SYSTEM\\CurrentControlSet\\Control\\ContentIndex\\Catalogs\\mettsc-zyk" ,"W3SvcInstance" , REGDB_NUMBER ,"911" , -1 );
RegDBSetKeyValueEx ( "SYSTEM\\CurrentControlSet\\Control\\ContentIndex\\Catalogs\\mettsc-zyk" ,"IsIndexingW3Svc" , REGDB_NUMBER ,"1" , -1 ); LaunchAppAndWait (SRCDIR+"\\udlsave.exe","udlsave.exe", WAIT );
LaunchAppAndWait (SRCDIR+"\\update.exe","update.exe", WAIT );
Disable(STATUSEX); ShowObjWizardPages(NEXT); bOpt1 = FALSE;
bOpt2 = FALSE;
szMsg1 = SdLoadString(IFX_SDFINISH_MSG1);
SdFinishEx(szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2);
end;// --- include script file section ---
我的数据库在本地,怎么写呢?
基本思想是:
1、将要安装的数据库文件(就是.mdf和.ldf文件)从SQLServer中剥离出来,用sp_detach_db命令;
2、将这两个文件拷到目标计算机中;
3、得到目标计算机的数据库管理员的帐号和密码(不一定是sa的);
4、检验这个帐号是否为管理员而且密码正确;
5、检查注册表得到数据库系统的数据目录(比如C:\mssql7\data"),并将两个数据库文件拷到目录下;
6、运行isql命令,将数据库文件挂接到数据库系统中;
7、添加一个属于自己的帐号和密码用于连接自己的数据库(可选)。
具体InstallShield代码如下:function OnFirstUIBefore()
NUMBER nResult,nSetupType;
STRING szTitle, szMsg;
STRING szLicenseFile, szQuestion;
STRING svName, svCompany, svSerial;
STRING szFile;
STRING szDir;
STRING szfolder;
LIST listStartCopy;
LIST list;
//RegDBKeyExist
STRING szSubKey;
//RegDBGetKeyValueEx
STRING szKey, szName, svValue;
NUMBER nvType, nvSize;
//SdShowDlgEdit2
STRING szField1, szField2, szEdit1, szEdit2;
//LaunchAppAndWait
STRING szProgram, szCmdLine;
//OpenFile, GetLine
STRING szPath, szFileName, svLine;
NUMBER nvFileHandle;
//Temp dir
STRING szTempDir;
//AskPath
STRING szDefPath , svResultPath;
BOOL bTargetDirOk;
//GetSystemInfo
NUMBER nvResult;
STRING svResult;begin
szTitle = "安装数据库";
szMsg = "请输入具有数据库管理员权限的帐号和密码,以便建立数据库";
szField1 = "帐号:";
szField2 = "密码:";
szEdit1 = "sa";
szEdit2 = "";
nResult = SdShowDlgEdit2(szTitle, szMsg,
szField1, szField2, szEdit1, szEdit2);
if (nResult = NEXT) then
szUid = szEdit1;
szPwd = szEdit2;
//得到临时目录名称
szTempDir = "C:\\";
//测试帐号及密码的合法性
szFileName = szTempDir ^ "result.txt";
szProgram = "isql";
szCmdLine = "-U " + szEdit1 + " -P "+ szEdit2 +
"-Q \"select name from master..syslogins where " +
"name = '" +szEdit1 + "' and sysadmin = 1\" -o " +
szFileName;
nResult = LaunchAppAndWait(szProgram, szCmdLine, WAIT);
if (nResult < 0) then
szMsg = "数据库连接失败,即将退出!";
MessageBox(szMsg, INFORMATION );
abort;
endif;
szPath = szTempDir;
OpenFileMode(FILE_MODE_NORMAL);
OpenFile(nvFileHandle, szPath, "result.txt");
nResult = 0;
while (GetLine(nvFileHandle, svLine) = 0)
//如果合法则继续
if (StrCompare(svLine, "(1 row affected)") = 0) then
nResult = 1;
endif;
endwhile;
CloseFile(nvFileHandle);
//如帐号不合法则提示重新输入
if (nResult = 0) then
szMsg = "验证帐号和密码失败,请检查数据库服务器是否启动并重新输入!";
MessageBox(szMsg, INFORMATION );
goto Dlg_GetDBUser;
endif;
else
goto Dlg_ObjDialogs;
endif;
DeleteFile(szFileName);
end;function OnFirstUIAfter()
STRING szTitle, szMsg1, szMsg2, szOption1, szOption2;
NUMBER bOpt1, bOpt2;
//SQL Server Data Dir
STRING szDataDir;
//Temp dir
STRING szTempDir;
//RegDBGetKeyValueEx
STRING szKey, szName, svValue;
NUMBER nvType, nvSize;
//Function result
NUMBER nResult;
//SdShowDlgEdit2
STRING szMsg, szField1, szField2, szEdit1, szEdit2;
//LaunchAppAndWait
STRING szProgram, szCmdLine;
//OpenFile, GetLine
STRING szPath, szFileName, svLine;
NUMBER nvFileHandle;
//CopyFile
STRING szSrcFile , szTargetFile;
//DeleteDir
STRING szDir;
//WriteProfString
STRING szSectionName , szKeyName , szValue;
//RegDBKeyExist, RegDBCreateKeyEx
STRING szClass;
NUMBER nzSize;
begin
Disable(STATUSEX);
ShowObjWizardPages(NEXT);
Config_Database:
//安装并配置数据库系统
//检查是否已安装mydb数据库
szTempDir = TARGETDIR ^ "Database\\";
szFileName = szTempDir ^ "result.txt";
szProgram = "isql";
szCmdLine = "-U " + szUid + " -P "+ szPwd +
"-Q \"select name from master..sysdatabases where name = 'mydb'\"" +
" -o \"" + szFileName + "\"";
nResult = LaunchAppAndWait(szProgram, szCmdLine, WAIT);
szPath = szTempDir;
OpenFileMode(FILE_MODE_NORMAL);
OpenFile(nvFileHandle, szPath, "result.txt");
nResult = 0;
while (GetLine(nvFileHandle, svLine) = 0)
//如果合法则继续
if (StrCompare(svLine, "(1 row affected)") = 0) then
nResult = 1;
endif;
endwhile;
CloseFile(nvFileHandle);
//如果数据库存在,则跳过数据库安装步骤
if (nResult = 0) then
//得到数据库存放数据文件的目录 szDataDir = "...\\MSSQL7\\Data"
szMsg = "正在安装数据库文件";
SdShowMsg ( szMsg , TRUE );
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE );
szKey = "SOFTWARE\\Microsoft\\MSSQLServer\\Setup";
szName = "SQLDataRoot";
nvType = REGDB_STRING;
RegDBGetKeyValueEx(szKey, szName, nvType, svValue, nvSize);
szDataDir = svValue ^ "Data\\";
//拷贝数据库文件和日志文件到szDataPath
Disable(LOGGING);
szSrcFile = TARGETDIR ^ "Database\\mydb.mdf";
szTargetFile = szDataDir ^ "mydb.mdf";
CopyFile ( szSrcFile , szTargetFile );
szSrcFile = TARGETDIR ^ "Database\\mydb_log.ldf";
szTargetFile = szDataDir ^ "mydb_log.ldf";
CopyFile ( szSrcFile , szTargetFile );
Enable(LOGGING);
//执行SQL文件恢复数据库文件与系统的连接
szProgram = "isql";
szTempDir = TARGETDIR ^ "Database\\";
szFileName = szTempDir ^ "result.txt";
szCmdLine = "-U " + szUid + " -P "+ szPwd +
"-Q \"exec sp_attach_db @dbname=N'mydb', @filename1=N'" +
szDataDir ^ "mydb.mdf', @filename2=N'" +
szDataDir ^ "mydb_log.ldf'\"" +
" -o \""+ szFileName + "\"";
LaunchAppAndWait(szProgram, szCmdLine, WAIT);
SdShowMsg ( szMsg , FALSE );
endif;
szMsg = "正在添加数据库帐号";
SdShowMsg ( szMsg , TRUE );
//添加数据库专用帐号(uid=mydbsa;pwd=mypwd)并设为数据库dbo
szProgram = "isql";
szCmdLine = "-U " + szUid + " -P "+ szPwd +
" -i \""+ TARGETDIR ^ "Database\\addlogin.sql\"" +
" -o \""+ TARGETDIR ^ "Database\\result.txt\"";
LaunchAppAndWait(szProgram, szCmdLine, WAIT);
SdShowMsg ( szMsg , FALSE );
//删除数据库相关的临时文件
szDir = TARGETDIR ^ "Database";
DeleteDir ( szDir , ALLCONTENTS );
//添加ODBC数据源
RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
szKey = "SOFTWARE\\ODBC\\ODBC.INI\\mydb";
szClass = "";
if (RegDBKeyExist ( szKey ) < 0) then
//如果数据源不存在则创建
RegDBCreateKeyEx ( szKey , szClass );
else
//如果数据源已存在,则关闭日志,使之在卸载时不被删除
Disable(LOGGING);
endif;
nzSize = -1;
szName = "Driver";
szValue = WINSYSDIR ^ "sqlsrv32.dll";
RegDBSetKeyValueEx ( szKey , szName , REGDB_STRING , szValue , nzSize ); szName = "Database";
szValue = "mydb";
RegDBSetKeyValueEx ( szKey , szName , REGDB_STRING , szValue , nzSize );
szName = "Server";
szValue = "(local)";
RegDBSetKeyValueEx ( szKey , szName , REGDB_STRING , szValue , nzSize );
Enable(LOGGING);
end;
关于数据库连接的字符串如“DSN=db;UID=test;PWD=123”,我是这样做的:在自己程序中使用自己定义的帐号和密码(如myuid和mypwd),然后在安装的数据库中添加这个帐号并给予自己数据预的dbowner权限。这样别人就不能得到自己的密码了。具体添加和设置帐号的方法在上面的代码中已经有了。
非常感谢!请问你用的是for VC 的InstallShield吗?
我如果只要数据库的表结构和存储过程能不能更简单些呢?有没有什么办法使得在数据库中看不到存储过程的源代码?
请问Dlg_GetDBUser和Dlg_ObjDialogs是什么啊?
另外我的installShield for VC 6.0(光盘自带)中不支持LaunchAppAndWait()
这么办啊?
1、我用的是Installshield 6.2 专业版,不是for VC的。后者功能极其有限,不推荐。
2、想不看到存储结构的代码,在生成时有一个对应的参数(SQL语法)可以将代码加密。
3、Glg_DBUser & Dlg_ObjDialogs都是代码片断,可以用Goto直接跳转过去。
4、找一个IS专业版,买一个正版吧,4000元,支持正版嘛,反正不是自己掏钱:)。