Linq обновить строку в БД - PullRequest
       3

Linq обновить строку в БД

0 голосов
/ 21 января 2011

У меня есть эта функция:

//change user password
void chgPass(string username, string old_password, string new_password)
{
    var result = (from l in this.dbLogin.SLN
                 where l.user_id.Equals(username)
                 where l.password.Equals(old_password)
                 select l).First();

    result.password= new_password;

    dbLogin.SubmitChanges();
}

Я называю это так:

this.loginClient.chgPassAsync(user, old_password, new_password);

Может кто-нибудь сказать мне, почему никакие изменения не изменяются, когда я запускаю это ... в отладкеВ режиме я вижу, что поле пароля изменено, но когда я смотрю в БД, пароль не изменяется.

Ответы [ 5 ]

2 голосов
/ 22 января 2011

Есть ли в вашей таблице SLN первичный ключ? если нет, то попытайтесь установить его, в соответствии с моим тестом LINQ не будет обновлять объект, не имея PK в таблице, к которой он принадлежит
пожалуйста, проверьте это тоже

1 голос
/ 21 января 2011

Я уже отвечал на такой вопрос раньше и ищу его, но не могу его найти, поэтому я повторяю здесь свой ответ снова,

Если вы добавляете файл базы данных в свое решение каждый разКогда вы запускаете приложение, его копия попадает в вашу папку Debug, и вы изменяете этот файл, а не исходный,

И еще один шанс, что ваш тип данных пароля - Binary, и обновление не будет выполнено,типа данных столбцов и проблемы, возникающие при обновлении двоичных данных

1 голос
/ 21 января 2011

Wolfy - я бы сначала запустил SQL Profiler, чтобы определить, отправляется ли инструкция SQL Update на ваш целевой SQL Server.Если это так, я бы тогда проверил, чтобы убедиться, что у вас не будет активной транзакции на более высоком уровне, которая не фиксируется или откатывается.Наконец, если первые два не решают проблему, убедитесь, что в вашей сущности действительно произошли изменения.

Я предполагаю, что метод First () не выдает исключение, что он и сделаетесли строки не найдены.Поэтому ваш запрос должен по крайней мере возвращать строку данных.

Будьте осторожны с этим вызовом:

this.loginClient.chgPassAsync(user, old, new);

'new' - это ключевое слово C #.

0 голосов
/ 21 января 2011

Ваш метод выглядит странно.Что такое usernamene и star_password?

Это должно быть примерно так:

    void chgPass(string username, string old_password, string new_password) 
    { 
        var result = this.dbLogin.SLN.FirstOrDefault(l => l.user_id == username 
                          && l.password == old_password);
        if(result == null) 
            throw new ArgumentException("User not found", "username");

        result.password = new_password; 
        this.dbLogin.SubmitChanges(); 
    } 
0 голосов
/ 21 января 2011

Откуда взято star_password in where l.password.Equals(star_password)?

Разве это не должно быть old_password?

Также new является зарезервированным словом в c #, поэтому вы должны использовать что-тоеще в this.loginClient.chgPassAsync(user, old, new);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...