输入字符串的格式不正确

时间:2014-03-15 14:42:57

标签: c# asp.net .net sql-server executescalar

我有一个使用asp / C#.net和SQL server 2008的webforms应用程序。 我有一个登录表单,将验证我的webform网站的访问权限。 这是代码。

SqlConnection an = new SqlConnection(@"Data Source=REZRTECH\SQLEXPRESS;Initial Catalog=Temp;Integrated Security=True");
            an.Open();
            SqlCommand anc = new SqlCommand();
            anc.Connection = an;
            anc.CommandText = "Select * From Logins where User_name = @usr";
            anc.Parameters.AddWithValue("@usr", TextBox1.Text);



            int count = Convert.ToInt32(anc.ExecuteScalar());//throws input string was not in correct format exception.
            if (count == 0)
                {
                    string swa = "User Does Not Exist";
                    ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + swa + "');", true);
                    return;                      
                }
                else
                {
                 //
                    //if user name and password match goto homepage
                    {
                        Response.Redirect("~/Default.aspx");
                    }
                    else
                    {
                        string swa1 = "Invalid Login Credentials";
                        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + swa1 + "');", true);
                    }

我的表行都是nvarchar。 还有一件令我困惑的事情,一个user_name是admin,其对应的密码也是admin。假设我输入除admin之外的任何东西,它成功地给了我用户不存在的错误。那个时候" 输入字符串异常没有被抛出"

任何和所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

发生异常是因为您使用ExecuteScalar - 旨在仅返回单个值 - 并且当它不是时,期望该值为Int32。您的目标似乎是确定用户是否有效。

anc.CommandText = "select cast(count(1) as bit) from Logins where User_name = @usr";

然后,将int count = ...更改为bool isUserValid = (bool)anc.ExecuteScalar()

使用bool代替int count更具描述性和可维护性。如果您不打算将计数用于某事,那么检索计数是没有用的。

答案 1 :(得分:1)

我怀疑您希望获得具有给定Count的用户总数UserName。 如果你想获得Count,你需要遵循以下SELECT命令语法:

SELECT COUNT(*) from [TableName] WHERE CNDITION;

所以你在SELECT Statetement中缺少Count(*)。

替换它:

anc.CommandText = "Select * From Logins where User_name = @usr";

有了这个:

anc.CommandText = "Select count(*) From Logins where User_name = @usr";