使用 SQL 命令从数据库中读取最后插入的 UID

Posted

技术标签:

【中文标题】使用 SQL 命令从数据库中读取最后插入的 UID【英文标题】:Reading last inserted UID from database using SQL Command 【发布时间】:2015-02-13 18:40:51 【问题描述】:

如下图所示,我有两个表格,表格上还有一些示例数据。

我想要在我的项目中实现的目标如下。我的项目中有 4 个窗口窗体。第一个带有两个按钮的表单

New User有一个点击事件-

private void button1_Click(object sender, EventArgs e)

    NewUser nu = new NewUser();
    nu.Show();


点击后,会弹出 NewUser 表单

计划是在此处为Users Table 添加数据,然后单击Save and Proceed(现在我使用导航栏上的默认Save 按钮)这将从Users Table 获取UID 并添加它在UID 列下(这是Address Table 中的外键)并打开表单FormAddress,我可以在其中输入表格的数据。

Save and Proceed 的点击事件是--

private void button1_Click(object sender, EventArgs e)

    FormAddress ad = new FormAddress();
    ad.Show();
    getdata();

经过研究,我了解到我需要使用 SCOPE_IDENTITY 从上次数据插入中获取 UID 的值并将其传递到下一个表单。所以我创建了一个方法getdata()如下,并在按钮事件Save and Proceed下添加了它

我试过的代码是

private void getdata()


    SqlConnection sqlConnection1 = new SqlConnection(@"mycon string is here;" + "Initial Catalog=Stack;Integrated Security=YES");
    SqlCommand cmd = new SqlCommand();
    SqlDataReader reader;

    cmd.CommandText = "SELECT * FROM Users";
    cmd.CommandType = CommandType.Text;
    cmd.Connection = sqlConnection1;

    sqlConnection1.Open();

    reader = cmd.ExecuteReader();
    // Data is accessible through the DataReader object here.

    cmd.CommandText = "SCOPE_IDENTITY();";

    sqlConnection1.Close();

我只是想不通如何获得SCOPE_IDENTITY 并使其工作。请在我被否决之前问我。我会根据需要回复并做出更改。如果有人想下载它们来运行和测试,我已经压缩了项目和 SQL 服务器文件HERE。我使用过 SQL Server 2014 和 Visual Studio 2013。

【问题讨论】:

SCOPE_IDENTITY() 返回在正确批次范围内创建的最后一个标识,即刚刚插入的记录的 id。您没有插入记录,因此不适用。你究竟想要什么?最高电流UIDSELECT MAX(UID) FROM Users @BenRobinson 在第二种形式NewUser 我正在插入一个新行。我想要的是 UID 自动结转到下一个表单 Address ,在那里我可以在与 Users Table 相同的 UID 下继续填充数据。 【参考方案1】:

如果您还没有在该连接上完成INSERT,则SCOPE_IDENTITY() 是未定义的。您无法提前显示新的IDENTITY 值,因为大多数数据库都是多用户的 - 因此在您实际执行INSERT 之前,该值无法知道 .显示“可能会是这个”值会产生误导——例如,用户可能会将其写下来或在与某人交流时使用它。您可以显示此值之后它存在于数据库中。

但是:当您是 INSERT 时,您可以立即简单地查询 SCOPE_IDENTITY() 以查看值是什么。最近,you can use the OUTPUT clause of an INSERT operation - 更简单,只有一组 SQL 操作,并且它适用于多行:全部获胜。

【讨论】:

我正在以第二种形式插入一个新行并使用导航栏上的保存按钮保存它 @envyM6 然后...就在SELECT SCOPE_IDENTITY() 之后INSERT Mark 我正在使用网格视图插入数据。不是以编程方式。 @envyM6 re getdata() - 因为这是一个单独的连接(顺便说一句,它可能应该使用using 语句),它无法访问您想要的SCOPE_IDENTITY();这与单个连接有关。也许您可以重新查询基础数据并替换它。 那么您的建议是以编程方式输入数据并包含SELECT SCOPE_IDENTITY()【参考方案2】:

通过这一行获取 ID:

cmd.CommandText = "SELECT SCOPE_IDENTITY()";

【讨论】:

如何将其存储在变量中? @envyM6 int id = Convert.ToInt32(cmd.ExecuteScalar());,但同样:这无济于事,除非你是 a:在同一个连接上(你不是),并且 b:你还没有做任何其他事情连接 可以轻松解决不同连接的问题。简单地说,为整个会话(登录后)使用一个连接,而不是为每个查询打开/关闭它 - 对身份查询使用相同的连接。我希望编辑器窗口也能以这种方式工作。我认为这是桌面应用程序的更好方法,而不是关闭每个查询的连接。看看 MS SQL Studio 以同样的方式工作。即使使用“sp_who”,您也可以在列表中看到您的应用。

以上是关于使用 SQL 命令从数据库中读取最后插入的 UID的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 插入一些数据的表中读取数据的问题

从 MS Access 批量导入并插入 Sql Server [关闭]

在 django 中获取最后插入的 id

通过远程桌面从 Microsoft SQL 数据库读取数据。 R

从 .txt 文件读取数据并将其插入 Oracle SQL DB [PL/SQL,Unix 脚本]

在Sql中执行插入命令并返回插入的Id