加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

在ASP.NET中使用2个数据库作为会话信息

发布时间:2020-12-16 03:27:10 所属栏目:asp.Net 来源:网络整理
导读:这篇文章最初试图找到问题,我认为这是一个web.config问题.我还认为这是我母版页背后代码中的内容.此处的所有文本都是查找问题的过程的一部分,滚动到底部以获取最新更新. 我的网站允许用户在文本框中键入代码.如果输入了识别的代码,页面将刷新并向该用户显示
这篇文章最初试图找到问题,我认为这是一个web.config问题.我还认为这是我母版页背后代码中的内容.此处的所有文本都是查找问题的过程的一部分,滚动到底部以获取最新更新.

我的网站允许用户在文本框中键入代码.如果输入了识别的代码,页面将刷新并向该用户显示欢迎消息,否则将出现错误消息.我将他们手动输入的代码放入会话中,以便可以提取他们的名字.我不能让会话停留在页面之间.我的所有代码都在母版页的vb页面上,我不知道我做错了什么.

>我被告知要确保EnableSessionState =“true”,但这不适用于母版页.
>我被告知要检查IIS设置,但我不能,因为我没有权限.
>尝试SessionState cookieless =“UseUri”,并以某种方式创建了一个永无止境的重定向循环.
>我调试了函数,并且它们返回值.
>当我输入代码时,文本框会消失,欢迎消息会显示用户的名字和姓氏,所以我知道这有效.
>我已经检查过以确保网站中的任何地方都没有Session.Abandon代码.
>我在页面上为每个Session(“IB”)实例添加了一个Watch,当我在文本框中输入代码时,它们被正确填充.然后,当我点击一个链接移动到另一个页面时,调试器停在我的Page_Load的第一行,Dim ib As String = CType(Session.Item(“IB”),String)和我所看到的所有IB变量马上变成没事.

以下是母版页背后的代码:

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>在我的web.config中设置.
我需要补充一下:

<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>

又一次更新:
这是我尝试的另一件事,由asp.net论坛上的用户建议.这也产生了500内部服务器错误,因此我认为有2个< sessionState>的实例.不是允许的东西.

<sessionState mode="SQLServer"
              cookieless="false"
              timeout="20"
              sqlConnectionString="IBConnectionString">
</sessionState>
<sessionState mode="SQLServer"
              cookieless="false"
              timeout="20"
              sqlConnectionString="BackUpConnectionString">
</sessionState>

更多:
sessionState已被更改,并且该站点仍然像以前一样,ConnectionString必须与第二个数据库失去它的会话的问题有任何关系.它必须是代码背后的东西,我想不出web.config还有什么问题.

<sessionState mode="InProc" timeout="20"></sessionState>

我们还发现会话变量仍然存在,当它连接到备份数据库连接时,它不会显示用户的信息.

经过深思熟虑和挫折之后,我问老板,如何合并数据库是多么困难.虽然备份帐户数据库中有超过2400条记录,但实际上没有其他选项.我预计不会很快找到解决方案,我已经浪费了一个月的时间……感谢大家的帮助.

如果我想做点什么,我会回来编辑这篇文章!

解决方法

首先,删除页面的Init部分中的代码.这是不必要的.

其次,为什么在部分代码中将会话的IB值设置为True?它覆盖了帐号.改变两个..

Session("IB") = True

Session("IB") = args.Value

或者只是在这一点上甚至不搞乱会话……应该已经从IBTextBoxButton_Click Sub Routine设置了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读