C# SQL Server中最后插入的行的值
我指的是勾选答案“” 到目前为止,这就是我所做的C# SQL Server中最后插入的行的值,c#,sql-server,C#,Sql Server,我指的是勾选答案“” 到目前为止,这就是我所做的 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 ('" + a
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\u asset\u id
问题是cmdInsert
的插入量加倍(可能是在我的if条件下),但我无法使Decimal newId=(Decimal)cmdInsert2.ExecuteScalar()代码>以正确运行。我试着把它变成一个整数。然后字符串->转换成整数,但还是没有运气
问题是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代码是什么
要解决这个问题,请研究在查询中使用参数。永远不要将值作为代码执行,始终将它们作为参数值添加到命令对象中。在定义之前,您是如何执行cmdInsert2
?如果这应该是cmdInsert
,那么它是“加倍插入”,因为您要执行它两次。还有,你指的是什么“如果条件”?我在cmdInsert
之后执行它,那么假设变量应该/必须保存在newId
中,我看到Decimal newId=(Decimal)cmdInsert2.ExecuteScalar()代码>位于cmdInsert2
声明上方。您需要在将cmdInsert2
声明为SqlCommand
后放置该行。您正在执行cmdInsert2.ExecuteScalar()
,然后在下一行定义SqlCommand cmdInsert2=…
。您发布的代码未编译。请不要将参数连接到查询中。这只是在乞求SQL注入攻击,或者用撇号或其他特殊符号来破坏查询。使用正确参数化的命令。看,我稍后会检查的,好先生。intnewid=(int)cmdInsert.ExecuteScalar()代码>这将引发异常。可能是这样的int newId=Convert.ToInt32(cmdInsert.ExecuteScalar())不过,我还是听从了你的建议。塞吉奥的判断是正确的,它将引发异常。1。你甚至还没有接近你在原始问题中提到的原始问题,它完美地解释了你需要做什么;2.请不要将答案标记为正确,因为它不符合您的要求(返回标识值)