SqlDataReader 找不到行
SqlDataReader no rows found
这是我的代码
public string LeaderIdLookup(string leadername)
{
string step = null;
try
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select EmpId,Fullname from Employee where FullName like '@LeaderName'";
cmd.Parameters.Add(new SqlParameter("LeaderName", SqlDbType.VarChar));
cmd.Parameters["LeaderName"].Value = leadername.Trim();
cmd.Connection = con;
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
step = "assigning the value from datareader to the variable lookup as a string (leaderidlookup) ";
if (dr.HasRows)
Lookup = dr[0].ToString();
else
Lookup = "no rows found";
dr.Close();
return Lookup;
}
catch (SqlException ex)
{
Lasterror = string.Format("step {0} threw sql error {1}", step, ex.Message);
Debug.Print(Lasterror);
return string.Empty;
}
catch (Exception ex)
{
Lasterror = string.Format("step {0} threw error {1}", step, ex.Message);
Debug.Print(Lasterror);
return string.Empty;
}
}
问题是 SqlDataReader 没有 return 任何行
我有一种预感,它与参数替换有关,因为当我在其中硬编码一个名称而不是使用参数时,它可以完美地工作
我似乎无法弄清楚我哪里出错了。
你的 SqlConnection 在哪里?尝试如下所示的内容。
有关连接字符串示例,请参见此处:https://msdn.microsoft.com/en-us/library/ms254500(v=vs.110).aspx#Anchor_2
您的连接字符串将是这样的:"Data Source=localhost;Initial Catalog=MyDataBaseName;Integrated Security=true"(假设您正在连接到本地主机并且您的帐户当然对数据库具有特权)
try
{
using (SqlConnection sqlConnection = new SqlConnection("put your connection string here"))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("select EmpId,Fullname from Employee where FullName like @LeaderName", sqlConnection))
{
sqlCommand.CommandType = System.Data.CommandType.Text;
sqlCommand.Parameters.Add("@LeaderName", SqlDbType.VarChar).Value = leadername;
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
//lots of options here, read it how you like...
string EmpID = sqlDataReader["EmpID"].ToString();
string FullName = sqlDataReader["FullName"].ToString();
}
}
}
}
catch (Exception ex) { throw new System.ArgumentException(ex.Message); }
您需要删除查询中变量名两边的单引号。否则,您将在 FullName
和 "@LeaderName"
之间进行文字比较......这不太可能存在(您没有行的原因)。您还需要提供带有前导 @
的参数名称。
cmd.CommandText = "select EmpId,Fullname from Employee where FullName like @LeaderName";
var leaderParameter = cmd.Parameters.Parameters.Add("@LeaderName", System.Data.SqlDbType.NVarChar);
leaderParameter.Value = "%" + leaderName.Trim() + "%";
您需要删除 "LIKE '@LeaderName'" 两边的引号,并且必须以 @ 开头指定参数名称。所以:
... new SqlParameter("@LeaderName", ...
这是我的代码
public string LeaderIdLookup(string leadername)
{
string step = null;
try
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select EmpId,Fullname from Employee where FullName like '@LeaderName'";
cmd.Parameters.Add(new SqlParameter("LeaderName", SqlDbType.VarChar));
cmd.Parameters["LeaderName"].Value = leadername.Trim();
cmd.Connection = con;
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
step = "assigning the value from datareader to the variable lookup as a string (leaderidlookup) ";
if (dr.HasRows)
Lookup = dr[0].ToString();
else
Lookup = "no rows found";
dr.Close();
return Lookup;
}
catch (SqlException ex)
{
Lasterror = string.Format("step {0} threw sql error {1}", step, ex.Message);
Debug.Print(Lasterror);
return string.Empty;
}
catch (Exception ex)
{
Lasterror = string.Format("step {0} threw error {1}", step, ex.Message);
Debug.Print(Lasterror);
return string.Empty;
}
}
问题是 SqlDataReader 没有 return 任何行 我有一种预感,它与参数替换有关,因为当我在其中硬编码一个名称而不是使用参数时,它可以完美地工作
我似乎无法弄清楚我哪里出错了。
你的 SqlConnection 在哪里?尝试如下所示的内容。 有关连接字符串示例,请参见此处:https://msdn.microsoft.com/en-us/library/ms254500(v=vs.110).aspx#Anchor_2
您的连接字符串将是这样的:"Data Source=localhost;Initial Catalog=MyDataBaseName;Integrated Security=true"(假设您正在连接到本地主机并且您的帐户当然对数据库具有特权)
try
{
using (SqlConnection sqlConnection = new SqlConnection("put your connection string here"))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("select EmpId,Fullname from Employee where FullName like @LeaderName", sqlConnection))
{
sqlCommand.CommandType = System.Data.CommandType.Text;
sqlCommand.Parameters.Add("@LeaderName", SqlDbType.VarChar).Value = leadername;
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
//lots of options here, read it how you like...
string EmpID = sqlDataReader["EmpID"].ToString();
string FullName = sqlDataReader["FullName"].ToString();
}
}
}
}
catch (Exception ex) { throw new System.ArgumentException(ex.Message); }
您需要删除查询中变量名两边的单引号。否则,您将在 FullName
和 "@LeaderName"
之间进行文字比较......这不太可能存在(您没有行的原因)。您还需要提供带有前导 @
的参数名称。
cmd.CommandText = "select EmpId,Fullname from Employee where FullName like @LeaderName";
var leaderParameter = cmd.Parameters.Parameters.Add("@LeaderName", System.Data.SqlDbType.NVarChar);
leaderParameter.Value = "%" + leaderName.Trim() + "%";
您需要删除 "LIKE '@LeaderName'" 两边的引号,并且必须以 @ 开头指定参数名称。所以:
... new SqlParameter("@LeaderName", ...