1

我有这个表配置文件,其中包含带有 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

4 回答 4

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它上面调用方法。

于 2013-06-05T13:40:34.663 回答
1
param.ParameterName = "@userid";
param.ParameterName = "@reg";

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

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

顺便说一句,您应该考虑研究某种类型的数据访问帮助程序或 ORM 或其他东西来为您省去所有样板 SQL 连接代码的麻烦。

您还在应该已经打开的 SQL 连接中打开另一个连接。

于 2013-06-05T13:39:58.790 回答
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对象。注意,我现在不在我的开发计算机上,所以我没有编译这个,你可能需要做一些调整,但想法就在那里。

于 2013-06-05T13:40:24.433 回答
0

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

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

SqlParameter param2 = new SqlParameter("@reg", txtregNo.Text);
于 2013-06-05T13:40:33.507 回答