我的代码及其死锁引起的大量SQL调用出现问题。我将代码粘贴到PasteBin中:https://pastebin.com/p1YDkKsB。有人可以帮我吗?它最常在以下CheckClanActivity任务中发生:
using(SqlCommand cmd = new SqlCommand(string.Format("select * from ClanMembers where MembershipId={0} and IsActive = 1", entry.Player.DestinyUserInfo.MembershipId), conn))
,但它也发生在整个地方。
编辑: 好的,所涉及的SQL语句如下:
if not exists(select * from ClanMembers where MembershipId={0}) begin insert into ClanMembers(ID, MembershipId, BattleNetId, ClanId, DateLastPlayed, IsActive, LastUpdated) select ISNULL(MAX(ID) + 1, 0),{0},'{1}',{2},'{3}', 1, GETDATE() from ClanMembers end else begin update ClanMembers set DateLastPlayed='{3}', LastUpdated=GETDATE() where MembershipId={0} end
if not exists(select * from ClanMemberCharacters where CharacterId={1}) begin insert into ClanMemberCharacters(ID,MembershipId,CharacterId) select ISNULL(MAX(ID)+1,0),{0},{1} from ClanMemberCharacters end
select c.* from ClanMemberCharacters c join ClanMembers m on m.MembershipId = c.MembershipId where m.IsActive = 1 ORDER BY m.MembershipId desc
select * from ActivityHistory where InstanceId = {0}
if not exists(select * from ActivityHistory where InstanceId = {0}) begin insert into ActivityHistory(InstanceId,MembershipId,CharacterId,GameMode,ActivityDate,ReferenceId,DirectorActivityHash,IsPrivate,ClanActivity,ClanActivityCount) values( {0},{1},{2},'{3}','{4}',{5},{6},{7},{8},{9} ) END
select * from ClanMembers where IsActive = 1
Select * from ClanMembers where IsActive = 0
update ClanMembers set IsActive = 1 where MembershipId = {0}
select * from ClanMembers where MembershipId={0} and IsActive = 1
答案 0 :(得分:0)
我怀疑问题是SqlConnection
嵌套在一起,而其中的连接字符串相同。建议:
using
移动到尽可能靠近命令范围的位置。例如,避免从内部调用其他方法。if (conn.State == ConnectionState.Closed) { conn.Open(); }
,只需将conn.Open();
移到SqlConnection
使用的第一位即可。conn.Close()
,这将在离开using
块时自动完成。SqlDataAdapter
也是一次性的,因此应该放在using
块中。throw;
抛出异常,或者在此处不捕获异常,并在调用堆栈上捕获该异常。ex.ToString()
,而不只是ex.Message
。string.Format
来构造查询,因为这样做会使它们容易受到SQL注入攻击的攻击。</ li>