2013-11-20 5 views
0

Я работаю над проектом ASP.NET MVC. Мне нужна помощь в обновлении записей в моей таблице.Обновление нескольких записей с тем же ID

В принципе у меня есть выпадающий список в моем приложении, в котором когда пользователь выбирает список из выпадающего списка, будет предоставлен Скачать вариант, где пользователь может загрузить CSV.

Здесь внутри CSV у меня есть много строк записей. Но все эти строки имеют одинаковые categoryid. Скажем, например, у меня три строки в моем csv, тогда все эти три строки имеют одинаковые категории.

Теперь проблема, с которой я столкнулся, - это когда пользователь загружает файлы, мне нужно сохранить их в базе данных. Итак, вот что происходит, если файл 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 идентификатора который каждое использование имеет и 368 выпадающей сессия идентификатора. Здесь я испытываю проблемы. Для всех трех рядов 45 и 368 являются общими.

Здесь, если у меня есть три строки в csv, он циклически проходит три раза, но при обновлении он обновляет результат последней строки со всеми тремя строками.

Так как я могу сделать свой код для сохранения, после очень цикла? Я имею в виду, когда он проходит через первую строку и когда он выполняет хранимую процедуру, этот результат должен сохраняться в моей таблице, после чего он должен продолжить цикл до второй строки.

Как я могу это сделать?

Обновление: usp_UpdateUserData является хранимой процедурой для обновления записей. Это мой зр:

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 
+0

Как выглядит таблица, которую вы обновляете? Каков его первичный ключ? Как насчет usp_UpdateUserData? –

+0

@ColinYoung Привет, я обновил сообщение с помощью хранимой процедуры.Пожалуйста, изучите это. У меня есть первичный ключ в столбце под названием cutid, но как я могу взять первичный ключ здесь для той же idcategory? – Ajay

+0

Просьба также разместить образец CSV. Если вы пытаетесь обновить записи, как вы собираетесь сопоставлять разные записи, если вы жестко кодируете учетную запись и идентификаторы категорий? Конечно, он собирается обновлять одну и ту же запись каждый раз. –

ответ

0

Вам нужно будет выставить первичный ключ к переднему концу, так что вы можете идентифицировать запись, которую хотите обновить. Я подозреваю, что у вас есть какое-то ограничение уникальности (напримерemail), который является либо реальным (т.е. фактического ограничения в БД) или воображаемый (т.е. вы знаете, что делает запись уникальной, но на самом деле не кодируетесь эти правила в БД). Это должен быть ваш основной ключ. Я знаю, что популярным является использование столбца auto-increment в качестве «первичного ключа», но все, что на самом деле делает, - это обфускация истинного характера данных.

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 

Я также рекомендую сделать idAccount и idCategory параметры.

+0

Привет, теперь у меня есть первичный ключ. Я взял в передней части, как этот var getDetails = (от tblCustomer tbl в ordertables.tblCustomers где tbl.idCategory == dropdownsession select tbl.idCust) .ToList(); Здесь у меня есть три уникальных ключа. Теперь, как я могу поместить это в свой код, который находится здесь foreach (DataRow dr в upCSV.Rows) {? – Ajay

+0

Вам нужно включить эти custids в CSV в правильные строки. Похоже, вы пытаетесь использовать одну страницу для загрузки набора пользователей. Вам все еще нужен способ связать каждого из пользователей с записью в базе данных, и это будет через 'custid'. –

Смежные вопросы