【问题标题】:Update Asp.Net Claims via SQL statement?通过 SQL 语句更新 Asp.Net 声明?
【发布时间】:2018-09-08 21:35:42
【问题描述】:

我正在尝试向现有用户添加声明,但我在下面编写的查询(并且正在 SSQL Management Studio 中运行)不起作用。查询是错误的,还是根本不可能?

update [test_MIM].[dbo].[AspNetUserClaims] 
set ClaimType = 'EmployeeNumber',
ClaimValue = '1',
--Id = f.Id,
UserId = f.UserName
from (select Id,UserName FROM [test_MIM].[dbo].[AspNetUsers] where UserName='abc@gmail.com') as f

我注释掉了 Id 列,因为当我包含它时查询失败(可能是因为 Id 是自动生成的)

【问题讨论】:

  • 为什么第三列看起来像--Id
  • 这是存储过程吗?
  • @zackraiyan 我更新了我的帖子,在底部包含了一个答案。谢谢!

标签: c# sql asp.net asp.net-authorization


【解决方案1】:

改为使用update-join 结构

update a 
set ClaimType = 'EmployeeNumber',
ClaimValue = '1',
UserId = f.UserName
from [test_MIM].[dbo].[AspNetUserClaims] a
join [test_MIM].[dbo].[AspNetUsers] f 
on a.id = f.id
where f.UserName = 'abc@gmail.com'

【讨论】:

  • 当我尝试得到:Conversion failed when converting the nvarchar value 'd2bba743-34f9-4644-a4fa-cde7536cec51' to data type int.
  • @Rilcon42 这是导致条件on a.id = f.id 的原因。表之间是否有匹配的列?然后你可以加入他们
  • 不,没有匹配的列,我只是想在 AspNetClaims 表中添加一个包含数据的新行
【解决方案2】:

您可以在更新语句中使用joinjoin 的作用是在一个语句中将两个或多个表连接在一起:

UPDATE NameHere SET ClaimType = 'EmployeeNumber',ClaimValue = '1', UserId f.UserName FROM [test_MIM].[dbo].[AspNetUserClaims] NameHere JOIN [test_MIM].[dbo].[AspNetUsers] f  on NameHere.id = f.id where f.UserName = 'abc@gmail.com'

但这并不理想,而是为每一列传递参数,这样你不仅可以从 SQL 注入中保存你的应用程序,而且还可以设置列的数据类型,这可能会摆脱其他问题。一个样本:

  UPDATE NameHere SET ClaimType = @ClaimType,ClaimValue = @claimValue, UserId = @Uname FROM [test_MIM].[dbo].[AspNetUserClaims] NameHere JOIN [test_MIM].[dbo].[AspNetUsers] f  on NameHere.id = @NewID where f.UserName = @NewUserName

如果你使用SqlCommand,那么你可以使用如下参数:

 cmd.Parameters.Add("@ClaimType", SqlDbType.VarChar).Value = "claimingTyoeString" ////Assuming 'cmd' is the SqlCommand

 .......

 cmd.ExecuteNonQuery();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多