首页 > 编程 > .NET > 正文

.Net正式版中的一些Bug及其解决方案

2024-07-10 13:02:10
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • .net正式版中的一些bug及其解决方案 (原创)
    作者: 飞刀     
    (1)session的问题

    问题:

    在我的windows.net 3604 + .net framework正式版的编程环境中,.net下的session总是有问题,比如我在a程序下设置了一个session字典,这个session将会在b程序下读取,现在的情况就是我在b程序读取这个session时,第一次能够正常读取,但一旦页面被提交(这在asp.net编程中是常有的事情),session就会马上消失,错误报告“object is null”,使用trace发现此session已经不存在。

    此问题排除浏览器不支持cookie的可能,因为我读取cookie是正常的。

    解决方法:

    使用session的cookieless状态,具体操作即更改web.config或machine.config文件,这样session的传值是在url中进行的。
    使用cookie,cookie是可以正常使用的,只要浏览器没有关闭此功能。
    (2)findcontrol方法的问题

    问题:

    大家都知道所有控件集合都存在有一个findcontrol方法,一般最常用的地方就是datagrid对item中控件的操作。这是一个很好用的方法,可以让我们迅速地找到我们想要的控件,但是他也是我遇到过的最不稳定的方法。

    在item中使用这个方法,一般不会出现什么问题,但是在datagrid、datalist的各种事件中这个方法经常是找不到控件!!datagrid还好一点,datalist的事件中发生的情况就惨不忍睹,100%的找不到控件!!这个控件是活生生存在的,使用controls集合中是可以发现这个控件的。这个问题我在beta2下就已经发现了,原以为微软会在正式版本中更正,不知道是没有人提出呢?还是没有发现,正式版中依然这样。

    开始我以为findcontrol这个方法没有写好,我就自个重写了这个方法,但是当我高兴地去用我自个写的方法时,发现传回来的值还是null!!!现在也就只有一个解释了,那就是.net环境中对control类型的支持还是不稳定的。

    解决方法:

    即然通过编写方法传回值的方法搞不定,那么就只有用最原始的方法,在本函数内,直接列举controls集合中的控件,直到找到这个控件为止。

    private void showquestion_itemdatabound(object sender, system.web.ui.webcontrols.datalistitemeventargs e)
    {
    //当返回值为control类型,经常出现空值

    foreach(control cl in e.item.controls)
    {
         if(cl.clientid.indexof("optionaltd1") != -1 || cl.clientid.indexof("optionaltd2") != -1)
         {
            foreach(control clx in cl.controls)
             {
                if(clx.clientid.indexof("oplbl1") != -1 || clx.clientid.indexof("oplbl2") != -1)
                 {
                     if(((label)clx).text == "")
                    {
                        ((htmltablecell)cl).innerhtml = "";
                    }
                }
             }
          }
    }

    是程序员都会对上面的方法蚩之以鼻,但是没有办法了,微软逼我走上了这条路,不然没有办法找到我要的东东。

    (3)oledb的问题

    问题:

    大家都知道.net平台下访问数据库有两种途径,一种是sqlclient,另一种就是oledb,sqlclient是专为sql server设计的,为了保证程序的兼容性,我们还是得使用oledb。

    使用oledb是一件令人痛苦的事情,必须有着超人的意志力和耐心,使用oledb写一次程序和做一次恶梦没有两样,大家真不知道那些五花八门的错误出在什么地方。先看下面的程序。

    string strinsertread = "insert into unread (judge1_result,judge2_result) ";
    strinsertread += " values (@judge1_result,@judge2_result)";

    oledbcommand mycomm = new oledbcommand(strinserread,myconn);

    mycomm.parameters.add("@judge1_result",oledbtype.longvarchar);
    mycomm.parameters["@judge1_result"].value = strjudge1_result;

    mycomm.parameters.add("@judge2_result",oledbtype.longvarchar);
    mycomm.parameters["@judge2_result"].value = strjudge2_result;

    ......

    mycomm.executenonquery();

    执行这么一段程序,你们认为会报什么错误?(注意myconn是oledbconnection实例,已经打开)

    报出的错误是“输入数据类型与数据库字段类型不匹配!!”?

    我是想了好久?strjudge1_result和strjudge2_result都是string,而数据库中相应字段的为"text",怎么会相配?怎么也不可能啊。没有办法,我改变字段的数据库类型试着让数据录入数据库,然后再直接从数据库中查看录入的数据是什么?

    一看不知道,一看就把我气昏,进入数据库的并不是strjudge1_result和strjudge2_result所表示的判断的结果,而是设定的另一个变量idcard和template,两个毫不相干的变量怎么会搞到一起去??我使用trace查看入库前strjudge1_result的数据是正确的,这就说明是在入库时出现的问题,这里就是parameters属性做的好事!

    我把这个程序中的oledb全部改成sql,程序全部正常!我只能说oledb的数据库操作是垃圾(也许说的有些过火),大家如果操作oledb出现了一堆问题,你要信任自己,有些事情不是你的错,而是微软不想你用其它的数据库。

    解决方法:

    如果您是操作sql server,那么我建议您直接使用sqlclient,这样免去很多麻烦。如果非要使用oledb来操作其它的数据库,请尽量少用parameters属性来传递参数,而是直接写进sql语句:

    string strinsertread = "insert into unread (judge1_result,judge2_result) ";
    strinsertread += " values ('"+strjudge1_result+"','"+judge2_result+"')";


    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表