我希望从C#中的select查询中获取id,但每次运行该程序时,查询都会返回" -1"

时间:2017-11-08 06:26:56

标签: c# mysql

我正在尝试通过使用选择查询在下拉列表中获取所选名称的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();

3 个答案:

答案 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。这是你必须注意的差异。

  • 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());
}