【问题标题】:The value of the last inserted row in SQL Server [duplicate]SQL Server中最后插入行的值[重复]
【发布时间】:2017-02-07 02:55:17
【问题描述】:

我参考勾选的答案“How to get last inserted id?

到目前为止,这是我所做的。

 SqlCommand cmdInsert = new SqlCommand("INSERT INTO normal_asset(n_asset_serialNo,n_asset_propertyNo,n_asset_brandModel,n_asset_unitCost,n_asset_acquisitionDate,equitype_id,region_id) OUTPUT INSERTED.N_Asset_ID VALUES ('" + assetSerial + "','" + assetProperty + "','" + assetBrand + "','" + assetCost + "','" + assetAcquisition + "','" + assetEquipment + "','" + Session["usersRegion"].ToString() + "')");

 cmdInsert.CommandType = System.Data.CommandType.Text;
 cmdInsert.Connection = conn;

 cmdInsert.ExecuteNonQuery();

 Decimal newId = (Decimal)cmdInsert.ExecuteScalar();

 SqlCommand cmdInsert2 = new SqlCommand("INSERT INTO asset(n_asset_id,office_id,asset_status,asset_accountable,asset_remarks) VALUES ('" + newId + "','" + inputOffice + "','" + inputStatus + "','" + inputAccountable + "','" + inputRemarks + "'");

 cmdInsert2.CommandType = System.Data.CommandType.Text;
 cmdInsert2.Connection = conn;

 cmdInsert2.ExecuteNonQuery();   

然后我想获得适当的 id,即n_asset_id

问题是 cmdInsert 将其插入加倍(可能在我的 if 条件下),但我无法使 Decimal newId = (Decimal)cmdInsert2.ExecuteScalar(); 正确运行。我尝试将其设为 Int。然后 string -> 转换为 int 但仍然没有运气。

【问题讨论】:

  • 在定义cmdInsert2 之前,你是如何执行它的?如果应该是cmdInsert,那么它就是“将其插入次数加倍”,因为,好吧,你执行了两次。另外,您指的是什么“如果条件”?
  • 我在cmdInsert之后立即执行它,然后假设变量should/must被保存在newId
  • 我看到Decimal newId = (Decimal)cmdInsert2.ExecuteScalar(); 放在cmdInsert2 声明之上。您需要将行 声明为 cmdInsert2SqlCommand
  • 您正在执行cmdInsert2.ExecuteScalar(),然后在下一行定义SqlCommand cmdInsert2 = ...。您发布的代码无法编译。
  • 不要将参数连接到您的查询中。那只是乞求 SQL 注入攻击或带有撇号或其他特殊符号的某些值来破坏您的查询。使用正确参数化的命令。见Why do we always prefer using parameters in SQL statements?

标签: c# sql-server


【解决方案1】:

问题是 cmdInsert 将其插入次数加倍

那是因为你执行了两次 SQL 查询:

cmdInsert.ExecuteNonQuery();
Decimal newId = (Decimal)cmdInsert.ExecuteScalar();

如果你只想要后者,你应该完全省略前者:

Decimal newId = (Decimal)cmdInsert.ExecuteScalar();

输出也应该是int,因为插入的标识符将是int

int newId = (int)cmdInsert.ExecuteScalar();

顺便说一句,请注意您的代码很容易受到所谓的“SQL 注入攻击”的影响。也就是说,精明的用户可以使您的系统在您的服务器上执行任意 SQL 代码。同样的漏洞也会使您的代码更脆弱且更难以调试,因为意外字符(不一定是恶意的,甚至只是偶然的)可能会导致您的 SQL 代码出错,并且您甚至不知道您的 SQL 代码是什么直到运行时

要解决此问题,请考虑在查询中使用参数。永远不要将值作为代码执行,始终将它们作为参数值添加到命令对象中。

【讨论】:

  • 我稍后会检查,好先生。
  • int newId = (int)cmdInsert.ExecuteScalar(); 这将引发异常。也许就像那样int newId = Convert.ToInt32(cmdInsert.ExecuteScalar());
  • 不过,我听从了您的建议。 Sergio 的正确说法会引发异常。
  • 1.您甚至还没有接近您在原始问题中引用的原始问题,这完美地解释了您需要做什么; 2. 请不要将答案标记为正确,因为它不符合您的要求(返回标识值)
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
相关资源
最近更新 更多