Link to home
Start Free TrialLog in
Avatar of AnnaCfl
AnnaCfl

asked on

Problem with recordset..

Hi!
This is what I'm trying to do.
A user should be able to receive an email with his/hers username and password throug the use of a page where they fill in their email. My thougt is that I let them fill out a form that contains one textfield where they fill in their email and I than check if that email is in the database and if so return an email to the same adress containing the users username and password.

This is how far I have got.
I have the regular loginpage.asp that contains a href that go to mail.asp.
Mail.asp contains the form the user fills in. On submit Mail.asp calls mailpassword.asp.

This far it's working:-) I can recieve an email containing the value inserted in the field epost in the form in Mail.asp.

For now I'm just trying to check if the email posted in the form is in the database. That's why I don't look for username and password anywhere!

But I don't get it to work with the database.
I'm sure it's the syntax that's wrong. I've tested my connection outside of this application and it works. But I don't get this to work.

This is some of my code in mailpassword.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="Connections/mail.asp" -->
<%
Response.Expires = 0
%>
<%
Dim sAnvNamn, sAnvLosen, sAnvepost
Dim iErr, sRedirectUrl
iErr = 1

' *** Check if epost is in database
  if Request.Form.Count > 0 then
     Dim rs, sQuery , flag, usermail
     
     Usermail= Request.querystring("epost")    
     flag="ADODB.Recordset"
       set rs = Server.CreateObject(flag)
       rs.ActiveConnection = mail_STRING
     rs.Source = "SELECT Email"    
       rs.CursorType = 0
      rs.CursorLocation = 2
       rs.LockType = 3
       rs.Open    
     'rs.Source = rs.Source & " FROM dbo.UserData WHERE Email='" & Replace(MM_valUsername,"'","''") & "'"
     rs.Source = select Email from dbo.UserData where Email='" & Request.querystring("epost") & "'"
     
       
          if rs.RecordCount > 0 then
               sAnvepost = rs("Email")
               iErr = 0
          end if          
     rs.Close
     if iErr <> 0 then 'gör om en felsida
          sRedirectUrl = ""
     end if    


Epost = Request.querystring("epost")
 
'***Send the results via email to someone
 dim smtp
 Set smtp = Server.CreateObject("CDONTS.NewMail")
 
 smtp.MailFormat = 0 '(Mime format)
 smtp.From = Epost
 smtp.To = Epost
 smtp.Subject = ""
 smtp.Body = ": " & vbcrlf&_
                + "" & vbcrlf&_
               + "Username= " + Epost& vbcrlf&_    
               + "Password= " + Epost& vbcrlf&_
               + "" & vbcrlf&_
               + "Good luck! " 

               
  smtp.Send
  Set smtp = Nothing
end if
%>

Is there anyone outthere that can help me with this?
Is it just the string rs.Source = select Email from dbo.UserData where Email='" & Request.querystring("epost") & "'" or is it something else?
The query works fine in analyzer.

Help please!!
     
Avatar of AlfaNoMore
AlfaNoMore

Your old code and new code is all a bit messed up. Tyr this instead:

if Request.Form.Count > 0 then
    Dim rs, sQuery , flag, usermail
   
    Usermail= Request.querystring("epost")    
    flag="ADODB.Recordset"
      set rs = Server.CreateObject(flag)
      rs.ActiveConnection = mail_STRING
      rs.Source = select Email from dbo.UserData where Email='" & Usermail & "'"
      rs.CursorType = 0
      rs.CursorLocation = 2
      rs.LockType = 3

      rs.Open()

You were opening the Recordset with the statement "SELECT email", and once your rs was open, you performed the actual string!
Avatar of AnnaCfl

ASKER

Uupps, but now I've tried the code you posted, and it still doesn't work:-(

This is how my code looks now.

<%
if Request.Form.Count > 0 then
   Dim rs, sQuery , flag, Usermail, sAnvepost
   
   Usermail= Request.querystring("epost")    
   flag="ADODB.Recordset"
     set rs = Server.CreateObject(flag)
     rs.ActiveConnection = mail_STRING
     rs.Source = select Email from dbo.UserData where Email='" & Usermail & "'"
     rs.CursorType = 0
     rs.CursorLocation = 2
     rs.LockType = 3
     rs.Open()
if rs.RecordCount > 0 then
          sAnvepost = rs("Email")
end if    
Epost = Request.querystring("epost")
 
'***Send the results via email to someone
 dim smtp
 Set smtp = Server.CreateObject("CDONTS.NewMail")
 
 smtp.MailFormat = 0 '(Mime format)
 smtp.From = Epost
 smtp.To = Epost
 smtp.Subject = ""
 smtp.Body = ": " & vbcrlf&_
                + "" & vbcrlf&_
               + "Username= " + Epost& vbcrlf&_
               + "Password= " + Epost& vbcrlf&_
               + "" & vbcrlf&_
               + "Good luck! " 

               
  smtp.Send
  Set smtp = Nothing
end if
%>
So what's not happening? Any errors?
Something looks weird to me:

--- Snippet of your code ---
if Request.Form.Count > 0 then
--- End snipped ---
   
First you check to see if Request.Form.Count is greater than zero, which is fine.  That implies you are using the POST method in the form where the user submits their email.

--- Snippet of your code ---
rs.Source = select Email from dbo.UserData where Email='" & Request.querystring("epost") & "'"
--- End snippet ---

But further down you have the above code.  On that line you are pulling the epost variable from Request.QueryString, which implies you used the GET method in the form where the user submits their email.

So you have to decide which form method you are going to use.  If its GET, use QueryString and not Form.  If its POST, use Form and not QueryString.

Thats about all I can see wrong.
you can use both the POST and GET method in your form it doesn't matter. It only depends on the way you want to collect the values of the variables. I don't think that's the problem.

I have one advice for you :
put all the information that you get through Requests into variables once and for all and use only the variables afterwards to get the information. I see you use Request.querystring("epost") too often while you can just put it in a variable in the beginning of your code and then use only this variable. This minimizes A LOT the time of execution cause you don't always access the information on the server.
You are right that you can use either GET or POST to send the form.  But it does matter what you use since your ASP scripts needs to correspond with your choice.  Each method has its own way to "collect the data" as you put it.

As I pointed out, if you use the GET method then the Request.QueryString collection is populated with the form data.

If you use the POST method then the Request.Form collection is populated with the form data.

If you want to get the form data no matter what method was used, Request("epost") would work.  Ive never actually seen anyone recommend you do it that way, but its always an option.
I agree but you can get some variables through the querystring statement and others through the request.form statement in the SAME FORM. You're not obliged to use one method and stick with it in the form.
for example :
in a page named info.asp you could have a submit button that calls a page verify_info.asp?email=bob@bob.com

in the verify_info.asp page you would access the email with the querystring method while you get other values that the user entered through the request.form method...
right?

I agree but you can get some variables through the querystring statement and others through the request.form statement in the SAME FORM. You're not obliged to use one method and stick with it in the form.
for example :
in a page named info.asp you could have a submit button that calls a page verify_info.asp?email=bob@bob.com

in the verify_info.asp page you would access the email with the querystring method while you get other values that the user entered through the request.form method...
right?

Yes, you're right.  Im not sure what your point in relation to this question is though.
I agree but you can get some variables through the querystring statement and others through the request.form statement in the SAME FORM. You're not obliged to use one method and stick with it in the form.
for example :
in a page named info.asp you could have a submit button that calls a page verify_info.asp?email=bob@bob.com

in the verify_info.asp page you would access the email with the querystring method while you get other values that the user entered through the request.form method...
right?

Avatar of AnnaCfl

ASKER

Hi, I've read your interesting discussions. To bad for me, so far none of it helps me with my problem:-(

Yes, I use the get method in the form that calls mailpassword.asp.

I've now changed to if Request.querystring.Count > 0 then
as suggested.
The error I receive when I run the page is, page not found
HTTP 500 - Internal servererror

Anyone, any new suggestion what the problem can be?

Hopefully waiting for a good suggestion :-)

/Anna

My code:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="Connections/mail.asp" -->
<%
Response.Expires = 0
%>
some html
<Body>
<Form>
<%
if Request.querystring.Count > 0 then
   Dim rs, flag, Usermail, SAnvepost
   
   Usermail= Request.querystring("epost")    
   flag="ADODB.Recordset"
     set rs = Server.CreateObject(flag)
     rs.ActiveConnection = mail_STRING
     rs.Source = select Email from dbo.UserData where Email='" & Usermail & "'"
     if rs.RecordCount > 0 then
          sAnvepost = rs("Email")
     end if    
     rs.CursorType = 0
     rs.CursorLocation = 2
     rs.LockType = 3

     rs.Open()

 
'***Send the results via email to someone
 dim smtp
 Set smtp = Server.CreateObject("CDONTS.NewMail")
 
 smtp.MailFormat = 0 '(Mime format)
 smtp.From = "someone"
 smtp.To = sAnvepost
 smtp.Subject = ""
 smtp.Body = ": " & vbcrlf&_
                + "" & vbcrlf&_
               + "Username= " + Usermail& vbcrlf&_
               + "Password= " + Usermail& vbcrlf&_
               + "" & vbcrlf&_
               + "Good luck! " 

               
  smtp.Send
  Set smtp = Nothing
end if
%>
..some html
Avatar of AnnaCfl

ASKER

Hi, I've now tested a few new things. And that led me to another error message. It seems it is in the string
rs.Source = select Email from dbo.UserData where Email='" & Usermail & "'"
the problem is.

This is the error message I receive if I exclude the string.

'rs.Source = select Email from dbo.UserData where Email='" & Usermail & "'"

Microsoft OLE DB Provider for ODBC Drivers error '80040e0c'

This is the error message I recive when I include the string.
Microsoft VBScript compilation error '800a03ea'

Syntax error

/mailpassword.asp, line 95

rs.Source = Select Email from dbo.UserData where Email='" & Usermail & "'"

Command text was not set for the command object.

I've also tested that the if statement works. It does.

I've never worked with recordset objects that way, but I would imagine that you need to put ""'s around the RS.Source line.  IE:

RS.Source = "SELECT EMail FROM DBO.UserData WHERE Email='" & Usermail & "'"
Avatar of AnnaCfl

ASKER

Yes it seems that I forgot the"" part!!!

But something is still wrong. Now I get this error when I'm trying to create a variabel of what selected in the database.

ADODB.Recordset error '800a0e78'
Operation is not allowed when the object is closed.

/mailpassword.asp, line 102

How do I do to be able to use the selected part in db?

<%
Dim rs, flag, Usermail, Userpwd, SAnvepost,iErr, SQL
iErr = 1  
Usermail= Request.querystring("epost")
 
if Request.querystring.Count > 0 then    
     
   flag="ADODB.Recordset"
   set rs = Server.CreateObject(flag)
   rs.ActiveConnection = mail_STRING
 
   SQL = "Select Email from UserData where Email='" & Usermail & "'"
   if rs.RecordCount > 0 then
     sAnvepost = rs("Email")
          'Userpwd = rs("Password")
   iErr = 0    
   end if    
   rs.CursorType = 0
   rs.CursorLocation = 2
   rs.LockType = 3
   rs.Open()
....same code as before

If I had more points to give you, I would!!
Hopefully it's an easy fix for someone who has done this before?!
/Anna
One new problem is that in your most recent change you went from assigning the SQL query to the RS.Source variable to the SQL variable.  But what that error message is probably referring to is the fact that you check RS.RecordCount before calling RS.Open.

So try this:

if Request.querystring.Count > 0 then    
  flag="ADODB.Recordset"
  set rs = Server.CreateObject(flag)
  rs.ActiveConnection = mail_STRING
  RS.Source = "Select Email from UserData where Email='" & Usermail & "'"
  rs.CursorType = 0
  rs.CursorLocation = 2
  rs.LockType = 3
  rs.Open()
  if rs.RecordCount > 0 then
    sAnvepost = rs("Email")
         'Userpwd = rs("Password")
  iErr = 0    
  end if    
Avatar of AnnaCfl

ASKER

Yes, you were right about that (rs.Open()), thank you!
But one new problem arised..
RecordCount never becomes > 0.
So it seems somethings still wrong...cause in the analyzer query still works fine. And what I'm trying to find is in the database! Now I don't get any errors but it seems it never checks in the database or what do you think? When I run this I always get my "else" message "Count no".

/Anna

This is how my code looks now.

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="Connections/mail.asp" -->
<%
Response.Expires = -1
%>

..some html...
<%
Dim rs, flag, Usermail, Userpwd, SAnvepost,iErr
iErr = 1
Usermail= Request.querystring("epost")
if Request.querystring.Count > 0 then    
 flag="ADODB.Recordset"
 set rs = Server.CreateObject(flag)
 rs.ActiveConnection = mail_STRING
 RS.Source = "Select Email from dbo.UserData where Email='" & Usermail & "'"
 rs.CursorType = 0
 rs.CursorLocation = 2
 rs.LockType = 3
 rs.Open()
 if rs.RecordCount > 0 then    
         sAnvepost = rs(Email)
        'Userpwd = rs("Password")
       iErr = 0    
 else
     response.write("Count no")
 end if  

'***Send the results via email to someone
 if iErr = 0 then

 dim smtp
 Set smtp = Server.CreateObject("CDONTS.NewMail")
 
 smtp.MailFormat = 0 '(Mime format)
 smtp.From = "someone"
 smtp.To = Usermail
 smtp.Subject = ""
 smtp.Body = ": " & vbcrlf&_
                + "" & vbcrlf&_
               + "Username= " + Usermail& vbcrlf&_
               + "Password= " + Usermail& vbcrlf&_
               + "" & vbcrlf&_
               + "Good luck! " 

     
  smtp.Send
  Set smtp = Nothing
  end if
end if
%>

...some html...
Avatar of AnnaCfl

ASKER

Hello again!!
I've now tried to use a dsnless connection to see if that worked better. But no:-( Maybe someone have any suggestion how to move on from here. Either using my old code or this one with dsnless connection. Both result in the same problem as mentioned before. The recordcount never becomes > 0

Please help me!!!

This is my new code:

<%
Dim Usermail, sql, sAnvepost, iErr
iErr = 1
Usermail= Request.querystring("epost")
if Request.querystring.Count > 0 then

   Dim strConn
   Dim objConnection
   Dim rs

   set objConnection = Server.CreateObject("ADODB.Connection")
   strConn = "Provider=SQLOLEDB; Data Source=name of my server; Initial Catalog=my database; ;User Id=; Password="  
 
   objConnection.open strConn
   
   set rs=Server.CreateObject("ADODB.recordset")
   
   sql = "Select Email from dbo.UserData where Email='" & Usermail & "'"
   rs.Open sql, strConn
   objConnection.Execute sql
     if rs.RecordCount > 0 then    
              sAnvepost = rs(Email)
             'Userpwd = rs("Password")
            iErr = 0    
      else
          response.write("Count no")
      end if
   rs.Close
   objConnection.close

'end if


'***Send the results via email to someone
if iErr = 0 then
 
 dim smtp
 Set smtp = Server.CreateObject("CDONTS.NewMail")
 
 smtp.MailFormat = 0 '(Mime format)
 smtp.From = ""
 smtp.To = Usermail
 smtp.Subject = ""
 smtp.Body = ": " & vbcrlf&_
                + "" & vbcrlf&_
               + "Username= " + Usermail& vbcrlf&_
               + "Password= " + Usermail& vbcrlf&_
               + "" & vbcrlf&_
               + "Good luck! " 

     
  smtp.Send
  Set smtp = Nothing
end if
end if
%>
Avatar of AnnaCfl

ASKER

Yes, it's me again...
When I changed my If statement to this,
 if rs.RecordCount > 0 then  
    iErr = 0    
 else
 response.write("Count no")
 sAnvepost = rs(Email)
 end if

I receive this message.
ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.

So my question is can the problem be in
sAnvepost = rs(Email)

Please help me to get this right.

Best regards Anna
ASKER CERTIFIED SOLUTION
Avatar of MannSoft
MannSoft

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
That should be RS("Email"), assuming EMail is the name of the column in the table.
Avatar of AnnaCfl

ASKER

Finally!! It's working.
Thank you for your good advices, they all added up to a good result. My last change was to add these lines.
Const adOpenStatic = 3
Const adLockOptimistic = 3
rs.Open sql, strConn, adOpenStatic, adLockOptimistic
I can do it this way as well and exclude const ..
rs.Open sql, strConn, 3, 3

Thanks again
/Anna