使用 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。您没有插入记录,因此不适用。你究竟想要什么?最高电流UID
? SELECT 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()";
【讨论】:
如何将其存储在变量中? @envyM6int id = Convert.ToInt32(cmd.ExecuteScalar());
,但同样:这无济于事,除非你是 a:在同一个连接上(你不是),并且 b:你还没有做任何其他事情连接
可以轻松解决不同连接的问题。简单地说,为整个会话(登录后)使用一个连接,而不是为每个查询打开/关闭它 - 对身份查询使用相同的连接。我希望编辑器窗口也能以这种方式工作。我认为这是桌面应用程序的更好方法,而不是关闭每个查询的连接。看看 MS SQL Studio 以同样的方式工作。即使使用“sp_who”,您也可以在列表中看到您的应用。以上是关于使用 SQL 命令从数据库中读取最后插入的 UID的主要内容,如果未能解决你的问题,请参考以下文章
从 MS Access 批量导入并插入 Sql Server [关闭]
通过远程桌面从 Microsoft SQL 数据库读取数据。 R