Solved

c# - Error -> Parameter 'string' not found in the collection.

Posted on 2009-05-18
11
1,332 Views
Last Modified: 2013-12-17
Hi Experts,

           I have written a SP in MYSQL to check the login information and returning a value to the c# code.I am getting the following error :

Aurgument exception was unhandled.
Parameter 'string' not found in the collection.

C# :
 

 private void btnOK_Click(object sender, EventArgs e)

        {

            MySqlConnection myConn = new MySqlConnection(ConfigurationSettings.AppSettings["Con"].ToString());

            MySqlCommand myCommand = new MySqlCommand("sp_LoginCheck", myConn);

            myCommand.CommandType = CommandType.StoredProcedure;

            MySqlParameter myParm = new MySqlParameter();

            myParm = myCommand.Parameters.Add("@UserName", MySqlDbType.VarChar, 50);

            myParm.Value = "srk1";

            myParm = myCommand.Parameters.Add("@Password", MySqlDbType.VarChar, 50);

            myParm.Value = "pwd1";

            myParm = myCommand.Parameters.Add("@DoesExist", MySqlDbType.Bit);

            myParm.Direction = ParameterDirection.Output;

            myConn.Open();

            myCommand.ExecuteNonQuery();

            bool doesExist = (bool)myCommand.Parameters["@DoesExist"].Value;

            if (!doesExist)

            {

                MessageBox.Show("UserName/Password invalid.");

            }

            else

            {

                MessageBox.Show("Logged in successfully.");

            }

            myConn.Close();

        }

________________________________________________

Mysql SP :
 

DELIMITER $$
 

DROP PROCEDURE IF EXISTS `demo`.`sp_LoginCheck`$$
 

CREATE PROCEDURE `demo`.`sp_LoginCheck`(

   

 IN UserName1 varchar(50),

 IN Password1 varchar(50),

 OUT DoesExist bit)   

    BEGIN

 declare userCount INT default 0;

 SET DoesExist = 0; -- set to false initially, we'll assume for now it doesn't exist

 SELECT COUNT(Uid) INTO userCount

 FROM tbl_Users

 WHERE username = username1 and password=password1;

 IF userCount > 0 THEN

  SET DoesExist = 1;  -- more then one returned, return true

 END IF;

    END$$
 

DELIMITER ;

________________________________________________

Open in new window

0
Comment
Question by:srk1982
  • 5
  • 4
  • 2
11 Comments
 
LVL 14

Expert Comment

by:jjardine
ID: 24417905
What line is this casuing an error on?   What happens if you close the connection after running the ExecuteNonQuery and then check the value of the parameter?
0
 
LVL 18

Expert Comment

by:philipjonathan
ID: 24417908
Try if changing the following lines help (use ? instead of @):

myParm = myCommand.Parameters.Add("?UserName", MySqlDbType.VarChar, 50);
myParm = myCommand.Parameters.Add("?Password", MySqlDbType.VarChar, 50);
myParm = myCommand.Parameters.Add("?DoesExist", MySqlDbType.Bit);
bool doesExist = (bool)myCommand.Parameters["?DoesExist"].Value;
0
 

Author Comment

by:srk1982
ID: 24417946
Hi jjardine,

Error is coming in the following line...

myCommand.ExecuteNonQuery();
0
 

Author Comment

by:srk1982
ID: 24417951
Hi philipjonathan,

      I tried your idea, but still the same erorr.


Error is coming in the following line...

myCommand.ExecuteNonQuery();
0
 
LVL 18

Expert Comment

by:philipjonathan
ID: 24418014
Try to use the same name for the parameter (UserName1 and Password1)
myParm = myCommand.Parameters.Add("?UserName1", MySqlDbType.VarChar, 50);
myParm = myCommand.Parameters.Add("?Password1", MySqlDbType.VarChar, 50);
0
DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

 

Author Comment

by:srk1982
ID: 24418034
Hi philipjonathan,

 still same problem !!! :(
0
 
LVL 14

Expert Comment

by:jjardine
ID: 24418049
Your parameters in the code have the @ symbol in front of them, but in the Stored Proc they do not.   Could that be causing an issue?   I don't work with MySQL but within SQL the parameter names are the same so in the sproc they would be @userName   and in the parameter for the command object it would be @userName.
0
 
LVL 18

Accepted Solution

by:
philipjonathan earned 500 total points
ID: 24418108
I search some example on the net, and saw that some don't have '?' in front of argument names.
http://www.aspcode.net/MySQL-DAL-stored-procedures-support-howto-part-14.aspx
http://forums.asp.net/p/988462/1309349.aspx#1309349

I'm not suppose to do trial-and-error with you, but one last try, change the following lines:
myParm = myCommand.Parameters.Add("UserName1", MySqlDbType.VarChar, 50);
myParm = myCommand.Parameters.Add("Password1", MySqlDbType.VarChar, 50);
myParm = myCommand.Parameters.Add("DoesExist", MySqlDbType.Bit);
bool doesExist = (bool)myCommand.Parameters["DoesExist"].Value;

My apologies if this doesn't work
0
 

Author Comment

by:srk1982
ID: 24418136
No opologies philipjonathan.....
Its working great.........
0
 

Author Closing Comment

by:srk1982
ID: 31582833
Thanks.
0
 
LVL 18

Expert Comment

by:philipjonathan
ID: 24418284
Phew! :)
Now I know, I always thought MySQL needs the '?', I was wrong.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
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…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, just open a new email message. In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…

867 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

23 Experts available now in Live!

Get 1:1 Help Now