检查id和reg是否已存在

时间:2013-06-05 13:36:12

标签: c# asp.net

我有这个表的配置文件,其中包含user_Id和regNo的字段,我想在继续插入数据之前先检查id和email是否已存在。

在我的代码中,我只能验证一行(id或reg编号),但是如果我要验证其中的两行,它会给我一个错误,说“必须声明标量变量@userid ”。我不知道我的选择是错误还是代码中的某些内容。

SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True");
    con.Open();
    SqlCommand cmdd = new SqlCommand("select * from Profile where user_Id = @userid AND RegNo = @reg", con);

    SqlParameter param = new SqlParameter();
    //SqlParameter param1 = new SqlParameter();
    param.ParameterName = "@userid";
    param.ParameterName = "@reg";

    param.Value = txtid.Text;
    param.Value = txtregNo.Text;

    cmdd.Parameters.Add(param);
    //cmdd.Parameters.Add(param1);


    SqlDataReader reader = cmdd.ExecuteReader();


        if (reader.HasRows)
        {
            MessageBox("User Id/Registry Number already exists");
        }


        else
        {
            SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("qry", con);
            cmd.CommandType = System.Data.CommandType.Text;

            cmd.Parameters.AddWithValue("@id", txtid.Text);
            cmd.Parameters.AddWithValue("@regno", txtregNo.Text);
            cmd.Parameters.AddWithValue("@name", txtname.Text);

            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            con.Open();
            cmd.ExecuteNonQuery();
            MessageBox("successfully saved!");

        }

我正在使用C#和asp.net。

4 个答案:

答案 0 :(得分:2)

好的,所以这不会起作用:

SqlParameter param = new SqlParameter();
//SqlParameter param1 = new SqlParameter();
param.ParameterName = "@userid";
param.ParameterName = "@reg";

param.Value = txtid.Text;
param.Value = txtregNo.Text;

cmdd.Parameters.Add(param);

因为您重新分配了同一个对象的值。改为:

cmdd.Parameters.AddWithValue("@userid", txtid.Text);
cmdd.Parameters.AddWithValue("@reg", txtregNo.Text);

这会将参数(其中两个)添加到SqlCommand对象中。 现在,多一点建议,考虑这样做:

using (SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True"))
{
    con.Open();
    using (SqlCommand cmdd = new SqlCommand("select * from Profile where user_Id = @userid AND RegNo = @reg", con))
    {
        ...

        using (SqlDataReader reader = cmdd.ExecuteReader())
        {
            ...
        }
    }
}

因为现在你没有正确处理这些物品。

你知道,任何实现IDisposable的内容都应该包含在using语句中,以确保调用Dispose方法。

答案 1 :(得分:1)

param.ParameterName = "@userid";
param.ParameterName = "@reg";

param.Value = txtid.Text;
param.Value = txtregNo.Text;

您只声明1个参数并覆盖ParameterNameValue

顺便说一句,您应该考虑查看某种类型的数据访问帮助程序或ORM或其他东西,以免您遇到所有样板SQL连接代码的麻烦。

您还打开了应该已经是开放SQL连接的另一个连接。

答案 2 :(得分:0)

根据错误,您的问题是,在将参数分配给@reg后,您要将参数重新分配给@userid

试试这个:

SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True");
con.Open();
SqlCommand cmdd = new SqlCommand("select user_id from Profile where user_Id = @userid AND RegNo = @reg", con);


cmdd.Parameters.AddWithValue("@userid", txtid.Text);
cmdd.Parameters.AddWithValue("@reg", txtregNo.Text);

var id = cmdd.ExecuteReader() as string;

if (String.IsNullOrEmpty(id))
{
    //Show error message and exit the method
}
else
{
    //Add the row to the database if it didn't exist
}

编辑:

我添加了一些代码来说明如何检查表中是否存在userId。然后检查用户ID本身,而不是检查reader对象。注意,我现在不在我的开发计算机上,所以我没有编译它,你可能需要做一些调整,但想法就在那里。

答案 3 :(得分:0)

您正在使用sql参数的一个实例并将其传递给两个不同的值,从而覆盖第一个。试试这样:

SqlParameter param1 = new SqlParameter("@userid", txtid.Text);

SqlParameter param2 = new SqlParameter("@reg", txtregNo.Text);