如何修复返回 -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 语句返回的表?

通过 EXECUTE IMMEDIATE 从 select 语句中返回一个值

在 SQL Select 语句上返回布尔值

如何修复python中不一致的return语句?