我想从 C# 中的选择查询中获取 id 但每次我运行程序时,查询都会返回“-1” [重复]

Posted

技术标签:

【中文标题】我想从 C# 中的选择查询中获取 id 但每次我运行程序时,查询都会返回“-1” [重复]【英文标题】:I Want to get id from select query in C# but every time i run the program, The query returns me "-1" [duplicate] 【发布时间】:2017-11-08 06:26:56 【问题描述】:

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

【问题讨论】:

您是否尝试过查询您的数据库本身? 这两个中你要执行哪一个?无论如何要执行第二个,小心注入 您想从该查询中只返回一个 PID 还是返回 PID 的计数? 【参考方案1】:

您需要使用 ExecuteScalar 而不是 ExecuteNonQuery

int pid = Convert.ToInt32(cmd2.ExecuteScalar());

更多详情请参考Link

【讨论】:

【参考方案2】:

原因是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();

【讨论】:

【参考方案3】:

在回答问题之前,让我为您添加一些注释,您应该了解 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());

【讨论】:

感谢帮助 现在它可以正常工作了。 @AbdulBasitMehmood:如果真的有帮助,请将其标记为已接受

以上是关于我想从 C# 中的选择查询中获取 id 但每次我运行程序时,查询都会返回“-1” [重复]的主要内容,如果未能解决你的问题,请参考以下文章

选择一个值,然后在 c# 的同一查询中更新该值

我想从 url 获取 id

如何从 C# 中的泛型类型数组中选择一组随机值?

行未在数据网格 C# 中删除

我想从表中获取行 ID

从 C# 中的 xml 文件中选择多个值