繁体   English   中英

Linq更新数据库中的一行

[英]Linq update a row in db

我有这个功能:

//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);

有人可以告诉我为什么我在调试模式下运行此命令时没有进行任何更改吗?我可以看到密码字段已更改,但是当我查看数据库密码时却没有更改。

您的SLN表是否有主键? 如果没有,那么尝试设置一个,根据我的测试,LINQ不会在实体所属的表中没有PK的情况下更新实体
请检查一下

Wolfy-我首先将启动SQL Profiler,以确定是否将SQL Update语句发送到目标SQL Server。 如果是这样,那么我将检查以确保您没有处于更高级别的,尚未提交或正在回滚的活动事务。 最后,如果前两个方法不能解决问题,请确保您的实体有实际更改。

我假设First()方法没有引发异常,如果找不到行,它将执行此操作。 因此,您的查询至少必须返回一行数据。

请谨慎使用此电话:

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

“ new”是C#关键字。

我之前曾回答过这样的问题,但我一直找不到,所以我在这里再次重复我的回答,

如果您在每次运行应用程序时都将数据库文件添加到了解决方案中,则将其副本复制到Debug文件夹中,并且更改了该文件而不是原始文件,

另一个机会是您的密码数据类型为Binary并且更新将由于列数据类型和更新二进制数据中存在的问题而失败

哪里star_passwordwhere l.password.Equals(star_password)从何而来?

应该不是old_password吗?

另外, new是c#中的保留字,因此您应该在this.loginClient.chgPassAsync(user, old, new);使用其他内容this.loginClient.chgPassAsync(user, old, new);

您的方法看起来很奇怪。 什么是usernamenestar_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(); 
    } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM