Sql 更新具有相同ID的多个记录
我正在从事ASP.NETMVC项目。我需要帮助将记录更新到我的表中 基本上,我的应用程序中有一个下拉列表,当用户从下拉列表中选择列表时,将提供下载选项,用户可以在其中下载csv 在CSV中,我有许多行记录。但所有这些行都具有相同的类别ID。例如,我的csv中有三行,那么这三行都有相同的categoryid 现在我面临的问题是,当用户上传文件时,我需要将其保存在数据库中。所以这里发生的是,若csv文件有三行,那个么最后一行结果将保存在所有三行中 这是我的代码:Sql 更新具有相同ID的多个记录,sql,database,stored-procedures,Sql,Database,Stored Procedures,我正在从事ASP.NETMVC项目。我需要帮助将记录更新到我的表中 基本上,我的应用程序中有一个下拉列表,当用户从下拉列表中选择列表时,将提供下载选项,用户可以在其中下载csv 在CSV中,我有许多行记录。但所有这些行都具有相同的类别ID。例如,我的csv中有三行,那么这三行都有相同的categoryid 现在我面临的问题是,当用户上传文件时,我需要将其保存在数据库中。所以这里发生的是,若csv文件有三行,那个么最后一行结果将保存在所有三行中 这是我的代码: DataTable upCSV
DataTable upCSV = (DataTable)TempData["UploadedCSV"];
{
if (isHeaderAccepted)
{
Data_printEntities ordertable = new Data_printEntities();
foreach (DataRow dr in upCSV.Rows)
{
ObjectParameter getemail = new ObjectParameter("email", dr["email"].ToString());
ObjectParameter getpassword = neObjectParameter("password",dr["password"].ToString());
ObjectParameter getMobile = new ObjectParameter("Mobile", dr["Mobile"].ToString());
ObjectParameter getPhone = new ObjectParameter("Phone", dr["Phone"].ToString());
var spresults = ordertable.usp_UpdateUserData(45, 368, getemail.Value.ToString(), getpassword.Value.ToString(), getMobile.Value.ToString(), getPhone.Value.ToString())
ordertable.SaveChanges();
}
}
}
这里45是id,每次使用都有,368是下拉会话id。这就是我遇到的问题。对于所有三行,45和368是常见的
这里,如果csv中有三行,它将循环三次,但在更新时,它将用所有三行更新最后一行结果
那么,在每次循环之后,我如何使代码保存?我的意思是,当它循环第一行并执行存储过程时,结果应该保存在我的表中,然后它应该继续循环到第二行
我怎样才能做到这一点
更新:usp\u UpdateUserData是更新记录的存储过程。这是我的sp:
ALTER PROCEDURE [dbo].[usp_UpdateUserData]
@idAccount int = 0,
@idcategory int = 0,
@email nvarchar(100) =0,
@password nvarchar(50) = 0,
@Mobile nvarchar(50) = 0,
@Phone nvarchar(50)
AS
BEGIN
Begin
Update tblCustomer
Set
email = @email, password = @password, mobileNo = @Mobile, phoneNo = @Phone
where idAccount = 45 and idCategoryL = 368
END
End
GO
您需要将主键公开到前端,以便识别要更新的记录。我怀疑您有某种独特的约束(例如,
电子邮件
),它要么是真实的(即数据库中的实际约束),要么是想象的(即您知道是什么使记录独特,但实际上没有在数据库中编码这些规则)。这应该是你的主键。我知道,使用自动递增列作为“主键”很流行,但真正做的只是混淆数据的真实性质
UPDATE tblCustomer
SET email = @email,
password = @password,
mobileNo = @Mobile,
phoneNo = @Phone
WHERE custid = @custId
AND idAccount = 45
AND idCategoryL = 368
如果出于某种原因,您无法将custid
公开给前端,下一个最佳解决方案是在更新时使用您的唯一约束(如果您还想更新电子邮件,则需要提供旧的和新的):
我还建议设置
idAccount
和idCategory
参数。您正在更新的表是什么样子的?它的主键是什么?usp_UpdateUserData呢?@ColinYoung Hi我用存储过程更新了我的帖子。请调查一下。我在名为cutid的列中有主键,但我如何在这里获取相同idcategory的主键?请同时发布CSV示例。如果您试图更新记录,如果您硬编码帐户和类别ID,您希望如何匹配不同的记录?当然,它每次都会更新同一条记录。@ColinYoung嗨,我正在尝试更新现有的记录。插入新记录不起作用。My tblcustomer包含诸如custid(primarykey)、idAccount、idCategoryL、email、password、mobileNo、phoneNo等字段。现在我的前端没有主键。在我的csv中,用户只能看到电子邮件、密码、mobileNo、phoneNo,他们可以编辑这些。嗨,现在我有了主键。我在前端使用了如下变量getDetails=(来自ordertables.tblCustomers中的tbl客户tbl,其中tbl.idCategory==dropdownsession选择tbl.idCust).ToList();这里我有三把独特的钥匙。现在,我如何将其放入我的foreach代码中(upCSV.Rows中的DataRow dr){?您需要在CSV中的正确行中包含这些custid。听起来您正试图使用单个页面上载一组用户。您仍然需要一种方法将每个用户与数据库中的记录联系起来,这将通过custid
。
UPDATE tblCustomer
SET email = @new_email,
password = @password,
mobileNo = @Mobile,
phoneNo = @Phone
WHERE email = @old_email
AND idAccount = 45 and idCategoryL = 368