Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新具有相同ID的多个记录_Sql_Database_Stored Procedures - Fatal编程技术网

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

Sql 更新具有相同ID的多个记录,sql,database,stored-procedures,Sql,Database,Stored Procedures,我正在从事ASP.NETMVC项目。我需要帮助将记录更新到我的表中 基本上,我的应用程序中有一个下拉列表,当用户从下拉列表中选择列表时,将提供下载选项,用户可以在其中下载csv 在CSV中,我有许多行记录。但所有这些行都具有相同的类别ID。例如,我的csv中有三行,那么这三行都有相同的categoryid 现在我面临的问题是,当用户上传文件时,我需要将其保存在数据库中。所以这里发生的是,若csv文件有三行,那个么最后一行结果将保存在所有三行中 这是我的代码: DataTable upCSV

我正在从事ASP.NETMVC项目。我需要帮助将记录更新到我的表中

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

在CSV中,我有许多行记录。但所有这些行都具有相同的类别ID。例如,我的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\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