变量名称“@ID”已经声明。变量名称在查询批处理或存储过程中必须是唯一的
The variable name '@ID' has already been declared. Variable names must be unique within a query batch or stored procedure
我已经构建了一个搜索功能,可以按 ID 和姓氏进行搜索。
到目前为止,这是我的代码:
SqlCommand cmd = new SqlCommand("SELECT [ID],[Name],[LastName],[FirstName],[FinalGrade] FROM DATABASE WHERE ID = @ID OR LastName = @lname");
using (SqlConnection con = new SqlConnection(conString))
{
cmd.Connection = con;
con.Open();
cmd.Parameters.AddWithValue("@ID", ID);
cmd.Parameters.AddWithValue("lname",lname);
/*if (ID == null)
{
unitsParam.Value = DBNull.Value;
}*/
if(String.IsNullOrEmpty(ID))
{
cmd.Parameters.AddWithValue("@ID", DBNull.Value);
}
if (String.IsNullOrEmpty(lname))
{
cmd.Parameters.AddWithValue("@lname", DBNull.Value);
}
using (SqlDataReader sdr = cmd.ExecuteReader())
if (sdr.HasRows)
{
while (sdr.Read())
{
int i = 0;
// vm.SearchResults.Add(new ApqcrDirSearch
ApqcrDirModel aRec = new ApqcrDirModel();
aRec.ID = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
aRec.Name = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
aRec.LastName = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
aRec.FirstName = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
vm.SearchResults.Add(aRec);
}
}
con.Close();
}
如何同时按 ID 和 LastName 进行搜索?我必须使用 SqlCommandParameter
吗?如果是,如何?
您添加了两次参数。不要使用 AddWithValue
,而是使用 Add
,然后您可以检查 ID
或 Name
是否为 null 或空,如下所示:
cmd.Parameters.Add("@ID", SqlDbType.VarChar)
.Value = string.IsNullOrEmpty(ID) ? (object)DBNull.Value : ID;
cmd.Parameters.Add("@lname", SqlDbType.VarChar)
.Value = string.IsNullOrEmpty(lname) ? (object)DBNull.Value : lname;
注意:我猜 VarChar
,可能是不同的类型。
您收到错误消息的原因:"The variable name '@ID' has already been declared. Variable names must be unique within a query batch or stored procedure"
是因为你声明参数 @ID
两次。您还声明了 @lname
参数两次。从您的方法中删除以下代码,错误不应再次出现:
if(String.IsNullOrEmpty(ID))
{
cmd.Parameters.AddWithValue("@ID", DBNull.Value);
}
if (String.IsNullOrEmpty(lname))
{
cmd.Parameters.AddWithValue("@lname", DBNull.Value);
}
以上代码实现起来没有意义。在进入该方法之前,您应该检查 lastname 和 id 参数是否为空。把它想象成输入验证。
可以使用
cmd.Parameters.Clear();
在con.Open();
之后
会清除其他参数
我已经构建了一个搜索功能,可以按 ID 和姓氏进行搜索。
到目前为止,这是我的代码:
SqlCommand cmd = new SqlCommand("SELECT [ID],[Name],[LastName],[FirstName],[FinalGrade] FROM DATABASE WHERE ID = @ID OR LastName = @lname");
using (SqlConnection con = new SqlConnection(conString))
{
cmd.Connection = con;
con.Open();
cmd.Parameters.AddWithValue("@ID", ID);
cmd.Parameters.AddWithValue("lname",lname);
/*if (ID == null)
{
unitsParam.Value = DBNull.Value;
}*/
if(String.IsNullOrEmpty(ID))
{
cmd.Parameters.AddWithValue("@ID", DBNull.Value);
}
if (String.IsNullOrEmpty(lname))
{
cmd.Parameters.AddWithValue("@lname", DBNull.Value);
}
using (SqlDataReader sdr = cmd.ExecuteReader())
if (sdr.HasRows)
{
while (sdr.Read())
{
int i = 0;
// vm.SearchResults.Add(new ApqcrDirSearch
ApqcrDirModel aRec = new ApqcrDirModel();
aRec.ID = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
aRec.Name = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
aRec.LastName = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
aRec.FirstName = sdr.IsDBNull(i) ? null : sdr.GetString(i);
i++;
vm.SearchResults.Add(aRec);
}
}
con.Close();
}
如何同时按 ID 和 LastName 进行搜索?我必须使用 SqlCommandParameter
吗?如果是,如何?
您添加了两次参数。不要使用 AddWithValue
,而是使用 Add
,然后您可以检查 ID
或 Name
是否为 null 或空,如下所示:
cmd.Parameters.Add("@ID", SqlDbType.VarChar)
.Value = string.IsNullOrEmpty(ID) ? (object)DBNull.Value : ID;
cmd.Parameters.Add("@lname", SqlDbType.VarChar)
.Value = string.IsNullOrEmpty(lname) ? (object)DBNull.Value : lname;
注意:我猜 VarChar
,可能是不同的类型。
您收到错误消息的原因:"The variable name '@ID' has already been declared. Variable names must be unique within a query batch or stored procedure"
是因为你声明参数 @ID
两次。您还声明了 @lname
参数两次。从您的方法中删除以下代码,错误不应再次出现:
if(String.IsNullOrEmpty(ID))
{
cmd.Parameters.AddWithValue("@ID", DBNull.Value);
}
if (String.IsNullOrEmpty(lname))
{
cmd.Parameters.AddWithValue("@lname", DBNull.Value);
}
以上代码实现起来没有意义。在进入该方法之前,您应该检查 lastname 和 id 参数是否为空。把它想象成输入验证。
可以使用
cmd.Parameters.Clear();
在con.Open();
会清除其他参数