如何修复返回 -1 的 Select 语句
Posted
技术标签:
【中文标题】如何修复返回 -1 的 Select 语句【英文标题】:How to fix a Select Statement returning -1 【发布时间】:2019-10-28 07:11:54 【问题描述】:我正在尝试从数据库中返回 InvoiceID
,但它一直返回 -1
。
我正在尝试从 tblInvoice
中选择发票 ID 以将其显示在表单上,并使用它将其插入到与 tblInvoice
具有一对多关系的第二个表中。
try
conn = new SqlConnection(conString);
conn.Open();
string select = "SELECT TOP 1 FId FROM tblFaktuur ORDER BY FId DESC";
SqlCommand cmd1 = new SqlCommand(select, conn);
i = (int)cmd1.ExecuteNonQuery();
catch (Exception e)
System.Windows.Forms.MessageBox.Show("ReadInvoiceNumber()" + e.Message);
return i;
在 SQL Server 中运行查询 SELECT TOP 1 FId FROM tblFaktuur ORDER BY FId DESC
时,它会返回 6
的值,这是最后一个发票 ID。
【问题讨论】:
想想那个代码。您希望名为 ExecuteNonQuery 的方法如何处理查询?将其更改为ExecuteScalar
。
ExecuteNonQuery for SELECT sql statement returning no rows的可能重复
附带说明,这种代码几乎永远不会正确。人们几乎总是执行这种查询,以根据上次使用的 ID 计算下一个 ID,或者了解为他们刚刚创建的文档分配的 ID。在这两种情况下,使用该查询都是非常错误的,因为它只能在单个用户环境中正确工作。
除此之外,还应处理 SQLConnection,与 SqlCommand 相同。并且 catch 子句使用 MessageBox 这意味着它并没有真正与 UI 解耦......
您所描述的这段代码的重点是@GSerg 提到的问题。您已经创建了一个竞争条件来处理应该使用身份属性完成的操作。
【参考方案1】:
想想那个代码。您期望一个名为 ExecuteNonQuery 的方法如何处理查询?将其更改为 ExecuteScalar。这项工作非常感谢@Camilo Terevinto,我将进行研究以提高我的技能,至少我知道出了什么问题。
【讨论】:
此外,如果您没有正确关闭和处理您的连接和命令对象,您将通过消耗所有可用连接来削弱您的服务器。将这两个对象(以及任何继承 IDisposable 的对象)都包装在 USING 语句中。以上是关于如何修复返回 -1 的 Select 语句的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SQL Server SELECT 语句返回新的 IDENTITY 列值?
如何使用带有select onchange的条件语句在javascript函数中返回html代码
如何获取存储过程以输出从 SQL*Plus 中的 select 语句返回的表?