2011-01-21 78 views
0

更新行我有这样的功能:中的LINQ分贝

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

有人能告诉我,为什么当我运行这个没有变化maded ...在debuge模式中,我可以看到密码字段已更改,但是当我查看db密码时未更改。

+0

什么是应用和数据库密码的数据类型? – 2011-01-21 12:55:59

+0

两个字符串... – Wolfy 2011-01-21 13:08:14

回答

2

您的SLN表是否有主键?如果没有,那么尝试设置一个,根据我的测试LINQ,而无需在其所属
表PK 请this不会更新实体也

0

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

是不是old_password

而且new是在C#中的保留字,所以你应该在this.loginClient.chgPassAsync(user, old, new);

1

使用别的 Wolfy - 我会先火了SQL事件探查器,以确定是否一个SQL Update语句被发送到你的目标的SQL Server。如果是,我会再检查一下,以确保你没有一个事务处于活动状态,处于更高级别,没有被提交或正在被回滚。最后,如果前两个不能解决问题,请确保您的实体存在实际变化。

我假设First()方法没有抛出异常,如果没有找到行,它将执行该异常。所以你的查询至少必须返回一行数据。

谨慎使用此电话:

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

'新' 是一个C#的关键字。

+0

好主意启动探查器,看看发生了什么。 +1 – 2011-01-21 12:47:41

0

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

我以前回答这样的问题,我寻找那些,但我不能找到它,所以我在这里再次重申我的回答,

如果您每次运行应用程序时都将数据库文件添加到您的解决方案中,则其副本会转到您的调试文件夹,并且您将该文件更改为原始文件,而不是原来的文件,

另一个机会是您的密码数据类型为Binary,更新将会显示l由于列数据类型和更新二进制数据中存在的问题