我想从 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” [重复]的主要内容,如果未能解决你的问题,请参考以下文章