我正在尝试通过使用选择查询在下拉列表中获取所选名称的ID,但它始终返回值" -1"而不是相关的结果。
SqlCommand cmd2 = con.CreateCommand();
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "Select Pid From Provinces where Pname = '" + pr + "'";
cmd2.CommandText = "Select Pid From Provinces where Pname = '" + prov.Text + "'";
int pid = cmd2.ExecuteNonQuery();
答案 0 :(得分:4)
您需要使用ExecuteScalar而不是ExecuteNonQuery
int pid = Convert.ToInt32(cmd2.ExecuteScalar());
有关详细信息,请参阅Link
答案 1 :(得分:3)
原因是ExecuteNonQuery
在使用Select
命令时没有返回数据库值 - 它返回返回码成功或失败。
如果要读取数据库值,请使用以下代码。 注意我使用的是SqlParameter
而不是您的参数连接,这可能会导致SQL注入,这是一种不好的做法:
SqlCommand cmd2 = con.CreateCommand();
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "Select Pid From Provinces where Pname=@pr";
cmd2.Parameters.Add(new SqlParameter("pr", pr));
int result = Convert.ToInt32(cmd2.ExecuteScalar());
另外,您可以使用DataTable
填充多个结果:
SqlCommand cmd2 = con.CreateCommand();
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "Select Pid From Provinces where Pname=@pr";
cmd2.Parameters.Add(new SqlParameter("pr", pr));
SqlConnection Connection = new SqlConnection(ConnectionString);
SqlDataAdapter adp = new SqlDataAdapter(cmd2);
// Create a new datatable which will hold the query results:
DataTable dt = new DataTable();
Connection.Open();
// Fill a datatable with the query results:
adp.Fill(dt);
Connection.Close();
答案 2 :(得分:1)
在回答问题之前,让我为您添加一些注释,您应该了解ExecuteNonQuery的用法,以及为什么其他人会为您引用ExecuteScalar。这是你必须注意的差异。
我想提醒你更多的事情,作为开发者,我们不会通过SqlInjection向黑客提供密钥,因为我们应该使用如下的参数化:
using(SqlCommand cmdSql = con.CreateCommand())
{
cmdSql.CommandType = CommandType.Text;
cmdSql.CommandText = "Select Pid From Provinces where Pname =@Pname";
cmdSql.Parameters.Add("@Pname ", SqlDbType.VarChar).Value= prov.Text;
int pid = Convert.ToInt32(cmdSql.ExecuteScalar());
}