在ASP.NET中使用2个数据库获取会话信息
这篇文章最初是想找出这个问题,我认为这是一个web.config问题。我还以为这是我主页背后的代码。这里的所有文字都是查找问题过程的一部分,滚动到底部查看最新更新 我的网站允许用户在文本框中键入代码。如果输入了可识别的代码,页面将刷新并向该用户显示欢迎消息,否则将出现错误消息。我把他们手工输入的代码放到一个会话中,这样他们的名字就可以被提取出来。我无法使会话停留在页面之间。我所有的代码都在母版页的vb页面上,我不知道我做错了什么在ASP.NET中使用2个数据库获取会话信息,asp.net,vb.net,session,pageload,page-init,Asp.net,Vb.net,Session,Pageload,Page Init,这篇文章最初是想找出这个问题,我认为这是一个web.config问题。我还以为这是我主页背后的代码。这里的所有文字都是查找问题过程的一部分,滚动到底部查看最新更新 我的网站允许用户在文本框中键入代码。如果输入了可识别的代码,页面将刷新并向该用户显示欢迎消息,否则将出现错误消息。我把他们手工输入的代码放到一个会话中,这样他们的名字就可以被提取出来。我无法使会话停留在页面之间。我所有的代码都在母版页的vb页面上,我不知道我做错了什么 我被告知要确保EnableSessionState=“true”
- 我被告知要确保
,但这在母版页上不起作用EnableSessionState=“true”
- 我被告知要检查IIS设置,但我不能,因为我没有权限李>
- 尝试了
,但不知何故创建了一个永无止境的重定向循环SessionState cookieless=“UseUri”
- 我已经调试了这些函数,它们确实返回了值李>
- 当我输入代码时,文本框确实会消失,并且欢迎消息会显示用户的名字和姓氏,所以我知道这是可行的
- 我已检查以确保没有
会话。在站点中的任何位置放弃
代码
- 我在页面上的每个
实例中添加了一个会话(“IB”)
,当我在文本框中输入代码时,这些实例被正确填写。然后,当我点击一个链接移动到另一个页面时,调试器在我的Watch
的第一行停止,页面加载
,我观察到的所有ib变量立即变成Dim ib As String=CType(Session.Item(“ib”),String)
李>Nothing
以下是母版页的代码:
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)
Dim LastName As String = CType(Session("Last_Name"), String)
Dim Name As String = CType(Session("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, 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
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, 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
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>
<sessionState mode="InProc" cookieless="false" timeout="20" sqlConnectionString="Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***">
</sessionState>
现在的问题是,我的web.config
文件的
部分中只列出了一个数据库,而我的会话的信息来自两个数据库。我尝试添加第二个
,但它抛出了一个错误
有没有办法包含第二个数据库?
如果我不这样做,我的一半会话将留在整个网站上,一半将消失。顺便说一句,我与数据库的创建没有任何关系,这一切都是在我的时代之前完成的
我在web.config中尝试了此方法,但也不起作用:
<sessionState mode="InProc"
cookieless="false"
timeout="20"
sqlConnectionString="IBConnectionString, BackUpConnectionString">
</sessionState>
我们还发现会话变量仍然存在,它只是在连接到备份数据库连接时不会显示用户的信息
经过深思熟虑和挫折之后,我问我的老板仅仅合并数据库有多难。尽管备份帐户数据库中有2400多条记录,但实际上没有其他选择。我预计我不会很快找到解决方案,我已经为此浪费了一个月的时间……谢谢大家的帮助
如果我真的发现了什么,我会回来编辑这篇文章 首先,删除页面初始部分中的代码。这是不必要的
第二,为什么在部分代码中将会话的IB值设置为True?它正在覆盖帐号。两者都改变
Session("IB") = True
到
或者甚至不要在此时干扰会话。应该已经从IBTextBoxButton\u Click子例程中设置了会话。确保在web.config中启用了会话状态。如果将其设置为“StateServer”或“SQLServer”,则出于测试目的将其更改为“InProc”,以排除外部故障依赖项
<sessionState mode="InProc" />
此外,我还看到在过去抛出的异常似乎“吃掉”了会话。寻找可能给您带来问题的try/catch块
单步执行代码通常会显示问题,但如果不是,我使用的一种技术有时会有所帮助,那就是在代码中乱扔“我在这里”消息
我们的想法是,有时当你能看到哪条线(或接近这条线)似乎在制造问题时,它有助于触发顿悟
例如,您可以转储会话变量状态以及大致的行号,然后在多个点将其输出到web页面
您还应该尽量减少正在调试的代码量
如果您可以将问题隔离到一组较小的代码中,这通常有助于发现问题
**编辑**
显然我只是在扫描。在实际阅读您的帖子后,我发现您已经确定了导致问题的原因。我看不出这行有什么问题,但出于某种原因,我想尝试使用不同的会话变量名。我不知道这是否有用,但这很容易尝试。可能使用更长的会话变量名。如果没有在我面前打开调试器,我不知道还有什么好检查的。您的会话变量都消失了吗?或者仅仅是某些问题?为什么在使用Session(“IB”)或Session.Item(“IB”)时会出现不一致?这种不一致是新的。它与Session(“IB”)
不兼容,所以当我在msdn上阅读更多关于Session的内容时,我将它们全部改为Session.Item
。我一定没有把它们都弄到手。:/而正在消失的正是会话(“IB”)
。如果没有它,它就无法获得名字
、姓氏
、或名字
变量。对于一个写得好的问题+1。维护编辑和概述已经尝试过的内容做得很好。谢谢@sacredfaith:D我理解人们很难提供帮助,因为他们看不到我的机器。rry,没有发布web.config,但这就是我一直在使用的。这就是为什么建议将其更改为UseUri
这是stackoverflow之前使用其他论坛的问题。。。人们建议改变,然后改变
<sessionState mode="InProc" timeout="20"></sessionState>
Session("IB") = True
Session("IB") = args.Value
<sessionState mode="InProc" />