我有这个表的配置文件,其中包含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。
答案 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个参数并覆盖ParameterName
和Value
。
顺便说一句,您应该考虑查看某种类型的数据访问帮助程序或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);