在ASP.NET中使用2个数据库作为会话信息
这篇文章最初试图找到问题,我认为这是一个web.config问题.我还认为这是我母版页背后代码中的内容.此处的所有文本都是查找问题的过程的一部分,滚动到底部以获取最新更新.
我的网站允许用户在文本框中键入代码.如果输入了识别的代码,页面将刷新并向该用户显示欢迎消息,否则将出现错误消息.我将他们手动输入的代码放入会话中,以便可以提取他们的名字.我不能让会话停留在页面之间.我的所有代码都在母版页的vb页面上,我不知道我做错了什么. >我被告知要确保EnableSessionState =“true”,但这不适用于母版页. 以下是母版页背后的代码: Imports System.Data Imports System.Data.SqlClient Imports System.Data.OleDb Partial Class MasterPage Inherits System.Web.UI.MasterPage Protected Sub Page_Load(ByVal sender As Object,ByVal e As System.EventArgs) Dim BAccount As String = CType(Session("BAccount"),String) If Not IsPostBack Then If Session("BAccount") Is Nothing Then 'no such value in session state,show textbox for IB to enter code IBText.Visible = True IBTextBox.Visible = True IBTextBoxButton.Visible = True lbNotIB.Visible = False Else 'call function GetSessionValues(BAccount) End If End If End Sub Protected Function GetSessionValues(ByVal Code As String) As Boolean Dim FirstName As String = CType(Session("First_Name"),String) Dim LastName As String = CType(Session("Last_Name"),String) Dim Name As String = CType(Session("Name"),String) If GetAccountName(FirstName,LastName) Then 'hide textbox IBText.Visible = False IBTextBox.Visible = False IBTextBoxButton.Visible = False 'show welcome message to user if IB code exists in database lblIB.Visible = True lblIB.Text = "Welcome," + Session("First_Name") + " " + Session("Last_Name") + "." lbNotIB.Visible = True lbNotIB.Text = "Not " + Session("First_Name") + " " + Session("Last_Name") + "?" Return True ElseIf GetBackUpAccountName(Name) Then 'hide textbox IBText.Visible = False IBTextBox.Visible = False IBTextBoxButton.Visible = False 'show welcome message to user if IB code exists in database lblIB.Visible = True lblIB.Text = "Welcome," + Session("Name") + "." lbNotIB.Visible = True lbNotIB.Text = "Not " + Session("Name") + "?" Return True Else 'IB code not found 'shows error message in red lblIB.ForeColor = Drawing.Color.Red lblIB.Text = "Account not found,please try again." Return False End If End Function Private Function GetAccountName(ByRef FirstName As String,ByRef LastName As String) As Boolean 'declare variable Dim BAccount As String = CType(Session("BAccount"),String) 'sql statement for baccount information Dim sql As String = "SELECT BAccount,First_Name,Last_Name FROM IB INNER JOIN IB_BUISNESS_INFORMATION ON (IB.IB_ID = IB_BUISNESS_INFORMATION.IB_ID) WHERE BAccount = @BAccount" Using conn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("IBConnectionString").ConnectionString) Using cmd As New SqlCommand(sql,conn) cmd.Parameters.AddWithValue("@BAccount",SqlDbType.VarChar) cmd.Parameters("@BAccount").Value = IBTextBox.Text If IBTextBox.Text Is Nothing Then cmd.Parameters("@BAccount").Value = DBNull.Value Else cmd.Parameters("@BAccount").Value = IBTextBox.Text End If conn.Open() Using rdr As SqlDataReader = cmd.ExecuteReader If (rdr.Read) Then FirstName = rdr("First_Name").ToString() LastName = rdr("Last_Name").ToString() Return True Else Return False End If End Using conn.Close() End Using End Using End Function Private Function GetBackUpAccountName(ByRef Name As String) As Boolean 'declare variable Dim BAccount As String = CType(Session("BAccount"),String) 'sql statement for baccount information in case BAccount is not found,search here next Dim backupsql As String = "SELECT BAccount,Name FROM brokermaster WHERE BAccount = ?" Using conn As New OleDbConnection(System.Configuration.ConfigurationManager.ConnectionStrings("BackUpConnectionString").ConnectionString) Using cmd As New OleDbCommand(backupsql,conn) cmd.Parameters.AddWithValue("?",SqlDbType.VarChar) cmd.Parameters("?").Value = IBTextBox.Text If IBTextBox.Text Is Nothing Then cmd.Parameters("?").Value = DBNull.Value Else cmd.Parameters("?").Value = IBTextBox.Text End If conn.Open() Using backuprdr As OleDbDataReader = cmd.ExecuteReader If (backuprdr.Read) Then Name = backuprdr("Name").ToString() Return True Else Return False End If End Using conn.Close() End Using End Using End Function Protected Sub CustomValidator1_ServerValidate(ByVal source As Object,ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate 'declare variables Dim FirstName As String = CType(Session("First_Name"),String) If (Not GetSessionValues(args.Value)) Then args.IsValid = False Else args.IsValid = True End If If GetAccountName(FirstName,LastName) Then 'set session variables Session("First_Name") = FirstName Session("Last_Name") = LastName 'hide textbox IBText.Visible = False IBTextBox.Visible = False IBTextBoxButton.Visible = False args.IsValid = True 'show welcome message to user if IB code exists in database lblIB.Visible = True lblIB.Text = "Welcome," + Session("First_Name") + " " + Session("Last_Name") + "." ElseIf GetBackUpAccountName(Name) Then 'set session variables Session("Name") = Name 'hide textbox IBText.Visible = False IBTextBox.Visible = False IBTextBoxButton.Visible = False args.IsValid = True 'show welcome message to user if IB code exists in database lblIB.Visible = True lblIB.Text = "Welcome," + Session("Name") + "." Else 'IB code not found args.IsValid = False 'shows error message in red lblIB.ForeColor = Drawing.Color.Red lblIB.Text = "Account not found,please try again." End If End Sub Protected Sub IBTextBoxButton_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles IBTextBoxButton.Click If Page.IsValid Then 'declare variables Dim LSD As String = CType(Session("LSD"),String) Dim LSC As String = CType(Session("LSC"),String) Dim BAccount As String = CType(Session("BAccount"),String) Session("BAccount") = IBTextBox.Text 'add session variable If GetCompanyName(LSD) Then Session("LSD") = LSD End If 'add session variable If GetWebsite(LSC) Then Session("LSC") = LSC End If End If End Sub Private Function GetCompanyName(ByRef LSD As String) As Boolean 'declare variable Dim BAccount As String = CType(Session("BAccount"),String) 'sql statement to get company information Dim sql As String = "SELECT Company_Name,BAccount FROM IB_CONTACT_INFORMATION INNER JOIN IB_BUISNESS_INFORMATION ON (IB_CONTACT_INFORMATION.IB_ID = IB_BUISNESS_INFORMATION.IB_ID) WHERE BAccount = @BAccount" Using conn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("IBConnectionString").ConnectionString) Using cmd As New SqlCommand(sql,SqlDbType.VarChar) cmd.Parameters("@BAccount").Value = IBTextBox.Text If IBTextBox.Text Is Nothing Then cmd.Parameters("@BAccount").Value = DBNull.Value Else cmd.Parameters("@BAccount").Value = IBTextBox.Text End If conn.Open() Using rdr As SqlDataReader = cmd.ExecuteReader If (rdr.Read) Then LSD = rdr("Company_Name").ToString() Return True Else Return False End If End Using conn.Close() End Using End Using End Function Private Function GetWebsite(ByRef LSC As String) As Boolean 'declare variable Dim BAccount As String = CType(Session("BAccount"),String) 'sql statement for website information Dim sql As String = "SELECT TOP 1 WebSites,BAccount FROM IB_WEBSITES INNER JOIN IB_BUISNESS_INFORMATION ON (IB_WEBSITES.IB_ID = IB_BUISNESS_INFORMATION.IB_ID) WHERE BAccount = @BAccount" Using conn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("IBConnectionString").ConnectionString) Using cmd As New SqlCommand(sql,SqlDbType.VarChar) cmd.Parameters("@BAccount").Value = IBTextBox.Text If IBTextBox.Text Is Nothing Then cmd.Parameters("@BAccount").Value = DBNull.Value Else cmd.Parameters("@BAccount").Value = IBTextBox.Text End If conn.Open() Using rdr As SqlDataReader = cmd.ExecuteReader If (rdr.Read) Then LSC = rdr("WebSites").ToString() Return True Else Return False End If End Using conn.Close() End Using End Using End Function Protected Sub lbNotIB_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles lbNotIB.Click 'if user is not IB that currently holds session,this will destroy the session and allow them to enter different code Session.Abandon() Response.Redirect(Request.RawUrl) End Sub 结束班 ASPX: <asp:Label ID="IBText" runat="server" Text="Enter your IB code here:"></asp:Label> <asp:TextBox ID="IBTextBox" runat="server"></asp:TextBox> <asp:Button ID="IBTextBoxButton" runat="server" Text="Submit" /> <asp:CustomValidator ID="CustomValidator1" runat="server" ControlToValidate="IBTextBox" ForeColor="Red" OnServerValidate="CustomValidator1_ServerValidate"></asp:CustomValidator> <asp:Label ID="lblIB" runat="server" Text=""></asp:Label> web.config中: <sessionState mode="InProc" cookieless="false" timeout="20" sqlConnectionString="Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"> </sessionState> 更新: <httpModules> <add name="Session" type="System.Web.SessionState.SessionStateModule"/> </httpModules> Reference 现在的问题是,我从2个数据库中提取了这些会话的信息,但在< sessionState>中只列出了1个数据库.我的web.config文件的一部分.我尝试添加第二个< sessionState>但它犯了一个错误. 有没有办法包含第二个数据库? 我在web.config中尝试了这个,但它也不起作用: <sessionState mode="InProc" cookieless="false" timeout="20" sqlConnectionString="IBConnectionString,BackUpConnectionString"> </sessionState> 又一次更新: <sessionState mode="SQLServer" cookieless="false" timeout="20" sqlConnectionString="IBConnectionString"> </sessionState> <sessionState mode="SQLServer" cookieless="false" timeout="20" sqlConnectionString="BackUpConnectionString"> </sessionState> 更多: <sessionState mode="InProc" timeout="20"></sessionState> 我们还发现会话变量仍然存在,当它连接到备份数据库连接时,它不会显示用户的信息. 经过深思熟虑和挫折之后,我问老板,如何合并数据库是多么困难.虽然备份帐户数据库中有超过2400条记录,但实际上没有其他选项.我预计不会很快找到解决方案,我已经浪费了一个月的时间……感谢大家的帮助. 如果我想做点什么,我会回来编辑这篇文章! 解决方法
首先,删除页面的Init部分中的代码.这是不必要的.
其次,为什么在部分代码中将会话的IB值设置为True?它覆盖了帐号.改变两个.. Session("IB") = True 至 Session("IB") = args.Value 或者只是在这一点上甚至不搞乱会话……应该已经从IBTextBoxButton_Click Sub Routine设置了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net <%$...%>语法
- entity-framework – 自定义IdentityUserRole主键
- asp.net-ajax – CollapsiblePanelExtender设置已
- asp.net – 在Visual Studio中禁用浏览器链接选项
- asp.net-mvc – ASP.NET MVC和Visual Studio 201
- 将ASP.NET Web API 2中值类型(C#)的.MinValue序列
- asp.net-mvc-2 – ASP.NET:ActionLink返回相对u
- ASP.NET启动web调试,窗体自动放大的方法
- asp.net – 如何解决找不到ContentPlaceHolder错
- asp.net-mvc – 使用用户标识从移动客户端访问WC