更新具有相同ID的多个记录

时间:2013-11-20 21:16:59

标签: sql database stored-procedures

我正在研究ASP.NET MVC项目。我需要帮助更新记录到我的表。

基本上我的应用程序中有一个下拉列表,当用户从下拉列表中选择列表时,将提供下载选项,用户可以下载 csv

这里面的CSV我有很多行记录。但是所有这些行都具有相同的 categoryid 。比方说,我的csv中有三行,然后所有这三行都有相同的categoryid。

现在我遇到的问题是当用户上传文件时,我需要将其保存在数据库中。所以这里发生的事情是,如果csv文件有三行,那么最后一行结果将保存在所有三行中。

这是我的代码:

  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_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

1 个答案:

答案 0 :(得分:0)

您需要将主键公开给前端,以便您可以识别要更新的记录。我怀疑你有某种独特的约束(例如 email),它是真实的( DB中的实际约束)或想象(你知道什么使记录独特,但实际上并没有在DB中编写这些规则。这应该是你的主要关键。我知道将自动增量列用作"主键"是很受欢迎的。但真正做的就是模糊数据的本质。

UPDATE tblCustomer
   SET email = @email,
       password = @password,
       mobileNo = @Mobile,
       phoneNo = @Phone
 WHERE custid = @custId
   AND idAccount = 45 
   AND idCategoryL = 368

如果由于某种原因你不能将custid暴露给前端,那么下一个最佳解决方案是在更新时使用你的唯一约束(如果你还想更新你需要提供旧的电子邮件)作为新的):

UPDATE tblCustomer
SET    email = @new_email,
       password = @password,
       mobileNo = @Mobile,
       phoneNo = @Phone
WHERE  email = @old_email
       AND idAccount = 45 and idCategoryL = 368

我还建议制作idAccountidCategory参数。