Solved

Web App - Can't retrieve cached dataset

Posted on 2004-10-20
18
196 Views
Last Modified: 2010-04-23
My problem is that I can't seem to get at a cached dataset.  DS_Login1 is the dataset, and at page_load here's my code:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        If Not (IsPostBack) Or IsNothing(Cache.Get("DS_Login")) Then
            Dim connectionString As String
            connectionString = "data source=ga1cdc02;initial catalog=crmdb"
            connectionString &= ";Trusted_Connection=true"
            SqlConnection1.ConnectionString = connectionString
            SqlConnection1.Open() '?

            SqlDataAdapter1.Fill(DS_Login1)

            For x As Integer = 0 To DS_Login1.Tables("users").Rows.Count - 1
                cmbUsers.Items.Add(DS_Login1.Tables("users").Rows(x).Item("User"))
            Next

            Cache.Add("DS_Login", DS_Login1, Nothing, DateTime.MaxValue, System.TimeSpan.FromMinutes(20), Caching.CacheItemPriority.Default, Nothing)
        Else
            DS_Login1 = Cache("DS_Login")
            lblPassWrong.Text = DS_Login1.Tables("users").Rows(0).Item("user")
            lblPassWrong.Visible = True
        End If

    End Sub

Under the else, I get the error of "There is no row at position -1" - so I know it's just not loading the cached dataset back into DS_Login1.  I don't know why though - the code with the caching and the whole if/else/endif to do with (ispostback) is straight out of a Microsoft book.

Thanks!

JP
0
Comment
Question by:gleznov
  • 11
  • 7
18 Comments
 

Author Comment

by:gleznov
ID: 12356900
In case needed, here's the submit button function:

 Private Sub CmdLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdLogin.Click
        Dim selIndex As Integer = -1

        For x As Integer = 0 To DS_Login1.Tables("users").Rows.Count - 1
            If cmbUsers.SelectedValue Is DS_Login1.Tables("users") Then
                selIndex = x
                Exit For
            End If
        Next

        If TxtPass.Text <> DS_Login1.Tables("users").Rows(selIndex).Item("password") Then
            lblPassWrong.Visible = True
            Exit Sub
        End If

        Response.Redirect("MainMenu.aspx")
    End Sub

I read one article that says you have to programatically select an index in some controls or it defaults to -1 - but I don't think this is the case and if so, don't know how to fix it.  I tried putting cmbUsers.selectedindex = 0 after the endif in the page_load sub.

JP
0
 

Author Comment

by:gleznov
ID: 12357615
OK, upping points to maximum - I can't continue my project until I get some assistance.  I'm open to ANYTHING that will allow me to access a dataset after postback.

JP
0
 
LVL 3

Expert Comment

by:RacinRan
ID: 12357636
What's the row count value here when you run it : For x As Integer = 0 To DS_Login1.Tables("users").Rows.Count - 1


racin
0
 

Author Comment

by:gleznov
ID: 12357645
I'm starting to think it's not a dataset problem also - this may be really easy.  I'm now filling the dataset from the button press code.  Still same error.  I think it must have something to do with the combo box?

JP
0
 

Author Comment

by:gleznov
ID: 12357656
Racin: There are 8 rows, and I'm sure they're being accessed fine the first time because the combo box is filled with every user listed in the user column.

JP
0
 

Author Comment

by:gleznov
ID: 12357686
OK, I just injected a label.text to be equal to the row.count for my table inside the button press call.  And it displays 8, which is the correct number.  But if I allow the code to continue

     For x As Integer = 0 To DS_Login1.Tables("users").Rows.Count - 1
            If cmbUsers.SelectedValue Is DS_Login1.Tables("users") Then
                selIndex = x
                Exit For
            End If
        Next

        If TxtPass.Text <> DS_Login1.Tables("users").Rows(selIndex).Item("password") Then
            lblPassWrong.Visible = True
            Exit Sub
        End If

        Response.Redirect("MainMenu.aspx")
    End Sub

then I get the -1 error.

JP
0
 

Author Comment

by:gleznov
ID: 12357697
And that holds true without refilling the dataset in the button code.

JP
0
 
LVL 3

Expert Comment

by:RacinRan
ID: 12357708
does your combo box do a postback when you select something?

racin
0
 

Author Comment

by:gleznov
ID: 12357745
This must be what I'm missing (I'm new to designing web apps) - what code do I need in the combo box to postback?  What does it need to do?

JP
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 3

Expert Comment

by:RacinRan
ID: 12357778
What's selIndex when you pass it in to the dataset here:

 If TxtPass.Text <> DS_Login1.Tables("users").Rows(selIndex).Item("password") Then
0
 

Author Comment

by:gleznov
ID: 12357834
selIndex (selected index) is fingered by which user record is pointed at, in:

Private Sub CmdLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdLogin.Click
>>>        Dim selIndex As Integer = -1

>>>        For x As Integer = 0 To DS_Login1.Tables("users").Rows.Count - 1
>>>            If cmbUsers.SelectedValue Is DS_Login1.Tables("users") Then
>>>                selIndex = x
>>>                Exit For
>>>            End If
>>>        Next

        If TxtPass.Text <> DS_Login1.Tables("users").Rows(selIndex).Item("password") Then
            lblPassWrong.Visible = True
            Exit Sub
        End If

        Response.Redirect("MainMenu.aspx")
    End Sub

So it looks through the dataset for the user that's the same as the one chosen in the combo box (or listbox or whatever it's called in web apps) and then sets the position in the dataset as the selected index selIndex, so that I can reference the password for that user using tables("users").rows(selIndex).item("password")

JP
0
 
LVL 3

Expert Comment

by:RacinRan
ID: 12357934
I know ...  but I'm wondering if it doesn't correctly match the cmbUsers.SelectedValue to DS_Login1.Tables("users") then selIndex = -1 when you get to here:

        If TxtPass.Text <> DS_Login1.Tables("users").Rows(selIndex).Item("password") Then
            lblPassWrong.Visible = True
            Exit Sub
        End If

which is where I think you get the error.

To test this I would see what the count is at For x as integer = 0 to .count -1 and make sure that I have a count 8 still.  Then I would break cmdUsers.SelectedValue into it's own variable and DS_Login1.Tables ... I think i found it...

DS_Login1.Tables("users") is not looking at the actual user's value but rather the whole table.

Try this:

DS_Login1.Tables("users").Rows.(x).Item("User")

Racin
0
 
LVL 3

Expert Comment

by:RacinRan
ID: 12357951
try it here :


>>>            If cmbUsers.SelectedValue Is DS_Login1.Tables("users") Then
0
 

Author Comment

by:gleznov
ID: 12358004
Oh good God.

That was a stupid error on my part - sorry.  But the problem's still the same even after fixing it :(  Here's the new sub:

 Private Sub CmdLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdLogin.Click
        Dim selIndex As Integer = -1

        lblPassWrong.Text = (DS_Login1.Tables("users").Rows.Count)
        lblPassWrong.Visible = True
        'Exit Sub

        For x As Integer = 0 To DS_Login1.Tables("users").Rows.Count - 1
            If cmbUsers.SelectedValue Is DS_Login1.Tables("users").Rows(x).Item("user") Then
                selIndex = x
                Exit For
            End If
        Next

        If TxtPass.Text <> DS_Login1.Tables("users").Rows(selIndex).Item("password") Then
            lblPassWrong.Visible = True
            Exit Sub
        End If

        Response.Redirect("MainMenu.aspx")
    End Sub

I have realized one other thing - the -1 is from selIndex, if I start it at -5, that's the error I get.  I've seen errors that were just the same as -1 so I assumed it wasn't the selIndex, which was also stupid.  stupid stupid stupid.  So basically it's not finding the value in the dataset, which means I must have something wrong with my context.  Is:

            If cmbUsers.SelectedValue Is DS_Login1.Tables("users").Rows(x).Item("user") Then

correct?  I'm used to useing = instead of "is", but it told me it didn't use = for string.  Maybe I did this line wrong?

JP
0
 

Author Comment

by:gleznov
ID: 12358018
Or rather I have something wrong with my compare (lol), not context.

JP
0
 
LVL 3

Accepted Solution

by:
RacinRan earned 500 total points
ID: 12358142

those little code mistype's are so very difficult to find and very annoying when you do ... (primarily because you've just spent a couple hours finding it :) ) been there, done that.


that's my guess ... by breaking it up into to 2 seperate var's you could see what you are trying to compare.  Or pssibly you could try using the .tostring method of both values and using "="

Racin
0
 

Author Comment

by:gleznov
ID: 12358241
cmbUsers.SelectedValue.tostring was all that was needed.  Thank you so much!

JP
0
 
LVL 3

Expert Comment

by:RacinRan
ID: 12358283

Excellent.  You're welcome.

Racin
0

Featured Post

Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

Join & Write a Comment

Since .Net 2.0, Visual Basic has made it easy to create a splash screen and set it via the "Splash Screen" drop down in the Project Properties.  A splash screen set in this manner is automatically created, displayed and closed by the framework itsel…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…

759 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now