IIS 6.0IIS 7.0SQL Server 2000IISWebFormsLINQ.NET 3.5SQL Server 2005新手C# 3.0HTML中级开发SQL ServerSQL.NETASP.NETC#
基于 Web 的应用程序配置向导






4.78/5 (9投票s)
一个向导,允许您通过 FTP 将应用程序上传到远程服务器,然后从 Web 浏览器启动配置向导以更新数据库连接。
引言
DotNetNuke 项目包含一套经过时间考验的设置向导,该向导在许多情况下都有效。 您可以使用Web 部署项目,但它需要您在服务器上运行安装程序。 这可能不适用于许多使用共享主机服务器的情况。 此向导允许您通过 FTP 将应用程序上传到远程服务器,然后从 Web 浏览器启动配置向导。
此示例提供了一个 C# 版本的向导,并将其封装到一个页面中,以便您轻松地自定义它。
应用程序
当用户打开未设置的应用程序的第一个页面时,他们会看到此屏幕
显示此内容的原因是以下代码尝试使用 LINQ to SQL Data Context 连接到数据库,该上下文使用web.config中的数据库连接设置。 如果能够连接,它会尝试计算 Users 表中的记录。 数据库可能存在,但 Users 表可能不存在。 这两者都需要存在才能认为设置已完成。 您可以插入代码来检查表中的版本号。 这将允许向导在升级情况下运行。
protected void Page_Load(object sender, EventArgs e)
{
lnkSetup.Visible = !CanConnectToDatabase();
lnkWebApplication.Visible = !lnkSetup.Visible;
}
private bool CanConnectToDatabase()
{
// This method returns true if the database
// exists and the table is created
bool CanConnect = true;
try
{
DataClassesDataContext DataClassesDataContext =
new DataClassesDataContext();
var result = from Users in DataClassesDataContext.Users
select Users;
int intCount = result.Count();
}
catch (Exception e)
{
string strError = e.Message;
CanConnect = false;
}
return CanConnect;
}
该链接会将用户带到向导的第一个页面
DotNetNuke 应用程序需要能够在服务器上创建目录和上传文件。 向导的下一页允许用户执行权限检查。
以下方法调用一系列执行每个检查的方法。 如果所有检查都通过,则会显示“继续下一步”按钮。
protected void btnCheckPermissions_Click(object sender, EventArgs e)
{
int intValidItems = 0;
blPermissions.Items.Clear();
//FolderCreate
ListItem permissionItem = new ListItem();
permissionItem.Text = String.Format("Folder Create - {0}",
((VerifyFolderCreate()) ? "Passed" : "Failed"));
permissionItem.Enabled =
((permissionItem.Text.Contains("Passed")) ? true : false);
blPermissions.Items.Add(permissionItem);
intValidItems = intValidItems +
((permissionItem.Text.Contains("Passed")) ? 1 : 0);
//FileCreate
permissionItem = new ListItem();
permissionItem.Text = String.Format("File Create - {0}",
((VerifyFolderCreate()) ? "Passed" : "Failed"));
permissionItem.Enabled =
((permissionItem.Text.Contains("Passed")) ? true : false);
blPermissions.Items.Add(permissionItem);
intValidItems = intValidItems +
((permissionItem.Text.Contains("Passed")) ? 1 : 0);
//FileDelete
permissionItem = new ListItem();
permissionItem.Text = String.Format("File Delete - {0}",
((VerifyFolderCreate()) ? "Passed" : "Failed"));
permissionItem.Enabled =
((permissionItem.Text.Contains("Passed")) ? true : false);
blPermissions.Items.Add(permissionItem);
intValidItems = intValidItems +
((permissionItem.Text.Contains("Passed")) ? 1 : 0);
//FolderDelete
permissionItem = new ListItem();
permissionItem.Text = String.Format("Folder Delete - {0}",
((VerifyFolderCreate()) ? "Passed" : "Failed"));
permissionItem.Enabled =
((permissionItem.Text.Contains("Passed")) ? true : false);
blPermissions.Items.Add(permissionItem);
intValidItems = intValidItems +
((permissionItem.Text.Contains("Passed")) ? 1 : 0);
lblPermissionCheck.Text = String.Format("Permissions {0}",
((intValidItems == 4) ? "Passed" : "Failed"));
lblPermissionCheck.BackColor =
((intValidItems == 4) ? Color.Green : Color.Red);
// Show the Continue button?
btnPermissionsNext.Visible = ((intValidItems == 4) ? true : false);
}
下一个屏幕允许用户配置数据库连接并对其进行测试
LINQ to SQL 提供了一个 DatabaseExists()
方法,可以轻松地指示连接是否有效
private bool CanConnectToDatabase()
{
string strUserInfo = (!chkIntegrated.Checked) ?
String.Format("Persist Security Info=True;User ID={0};Password={1}",
this.txtUserId.Text, this.txtPassword.Text) : "Integrated Security=True";
strConnection = String.Format("Data Source={0};Initial Catalog={1};{2}",
this.txtServer.Text, this.txtDatabase.Text, strUserInfo);
DataClassesDataContext DataClassesDataContext =
new DataClassesDataContext(strConnection);
return DataClassesDataContext.DatabaseExists();
}
如果连接确实存在,它将存储在web.config中
if (boolCanConnectToDatabase)
{
System.Configuration.Configuration rootWebConfig =
System.Web.Configuration.WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
System.Configuration.ConnectionStringSettings connString;
if (rootWebConfig.ConnectionStrings.ConnectionStrings.Count > 0)
{
connString =
rootWebConfig.ConnectionStrings.ConnectionStrings[
"WebInstallerConnectionString"];
if (connString != null)
{
connString.ConnectionString = strConnection;
rootWebConfig.Save();
}
}
}
向导的下一页检查是否已创建 Users 表(该人员可能只是在移动 SQL server 后运行该向导来修复web.config)。 如果该表存在,它允许用户移动到下一步。 如果它不存在,它会指示“继续”按钮将运行.sql设置脚本。
#region Database Set-up
private void SetupDatabase()
{
DatabaseReady = TableExists();
lblDatabaseSetup.Text = (DatabaseReady) ?
"The Database is already set-up. Click continue."
: "Click the Continue button to run the database set-up scripts.";
}
private bool TableExists()
{
bool CanConnect = true;
try
{
DataClassesDataContext DataClassesDataContext =
new DataClassesDataContext();
var result = from Users in DataClassesDataContext.Users
select Users;
int intCount = result.Count();
}
catch (Exception e)
{
string strError = e.Message;
CanConnect = false;
}
return CanConnect;
}
protected void btnDatabaseSetupNext_Click(object sender, EventArgs e)
{
if (!TableExists())
{
try
{
string strSqlScript = GetSQLScript();
DataClassesDataContext DataClassesDataContext =
new DataClassesDataContext();
DataClassesDataContext.ExecuteCommand(strSqlScript);
}
catch (Exception ex)
{
lblDatabaseSetup.Text = ex.Message;
return;
}
}
mvSetupWizard.SetActiveView(vwComplete);
}
private String GetSQLScript()
{
string strSQLScript;
string strFilePath = MapPath(@"~/SQLScripts/Setup.sql");
StreamReader reader = new StreamReader(strFilePath);
strSQLScript = reader.ReadToEnd();
reader.Close();
reader = null;
return strSQLScript;
}
#endregion
向导的最后一页包含一个按钮,可将用户返回到应用程序的第一个页面
现在,程序检测到应用程序已正确设置
关注点
- 用户必须在运行向导之前创建数据库。 虽然您可以在设置时创建数据库,但大多数共享主机服务器不允许您拥有此权限。 要求事先设置数据库在所有情况下都有效。
- 此设置不支持文件模式下的 SQL Server Express。 DotNetNuke 安装向导支持,因此您可以在 DotNetNuke 源代码中找到执行该操作的代码。
- 此向导仅支持 Microsoft SQL server。 示例脚本仅适用于 SQL Server 2005。 可以对其进行修改以支持 SQL Server 2000。
更新
- 我在原始代码中打开了一个流读取器,但没有关闭它! 坏程序员! 现在修复了。