以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  学习官方每日一练 登录验证后无法进行下一步操作 麻烦老师帮忙看看 谢谢  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=165302)

--  作者:cnsjroom
--  发布时间:2021/5/13 10:23:00
--  学习官方每日一练 登录验证后无法进行下一步操作 麻烦老师帮忙看看 谢谢
学习官方每日一练   登录验证后无法进行下一步操作  麻烦老师帮忙看看  谢谢

图片点击可在新窗口打开查看此主题相关图片如下:动画.gif
图片点击可在新窗口打开查看

以下内容是专门发给有点蓝浏览


访问地址:
http://192.168.41.4/login.htm   登录名  张三   密码  666
登录成功后
http://192.168.41.4/Begin.htm?id=773

--  作者:有点蓝
--  发布时间:2021/5/13 10:28:00
--  
这些实例仅提供学习用,先自己分析代码查找问题。

前端使用浏览器开发者工具调试跟踪js的执行
服务端请写日志跟踪代码执行状态,实例提供了日志记录函数,调用即可

--  作者:cnsjroom
--  发布时间:2021/5/13 11:53:00
--  回复:(有点蓝)这些实例仅提供学习用,先自己分析代...
经过代码逐一按照顺序测试   当前在内部函数NewQuestion  这个代码下红色部分不弹值,导致UsersTestForm表空增了一行数据   当前用户就没有试题可操作了
 麻烦老师帮忙看看是啥原因呢?

\'开始新的练习
Dim e As RequestEventArgs = Args(0)
Dim vtext As String = e.PlainText \'ajex传入
MessageBox.Show(vtext)
If vtext > "" Then
    Dim varr() As String = vtext.Split("|")
    If varr.Length = 3 Then
        Dim drU As DataRow = Functions.Execute("CheckToken",varr(0),e) \'权限验证
        If drU IsNot Nothing  Then
            Dim qttype As String
            Dim qt As String = e.Cookies("cqt")
MessageBox.Show(e.Cookies("cqt"))
            If qt = 2 Then
                qttype = " and TestType = 5" \'属于考试项目
            Else
                qttype = " and TestType <> 5"
            End If

            Dim openid As String = drU("OpenID")
MessageBox.Show(openid)
            If Functions.Execute("UpdateLogonTime",openid) Then \'更新用户操作时间
                Dim dt As DataTable = DataTables("UsersTestForm")
                dt.ReplaceFor("IsCompleted",1,"[OpenId] = \'" & openid  & "\' and IsCompleted = 0" & qttype) \'如果其它的练习没有完成,则统一设置为完成
                Dim drnew As DataRow = dt.AddNew
                drnew("TestID") = _BizCodeBuilder.GetNextCode("UsersTestForm") \'使用专门的类获取编号,避免并发的时候产生重复编号
MessageBox.Show(drnew("TestID"))
                drnew("OpenId") = openid
                drnew("UserNick") = drU("Nickname")
                drnew("TestDate") = Date.Now
                Dim qty As Integer = val(varr(2))
MessageBox.Show(qty)
                If qty = 0 Then qty = 1
                drnew("QuestionQty") = qty \'选择的题目数量
                drnew("AnswerQty") = 0
                drnew("AnswerCodeQty") = 0
                drnew("CorrectQty") = 0
                drnew("CorrectRate") = 0 \'如果=1准确率默认为100%
                drnew("IsCompleted") = 0
                drnew("CompleteRate") = 0
                \'设置选择的练习题型
                Dim drDict As DataRow = DataTables("uSysDictionarys").Find("ItemName=\'" & varr(1) & "\' and GroupName=\'做题题型\'")
                Dim subType As Integer = 0
                If drDict IsNot Nothing Then
                    subType = val(drDict("ItemValue"))
MessageBox.Show(val(drDict("ItemValue")))
                End If
                drnew("TestType") = subType
                dt.Save
                
                \'把已经完成的练习移除,避免占用内存
                Dim ids As List(Of String) = dt.GetValues("TestID","IsCompleted = 1")
                dt.RemoveFor("IsCompleted = 1")
                DataTables("UsersCodeAnswerForm").RemoveFor("TestID in (\'" & String.Join("\',\'",ids.ToArray)  & "\')")
                DataTables("UsersTestForm").RemoveFor("TestID in (\'" & String.Join("\',\'",ids.ToArray)  & "\')")
                
                \'从问题顺序表获取一道题
                Dim sql As String = CExp("exec [upd_GetNextNewQuestionFor] @OpenID=\'{0}\',@SelectTestType={1}",openid ,subType)
                dt = Functions.Execute("Cmd_GetDataTable","Q",sql)
                Dim drQs As DataRow
                If dt.DataRows.Count > 0 Then
                    drQs = dt.DataRows(0)
                    Dim htmJson As String = Functions.Execute("GetNewAnswerHtm",openid ,drQs("QuestionID"),drQs("QuestionType"),drnew) \'生成题目html代码
                    e.WriteString(htmJson)
                    Return ""
                End If
            End If
        End If
    End If
End If
e.WriteString("错误: 无法创建新的练习, 请通知官方客服!")

--  作者:有点蓝
--  发布时间:2021/5/13 12:11:00
--  
在跟踪,看是那一句代码的问题。再看看日志提示具体什么错误?
--  作者:cnsjroom
--  发布时间:2021/5/13 14:37:00
--  回复:(有点蓝)在跟踪,看是那一句代码的问题。再看...
2021-05-13 12:09:56.9745
host=192.168.41.4
path=test\\newquestion.htm
HttpMethod=POST
poststring=773|标准题(全部)|10
ip=192.168.41.4


2021-05-13 12:12:50.2688
host=192.168.41.4
path=test\\Check.htm
HttpMethod=POST
poststring=773|0
ip=192.168.41.4

2021-05-13 12:12:50.3539
事件/函数: 自定义函数,NewQuestion
调用的目标发生了异常。
   在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   在 Foxtable.UserFunctions.Execute(String Name, Object[] Args)
未将对象引用设置到对象的实例。
   在 UserCode.AyDTit5gB0RU0SMFJ(Object[] Args)

启用了日志  但是看不大明白这个提示自定义函数NewQuestion 错误在那  

--  作者:有点蓝
--  发布时间:2021/5/13 15:05:00
--  
哪一句出错?

MessageBox.Show(openid)
            If Functions.Execute("UpdateLogonTime",openid) Then \'更新用户操作时间
MessageBox.Show(1)
                Dim dt As DataTable = DataTables("UsersTestForm")
MessageBox.Show(2)
                dt.ReplaceFor("IsCompleted",1,"[OpenId] = \'" & openid  & "\' and IsCompleted = 0" & qttype) \'如果其它的练习没有完成,则统一设置为完成
MessageBox.Show(3)
                Dim drnew As DataRow = dt.AddNew
MessageBox.Show(4)
                drnew("TestID") = _BizCodeBuilder.GetNextCode("UsersTestForm") \'使用专门的类获取编号,避免并发的时候产生重复编号
MessageBox.Show(drnew("TestID"))

--  作者:cnsjroom
--  发布时间:2021/5/13 15:23:00
--  回复:(有点蓝)哪一句出错?MessageBox.Show(openid...
            Dim openid As String = drU("OpenID")
MessageBox.Show(drU("OpenID"))
            If Functions.Execute("UpdateLogonTime",openid) Then \'更新用户操作时间

                Dim dt As DataTable = DataTables("UsersTestForm")
                dt.ReplaceFor("IsCompleted",1,"[OpenId] = \'" & openid  & "\' and IsCompleted = 0" & qttype) \'如果其它的练习没有完成,则统一设置为完成

                Dim drnew As DataRow = dt.AddNew
MessageBox.Show("12")
                drnew("TestID") = _BizCodeBuilder.GetNextCode("UsersTestForm") \'使用专门的类获取编号,避免并发的时候产生重复编号
MessageBox.Show("123")
                drnew("OpenId") = openid
MessageBox.Show("1234")
                drnew("UserNick") = drU("Nickname")
                drnew("TestDate") = Date.Now
MessageBox.Show("1235")
                Dim qty As Integer = val(varr(2))
MessageBox.Show(qty)
                If qty = 0 Then qty = 1
                drnew("QuestionQty") = qty \'选择的题目数量
                drnew("AnswerQty") = 0
                drnew("AnswerCodeQty") = 0
                drnew("CorrectQty") = 0
                drnew("CorrectRate") = 0 \'如果=1准确率默认为100%
                drnew("IsCompleted") = 0
                drnew("CompleteRate") = 0
                \'设置选择的练习题型
                Dim drDict As DataRow = DataTables("uSysDictionarys").Find("ItemName=\'" & varr(1) & "\' and GroupName=\'做题题型\'")
                Dim subType As Integer = 0
                If drDict IsNot Nothing Then
                    subType = val(drDict("ItemValue"))
MessageBox.Show(val(drDict("ItemValue")))
                End If
                drnew("TestType") = subType
                dt.Save

红色部分不弹提示  后续的也不弹

--  作者:有点蓝
--  发布时间:2021/5/13 15:28:00
--  
检查一下全局代码,看看数据库对应的编号表uSysBizCode是否存在
--  作者:cnsjroom
--  发布时间:2021/5/13 15:42:00
--  回复:(有点蓝)检查一下全局代码,看看数据库对应的...

编号表是存在的 
就是没有数据写入这个UsersTestForm表

此主题相关图片如下:11.png
按此在新窗口浏览图片

此主题相关图片如下:22.png
按此在新窗口浏览图片

以下内容是专门发给有点蓝浏览



麻烦老师帮忙看看   中午折腾了一中午都没有找到原因  谢谢老师的耐心解答!

访问地址:
http://192.168.41.4/login.htm   登录名  张三   密码  666
登录成功后
http://192.168.41.4/Begin.htm?id=773
[此贴子已经被作者于2021/5/13 15:43:06编辑过]

--  作者:有点蓝
--  发布时间:2021/5/13 15:49:00
--  
一样自己调试一下全局代码

另外看看这里弹出什么
                Dim drnew As DataRow = dt.AddNew
MessageBox.Show(_BizCodeBuilder is nothing)
                drnew("TestID") = _BizCodeBuilder.GetNextCode("UsersTestForm") 

另外编号里有2条都是UsersTestForm的记录,这个不合理,请删除自己添加的数据