以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  无端端报错The given key was not present in the dictionary.  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=89231)

--  作者:chen3728060
--  发布时间:2016/8/17 17:02:00
--  无端端报错The given key was not present in the dictionary.

.NET Framework 版本:2.0.50727.3662
Foxtable 版本:2016.6.26.1
错误所在事件:
详细错误信息:
The given key was not present in the dictionary.

 

搜索之前的帖子,有这个问题,但是没有答案,因为当时官方让发帖人给出代码,发帖人给不出。

 

今天我发这个问题,也一样是给不出代码。因为不知道是什么功能触发的,我只能描述一下我的情况。

 

这个代码是出现在我开发作为QQClient服务器的程序,代码是很少的,就是启动QQClient,与Dictionary有关的,只有2个变量,一个是自动编号用的,一个是独占编辑用的

 

Public CodeDic As New Dictionary(of String,Integer)\'网络自动编号

Public MyEditDic As new Dictionary(of String,String)\'独占编辑

 

但是我为啥我给不出具体的报错代码?

 

因为我这个服务器程序,已经运行了10多天,一直都没问题,各种登陆操作都完全没问题。就是今天突然出现了,没任何征兆。那我怎么发现的呢?就是我发现客户端一直都登陆不了,提示“规定时间内未取得服务器响应”,但是已经登陆进去的客户端,又可以正常使用,所以我看了一眼服务器,发现这个报错,我关闭这个错误以后,一个下午也没有再弹出过,真的无法发现问题在哪里。

 

目前唯一能做的就是把我的程序放上来,让官方看看。还要服务器端的代码不算太多。由于源程序需要连接我外部数据库,可能连接不了,所以也放出程序导出的代码

 

 

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:melanoserver.foxdb

 


 

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:eventcode.zip

[此贴子已经被作者于2016/8/17 17:03:28编辑过]

--  作者:大红袍
--  发布时间:2016/8/17 17:11:00
--  

 意思是 【给定的键在字典中不存在

 

 比如你字典里面 abc 这个键值,但是你用了如 MyEditDic("abc") 就会报错。

 

 你改一下代码

 

    Dim Key As String = msg.SubString(2,msg.Length - 4)
    If MyEditDic.Containskey(Key) = False Then \'如果无人编辑此行
        MyEditDic.Add(Key,e.UserName) \'登记申请者为此行的编辑者
        e.ReturnValue = "OK" \'通知申请者可以编辑
    ElseIf MyEditDic.Containskey(Key) AndAlso MyEditDic(Key) = e.UserName Then \'如果申请者就是之前登记的编辑者
        e.ReturnValue = "OK" \'通知申请者可以编辑
    Else \'如果之前登记的编辑者为其他人
        Dim dr As DataRow = DataTables("MUser").SQLFind("MUserID =\'" & MyEditDic(Key) & "\'")
        If dr Is Nothing Then
            e.ReturnValue ="用户" & MyEditDic(Key) & " 正在编辑!" & vbcrlf & vbcrlf & "您若想编辑,请通知他保存或退出"  \'告知申请者是谁在编辑此行
        Else
            e.ReturnValue ="用户" &  MyEditDic(Key) & ":" & dr("MUserName") & " 正在编辑!" & vbcrlf & vbcrlf & "您若想编辑,请通知他保存或退出"  \'告知申
        End If
    End If


--  作者:chen3728060
--  发布时间:2016/8/17 18:30:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:1.jpg
图片点击可在新窗口打开查看
在第一个if已经判断了是否有这个键,存在这个键才到下一步elseif,为啥还要重新判断?
--  作者:大红袍
--  发布时间:2016/8/17 18:39:00
--  

 有可能有并发情况,特别是你有 MyEditDic.Remove(Key) 这句代码。

 

 某一时刻判断是存在的,但就在那个时候,修改了值,就可能导致冲突。