1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar ;
Class.forName( "org.gjt.mm.mysql.Driver" );
cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd );
2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar ;
Class.forName( "org.postgresql.Driver" );
cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd );
3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip ;
Class.forName( "oracle.jdbc.driver.OracleDriver" );
cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );
4. Sybase(http://jtds.sourceforge.net)jconn2.jar ;
Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );
cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd );
// (Default-Username/Password: "dba"/"sql")
5. Microsoft SQLServer(http://jtds.sourceforge.net) ;
Class.forName( "net.sourceforge.jtds.jdbc.Driver" );
cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd );
6. Microsoft SQLServer(http://www.microsoft.com) ;
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd );
7. ODBC
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd );
8.DB2
Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");
String url="jdbc:db2://192.9.200.108:6789/SAMPLE"
cn = DriverManager.getConnection( url, sUsr, sPwd );
| 什么是 Java 技术? | |||||||
|
|||||||
| Java 技术为什么重要? | ||||||||
|
||||||||
| 什么是 Java 组件技术? | ||||||||
|
||||||||
| Java 技术如何与 Web 服务联系起来? | ||||||||
|
||||||||
| 如何提高 Java 编程技能? | ||||||||
|
||||||||
| Java 编程人员可以使用哪些 IBM 工具和产品? | ||
|
||
在DotNet开发环境下,如果配置文件WEB.CONFIG中
编码格式设置为utf-8,如下节点:
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
那么在ASPX引用脚本文件,需要该脚本文件的文件格式也是utf-8,否则会报莫名其妙的脚本错误,
其他文件也是类似的处理方法。
技术&管理&做人&行业
每天晚上,请你问自己这些问题:
1, 今天我是否克服了技术上新的困难?
2, 今天我是否多读了一些新书?
3, 今天我是否就某方面的问题与人进行了交流?
4, 今天我是否多认识了一个新同事或新朋友并准备与他们保持联络?
5, 今天我是否更多的接触到身处的行业需求,现状,和发展?
精通技术
精通技术是技术人员的根本要求,也是技术人员人生发展的必经之路,只有首先精确掌握一门技术,才能触类旁通的掌握其他技术。精通技术不仅仅是为了精通技术,而是为了触类旁通,为了掌握精通技术的学习方法,研究方法,体会身处技术顶点的感受和境界,这样,下一次准备或需要进入另一个领域时,才会有明确的目标。
为了精通技术,就要有以工作为乐的精神。不主张过于频繁的换工作(常常被认为是不热爱工作,不适应环境,或者不忠诚的表现)。以工作为乐,才会投入更多的精力和时间,才能够飞快成长,成为该方面的能手。以工作为乐,是朝着技术高峰阔步迈进的享受过程。
如果仅仅的是以工作为乐,仅仅号称自己喜欢工作,而没有“朝着技术高峰阔步迈进”,则是一种浪费。要做工作和生活的有心人,才不会迷信技术,才会避免骄傲,才不会在达到某个水平以后停步不前。不仅要做有心人,还要学会研究。研究该门技术的发展方向,该门技术最好的学习方法,在该门技术上取得突出成就的道路,和激励自己沿着正确的方向前进的诀窍。做好了这些问题的研究,就会在以工作为乐的境界中做出超凡的成绩。
总之,
1, 反对不认真对待技术。
2, 反对不热爱工作,一心旁鹜。
3, 做生活和工作的有心人。
懂得管理
懂得管理,既要学会管理,也要学会配合管理。那些对所有人和所有事情都吹毛求疵的人是不适应社会的,也是不容易成功的。懂得管理,既要学会管理工程(进度,过程,资源,需求分析,客户交流),又要学会管理人。要重视团队建设,重视团队的合作,重视团队的文化建设,重视团队的凝聚力,重视管理者的个人感染力。
在用户不能提出明确的需求的情况下,要综合经验,替用户提出明确的需求。
符合标准的过程控制,方法论的实际应用可以引导工程有一个可期望的好结果。否则就是运气的功劳。
资源的合理配置,建设一个每个人舒适工作的环境,不要让你的组员不得不总是把精力放在环境建设等问题上,是让人做出更大成绩的捷径。
与人畅快交流的能力,成为软件人员必备的素质之一。懂得行业的知识就从这里开始。
那些单纯学过管理的人,无论进入那一个行业,都需要不断的迅速的学习一些关于该行业的专门知识,至少是名词术语,基本原理,关键技术,主要应用。这样的了解初步管理知识的人,一定不要对技术人员指手画脚,否则一定得不到应有的认同,反之,如果他们从过程本身的流程或者方法论等方面提出建议,就可以更好的体现自己的价值。
进入行业
软件工作,离不开行业,尤其是应用软件。一个仅仅懂得实现技术的人,是不够的。所以一定要拓展你的知识,对你所处在的行业有一个更全面,更准确,更实质性的了解。
软件人员看到需求分析,常常想到如何去实现它,而不会认真的去研究这份需求,站在用户的角度上来做更多的工作,这是值得软件人才所注意的。
研究你所在的行业,也需要有一种系统的方法。了解其中的关键点是进入这个行业的捷径。了解触及该行业更多方面的关键点,是掌握这个行业的必经之路。对该行业做系统的总结分析,是深入该行业的目的。初步的研究成果经过更多的提炼和交流,就会成为金子般的智慧。
以下是几点建议:
从点滴做起。先做好那些你力所能及的工作。标准化你的行业。你所处的行业虽然确定,但是每一家公司的需求各不相同。掌握他们做事情的流程,可以帮助你做好标准化。同时学习那些该行业的标准,以用户的标准为标准,更加深刻的理解标准,是代替用户做好标准化的方法。
掌握核心技术。任何行业都有核心技术。掌握某一项核心技术,就可以让你进入这个行业并在其中生存,反之仅仅浅尝辄止,就会让你遭遇失败,抱怨不公。
影响你职业发展的几项能力
1, 研究问题的能力
2, 影响他人的能力
3, 个人履历
请相信以下观念
1,教育不是万能的。希望学校或者任何一个教育机构为你准备所有的知识,能力,水平,是不可能的。最好的大学是自己和无字书。
2, 成长在工作中。工作中的表现和积累才是人生腾飞的实际动力。
从今天起,请做好
1, 培养你自己更广泛的兴趣,并坚持你的人生目标
2, 锻炼你的演讲能力
3, 多认识朋友,以他们为荣
4, 培养你的远见卓识
添加一个aspx的转换页面,后台代码如下:
Response.Write("<form name=frm id=frm action=aspxtoasp.asp method=post>");
foreach(object obj in Session.Contents)
{
Response.Write("<input type=hidden name=’"+obj.ToString()+"’");
Response.Write(" value = ‘"+Session[obj.ToString()].ToString()+"’>");
}
Response.Write("</form>");
Response.Write("<script language=’javascript’>frm.submit();</script>");
在aspxtoasp.asp获取FORM的值,写入自己的SESSION
我们大部分都用过TreeView控件,对这个控件的评价也是各式各样的,但是我觉得不论如何它是一个免费的开源的控件,所以我还是在用它。在刚接触ASP.NET的时候,记得需要做一个分配权限的权限树,当时只知道有这个树,经过一天的研究对其服务器端的行为基本以及搞清楚了,但是由于当时的js水平有限,所以对客户端的代码很畏惧,基本没有看过。
当时有这样一个要求:如果一个节点被选中则该节点的所有子节点都要选中,如果该节点的所有子节点取消选择则该节点也要取消选择(节点一致性),相反一样。
还有一个要求就是:如果可以实现三态树则更好(这个有点难,本文中不予讨论)。本文将详细介绍前面要求1。
首先我们要庆幸微软的这个TreeView控件是开源的,不论是客户端代码还是服务器端代码您都可以轻松获得,可以去微软的网站上下载。在网上也见过一些讲述该问题的文章,他们大多是使用一个TreeView之外的js实现,我个人认为从面向对象的观点,该功能属于TreeView,所以没有理由将它分离出去,因此今天我将修改TreeView.htc来实现上面的功能。要想获得该文件(TreeView.htc)可以去微软的网站上下载之。
说实在的该功能曾经也困扰了我很久,一直想解决这个问题,但是一直没有时间来研究TreeView.htc中的代码,今天终于下决心搞定它。
我们知道在TreeView的oncheck中需要激发该事件处理函数,这个函数很容易找到,可以在TreeView生成的客户度脚本中找到,代码片断如下:
oncheck="javascript: if (this.clickedNodeIndex != null) this.queueEvent(‘oncheck’, this.clickedNodeIndex)"
由此我们可以去htc(以后说的htc都指的是TreeView.htc),找到doCheckboxClick方法,只要看名字就知道它是干什么的(命名实在太重要了,否则在3000行代码中找某个函数真的很累)。
该方法是当用户点击CheckBox的使用要处理的函数,函数如下所示:
function doCheckboxClick(el){
var checked = private_getAttribute(el,"checked")
el.checked = !checked;
var evt = createEventObject();
evt.treeNodeIndex = getNodeIndex(el);
g_nodeClicked = el;
_tvevtCheck.fire(evt);
setNodeState(el,el.checked);// maybe need el only,but I think it’s safly
}
其中第一行、第二行以及最后一行是我添加的,第一二行是为了在页面回传以后checked属性无效时所做的修改,按照原来的方法在提交后el.checked是undefined,所以导致无法正确同步节点,如果读者有兴趣可以试一试。setNodeState函数,从名字上可以看出该函数是用来设置节点状态的,它将当前你选择的节点作为参数传递到函数内部。如注释中所说实际上你可以只传递el进去,而无需再传一个布尔值,不过我想这样传递可能更安全,不过没有关系,你觉得不爽可以修改:。
下面看看setNodeState的函数体,该函数由两个方法组成,一个是设置所有孩子节点的状态,一个是设置该节点的父节点状态。代码如下:
function setNodeState(el,state){
_setChildNode(el,state);
_setParentNode(el,state);
}
为了可以设置当前节点的所有孩子节点是否和父节点(本节点)状态一至我们需要函数_setChildNode,同理为了使节点的父节点和该节点状态一至我们需要_setParentNode函数。两个函数都是递归函数,将会遍历所有的子节点和所有的父节点以及兄弟节点(为什么要遍历兄弟节点稍候再说),下面我们先看看遍历孩子节点的代码,代码如下所示:
function _setChildNode(el,state){
var childNodes = el.children;
if(childNodes.length > 0){// if has childs
for(var i = 0 ;i<=childNodes.length-1;i++){
private_setAttribute(childNodes[i],"Checked",state);
_saveCheckState(childNodes[i]);
_setChildNode(childNodes[i],state);
}
}
}
该函数先获得当前节点的所有子节点,这里可以直接使用TreeView提供的函数getChildren方法,而我使用的使html的原始方法。如果该节点存在子节点则遍历所有子节点,同时设置子节点的状态和当前节点的状态一致,_saveCheckState函数的作用稍候会介绍。private_setAttribute方法为TreeView提供的一个内部设置属性的方法(js没有private关键字,这里只是做说明而已),该方法将设置每一个节点的Checked属性为当前这个节点的状态。
下面是如何设置父节点状态的代码:
function _setParentNode(el,state){
var parentNode = el.parentElement;
if(parentNode){
if(!_checkSiblingdNode(el)){
private_setAttribute(parentNode,"Checked",state);
_saveCheckState(parentNode);
_setParentNode(parentNode,state);
}
}
}
该函数先获得其父节点,如果父节点存在则检查当前节点的兄弟节点,上面有提到了需要检查兄弟节点,这里检查兄弟节点的目的是:父节点的状态不是由当前节点一个节点控制的(这种情况只存在于当前节点没有兄弟节点的情况下),如果有其他兄弟是选中的,那么父节点是不能被取消了,这样将导致兄弟节点和父子节点不一致不一致。该函数里面也调用了_saveCheckState函数,在后面将介绍之。
下面的代码描述了如何检查兄弟节点的状态,代码如下:
function _checkSiblingdNode(el){
var parentNode = el.parentElement;// you can use getParentTreeNode function in this htc,but I like this usage.
for(var i = 0;i<=parentNode.children.length-1;i++){
if(el != parentNode.children[i]){
if(private_getAttribute(parentNode.children[i],"Checked")){
return true;
}
}
}
return false;
}
正如注释所述,你可以使用getParentTreeNode方法来获得节点的父节点,但是我比较喜欢使用原始的方法:。这里将排除自己(if(el!=parentNode.children[i]))。
有了上面的代码我们就可以做到客户端无刷新的父子节点一致的选择,那么我们现在来介绍一下_saveCheckState函数,如果没有该函数页面提交以后,刚才除了手工点击的节点以外其他的节点都不能保存状态。所以该函数的作用就是要保存所有节点的状态(主要是自动选择的节点),保证在回传之后树的状态依然存在。下面的代码描述了_saveCheckState函数,代码如下:
function _saveCheckState(el){
if(getNodeIndex(el))
queueEvent(‘oncheck’, getNodeIndex(el));
}
该方法首先检查当前节点的index是否有效,如果有效则保存状态。这里需要说一下queueEvent方法做了什么,代码我就不帖了,该函数的实际意义是将客户端的操作保存在一个名为__TreeView1_State__的隐藏域中,这样在回传的时候服务器端会根据该隐藏域,初始化树的状态。其中TreeView1是我在测试系统中TreeView的名字。
最后的问题就是部署的问题了,因为修改了htc,所以在部署的时候需要替换原来的htc文件。
1.下载地址
http://msdn.microsoft.com/downloads/samples/internet/ASP_DOT_NET_ServerControls/WebControls/default.asp
下载后是后缀为bat的版本
(1)bulid.将bulid.bat的路径指向csc.exe所在路径,生成Microsoft.Web.UI.WebControls.dll。
(2)在wwwroot下创建空目录webctrl_client\1_0。
(3)将build\Runtime下的文件拷至webctrl_client\1_0下。
(4)选择工具箱的自定义工具箱,添加Microsoft.Web.UI.WebControls.dll。
有些麻烦
但如果你能找到后缀是msi的自动安装版本,直接下一步就行(我一直用这个版本,hoho)
安装后,通过“自定义工具箱”->“.net框架组件”把TreeView添加到工具箱里
2.运行时无法显示
一般是TreeView的版本问题,最好下载英文版自动安装版本重新安装,安装前应该先到添加删除程序里卸掉原版本
3.显示格式出错(非树状显示)
TreeView要求客户端浏览器版本为IE5.5及以上,最好要求客户端升级为IE6.0
4.框架里使用TreeView
设置NavigateUrl、Target属性,可更新另外的Frame
5.找不到TreeNode类
使用TreeView,最好添加namespace:using Microsoft.Web.UI.WebControls;
6.遍历TreeView节点(递归算法)
private void Page_Load(object sender, System.EventArgs e)
{
GetAllNodeText(TreeView1.Nodes);
}
void GetAllNodeText(TreeNodeCollection tnc)
{
foreach(TreeNode node in tnc)
{
if(node.Nodes.Count!=0)
GetAllNodeText(node.Nodes);
Response.Write(node.Text + " ");
}
}
7.得到node结点的父节点
TreeNode pnode;
if(node.Parent is TreeNode)
pnode=(TreeNode)node.Parent;
else
//node is root node
8.修改TreeView样式(示例)
<iewc:TreeView id="TreeView1" runat="server" HoverStyle="color:blue;background:#00ffCC;" DefaultStyle="background:red;color:yellow;" SelectedStyle="color:red;background:#00ff00;">
用代码:
TreeView1.DefaultStyle["font-size"] = "20pt";
9.展开时不提交,改变选择节点时才提交
将autopostback设置成false;
在body里添加 <body onload="initTree()">
然后在PageLoad里写:
string strTreeName = "TreeView1";
string strRef = Page.GetPostBackEventReference(TreeView1);
string strScript = "<script language=\"JavaScript\"> \n" + "<!– \n" + " function initTree() { \n" +" " + strTreeName + ".onSelectedIndexChange = function() { \n" + "if (event.oldTreeNodeIndex !=
event.newTreeNodeIndex) \n" + "this.queueEvent(‘onselectedindexchange’, event.oldTreeNodeIndex + ‘,’ + event.newTreeNodeIndex); \n" + "window.setTimeout(‘" + strRef.Replace("’","file://’/") + "’, 0, ‘JavaScript’); \n" + " } \n" + " } \n" + "// –> \n" + "</script>";
Page.RegisterClientScriptBlock("InitTree",strScript );
这样就只有你点击的节点更改的时候才提交!
10.TreeView结合XML
把XML文件设置为如下格式,然后直接设置TreeNodeSrc为该XML文件就行
<?xml version="1.0" encoding="GB2312"?>
<TREENODES>
<TREENODE TEXT="node0" EXPANDED="true">
<TREENODE TEXT="node1"/>
<TREENODE TEXT="node2"/>
</TREENODE>
<TREENODE TEXT="node3" NavigateURL="3.aspx"/>
</TREENODES>
或者用代码
TreeView1.TreeNodeSrc="a.xml";
TreeView1.DataBind();
客户端控制TreeView
http://expert.csdn.net/Expert/topic/1382/1382892.xml
1.设置所选节点,如选中第二个节点
function SetSelNode()
{
TreeView1.selectedNodeIndex="1";
}
2.得到所选节点的Text,ID或NodeData
function GetAttribute()
{
alert(TreeView1.getTreeNode(TreeView1.selectedNodeIndex).getAttribute("Text"));
}
替换Text为ID或NodeData,可分别得到所选节点的ID或NodeData
3.修改节点属性,如修改第一个节点的Text
function ModifyNode()
{
var node=TreeView1.getTreeNode("0");
node.setAttribute("Text","hgknight");
}
4.得到点击节点
function TreeView1.onclick()
{
alert(TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute("Text"));
}
5.添加节点
function AddNode()
{
var node=TreeView1.createTreeNode();
node.setAttribute("Text","hgknight");
TreeView1.add(node);
}
6.js遍历所有节点
var AllRootNode=new Array();
AllRootNode=TreeView1.getChildren();
AlertNode(AllRootNode);
function AlertNode(NodeArray)
{
if(parseInt(NodeArray.length)==0)
return;
else
{
for(i=0;i<NodeArray.length;i++)
{
var cNode;
cNode=NodeArray[i];
alert(cNode.getAttribute("Text"));
if(parseInt(cNode.getChildren().length)!=0)
AlertNode(cNode.getChildren());
}
}
}
<script language="javascript">
<!–
function window.onbeforeunload()
{
if(event.clientX>document.body.clientWidth)
alert("关闭了");
}
//–>
</script>
ASP.NET调试。
注 如果在本部分中找不到需要的错误消息,请查看处理常规调试问题部分或处理远程调试问题部分。
消息:无法在 Web 服务器中启动调试。

图 1. 无法启动调试错误消息
原因 1:未将 IIS 应用程序配置为使用 Integrated Windows Authentication。确保已选中“Authentication Method”对话框中的 Integrated Windows Authentication 复选框,如图 2 所示。

图 2. 启用集成身份验证
原因 2:检查 IIS 的 Enable HTTP Keep Alive 选项。如果它是关闭的,则可能需要将其打开,再尝试调试。
消息:您没有调试服务器的权限。

图 3. 无调试权限
原因 1:确保已启用 Integrated Windows Authentication。可能的原因是仅为 IIS 的 Directory 安全启用了 Basic authentication。
原因 2:如果您在使用 Integrated Windows Authentication,则需要确保您的用户帐户能够完全控制 IIS 的目录。
原因 3:如果使用完整的机器名(如 machinename.domainname.something)创建 Web 项目,则该 Web 站点会被识别为 Internet 站点。因此,Internet Explorer 的默认设置将对登录行为产生影响。在这种情况下,您需要使用当前帐户在具有 IE 设置的“Internet”区域启用登录。
然而,这不是 Internet Explorer 的默认设置,因此最好仅使用机器名来创建项目,将图 4 用作 Security Settings 的指南。

图 4. 设置 Internet Explorer 身份验证
消息:发送调试 HTTP 请求时发生服务器端错误。

图 5. 调试期间的服务器端错误
原因 1:Web 应用程序没有应用程序名。为此,请使用 IIS MMC 来检查 Web 项目的属性,确保 Web 项目具有应用程序名。当图 6 中的红色轮廓出现时,应该出现应用程序名。

图 6. 设置应用程序名
原因 2:如果使用的是 NTFS 文件格式,则确保“aspnet”具有“wwwroot”或虚拟目录文件夹上的适当权限,才能访问和写入这些文件夹。
消息:没有对项目进行配置以接受调试。

图 7. 未针对调试配置项目
如果出现这一错误消息,则需要针对调试配置 Web。为此,需要在 web.config 文件中设置 debug = true。此文件位于 Web 项目文件夹中。
您可以启动调试,同时不出现错误消息,但是不能到达断点。
您使用 F5 键启动了调试,看起来好像正确启动了调试并且也正确启动了 Internet Explorer,但是您不能到达代码隐藏的代码中的断点。
原因 1: 在项目属性中未启用 Asp.net 调试。按照图 8 所示将该项设置为 True。

图 8. 启用 ASP.NET 调试
在 VB 项目中,UI 有所不同,但可以轻松地识别等效项。
原因 2:请确保使用匹配的调试符号文件加载期望的 DLL。可以使用 Modules 窗口来检查这一点。
消息:未正确安装调试器。

图 9. 未正确安装调试器
如果看到这一问题,请在 Console Application 项目中检查调试功能。如果控制台应用程序项目显示如图 10 所示的错误消息,则表示未正确安装 .NET Framework 应用程序。

图 10. 无法启动调试
需要通过执行“regsvr32 mscordbi.dll”来手动注册“mscordbi.dll”。
消息:服务器不支持对 ASP.NET 或 ATL 服务器应用程序的调试。

图 11. 无法启动调试
如果您在机器上安装了 Windows XP Pro 或 Windows 2000 Pro,则可能需要考虑 Visual Studio 7 和 IIS 之间的安装顺序。如果在 Visual Studio 7 之后安装 IIS,则会发生这一错误。在这种情况下,请使用“aspnet_regiis.exe –i”注册“aspnet_isapi.dll”。
消息:访问被拒绝。检验您是否是管理员或某个组成员。

图 12. 访问被拒绝
您可能不是该计算机上 Debugger Users 组的成员。将您的用户帐户添加到计算机上的 Debugger Users 组中即可解决此错误。
要将您的用户帐户添加到 Debugger Users 组中,需要执行以下操作:
|
1. |
作为 Administrator 登录。 |
|
2. |
运行 Administrator tools 中的 Computer management。 |
|
3. |
选择 Local users and groups\groups 节点。 |
|
4. |
双击右边窗格中的 Debugger Users 组。 |
|
5. |
单击 Debugger users properties 对话框中的 Add 按钮。 |
|
6. |
键入用户帐户并单击 OK。 |
消息:无法启动 ASP.NET 或 ATL 服务器调试。

图 13. 未安装ASP.NET 或 ATL
原因 1:您可能安装了 IIS Lockdown 工具。如果这样,则查找 urlscan.ini 文件,并将 DEBUG(区分大小写)添加到 [allowverbs] 部分中。
原因 2:如果将域控制器用作服务器,并且项目是使用机器名(非完整域名)创建的,则可能需要将项目的 URL 更改为完整域名。
原因 3:如果将 IIS 设置为使用专用 IP(例如 Web site identification,可以在 IIS MMC 的 IIS 设置中找到这一选项),则可能看到这条错误消息。在这种情况下,需要更改项目名,直接使用 IP 地址。对于现有项目,需要更改项目以使用 IP 地址,而不用通过编辑 .sln 文件和 .webinfo 文件使用机器名。
原因 4:web.config 文件的 中的值太大。默认单位是千字节而非字节,因此如果更改此数字,使用了错误的单位,则可能导致调试问题。
消息:访问被拒绝。

图 14. 访问被拒绝
原因:您可能是 Debugger Users 组的成员,但是您不具有调试 aspnet 辅助进程的权限,因为您不是 aspnet 用户帐户或 Administrators 组的成员。将您的用户帐户添加到机器上的 Administrators 组即可解决此问题。
无法使用包括文件进行调试
在 ASPX 中,无法使用包括文件进行调试。将旧的 ASP 项目转换为 ASPX 时,往往产生包括文件。
如果通过 包括文件,则可能无法正确调试该包括文件。您需要使用 来代替。
更改密码后,需要注销/登录才能进行 ASP.NET 调试。
更改密码后,需要注销,然后再登录才能正确进行 ASP.NET 调试。
安装 Windows2000 SP4 后,ASP.NET 调试不能运行,同时显示消息“访问被拒绝”。
此问题的解决方法是,使用 regsvr32 –i aspnet_isap.dll 重新注册 aspnet_isap.dll。
仅在首次加载页面时遇到断点。
针对这一特定问题,可能存在多种原因,但是最大的可能性是您在 web.config 文件中设置了页面缓存选项。
如果在 web.config 中看到类似于 的内容,则需要将值设置为“False”,以关闭 Web 页面缓存。更改该设置并刷新页面后,可能遇到断点。
您需要共享 Web 服务器以进行调试,但是不想让其他用户成为计算机管理员。
在 Visual Studio .NET 中,以下二者可以确定用户是否可以进行调试。其中之一是 Debugger Users 组,另一个是用户权限,如管理员、Power User 或 SEDebug。
Debugger Users 组确定用户是否可以访问 VS 调试组件(主要是 MDM-Machine Debug Manager,Visual Studio 的一部分),所以成为该组的成员意味着保证可以访问 MDM。因此在这一点上,您可以调试开放进程并查看机器上的进程列表。
不过在此之后,您是否可以调试其他用户的进程取决于您的权限。例如,如果您想调试别人的本地进程,则需要具有 SEDebug 权限.针对其他用户的托管进程,您应该是该机器上的管理员,才有权进行调试。
因为存在这一限制,所以在您的方案中,应该授予学生管理员权限。否则,默认情况下无法对 ASP.NET 辅助进程进行调试。
我们有一种变通方法。Cassini 是一个独立的小型 ASP.NET 服务器。对学生来说,他们可以使用 Cassini 进行开发,稍后将开发结果部署到实际服务器上来提交结果。Cassini 位于 http://www.asp.net/Projects/Cassini/Download/。
常规调试
这些案例基于 Console application 项目类型。
消息:无法启动调试。

图 15. 无法启动程序
导致图 15 中所示问题的原因是没有正确注册 mscordbi.dll。此问题的补救办法是手动注册该文件。
消息:无法启动调试。访问被拒绝。

图 16. 拒绝访问错误消息
确保正确启动 Machine Debugger Manager 服务,并且确保您是 Debugger Users 或 Administrators 的成员。
我可以启动托管调试,但是 PDB 不加载,并且不能遇到任何断点。
如果正确启动了调试器,但不能遇到任何断点,则您可能需要检查 diasymreader.dll 的安装。可能没有注册该文件。要注册该文件,需要执行以下操作:
regsvr32 \diasymreader.dll
托管调试不运行
在进程创建 CLR 对象前,以 CLR 模式连接本地进程。托管调试不运行。
解决方案 1:在进程中使用了 CLR 代码后再连接进程。
解决方案 2:以 InterOp 模式连接进程。在这种情况下,不必在调用 CLR 代码之后再连接进程。
托管调试器不响应
使用托管代码启动调试时,调试器不响应。
解决方案:确保已停止并禁用 .NET FrameworkSupport 服务(仅停止该服务还不够)。
如果没有运行 .NET FrameworkSupport 服务,则禁用 IIS admin 服务。
使用 C# 代码单步调试不正确
考虑以下代码:
string someStr;
someStr = "SomeValue";
if(someStr == null)
Console.WriteLine("what's up?");
try
{
}
catch(Exception e)
{
}
如果使用此代码,则会看到遇到“if”语句时,指令指针将移动到“if”语句体 (Console.WriteLine("what’s up?");)。
这不是一个调试器 bug,而是一个众所周知的 try catch 块调试信息问题。请参见以下调试器中 try catch 块示例的反汇编代码。
if(someStr == null)
a cmp dword ptr [ebp-18h],0
e jne C
Console.WriteLine("what's up?");
mov ecx,dword ptr ds:[01C50070h]
call dword ptr ds:[02F0257Ch]
c jmp
catch(Exception e)
e mov dword ptr [ebp-1Ch],eax
call C0846
jmp
}
nop
值没有匹配时,指令指针移动到 0000003c jmp 行,但是该行已经错误地与“if”语句体相匹配。当代码功能正确时,显示就不正确了。
因果性调试:Web 服务客户端和 Web 服务之间的步骤
无法从 Web 服务客户端到 Web 服务设置调试
默认设置不允许从 Web 服务客户端进入 Web 服务。它的运行方式类似 step-over。
ASPNET 辅助进程(aspnet_wp.exe 或 w3wp.exe)在“aspnet”或“network service”用户帐户之下运行,而这些帐户没有通过 DCOM 访问 MDM 的权限。因此,需要将这些帐户添加到 Debugger Users 组中。
启用 Web 服务模拟后,无法再使用因果性步骤。
使用“web.config”为 Web 服务启用模拟时,不能从 Web 服务客户端代码进入 Web 服务代码。因为,它的运行方式类似于 step over。
您需要执行以下操作来更正客户端和服务之间的步骤。
| • |
关闭 IIS 中的 Anonymous access。 |
| • |
更改客户端代码,将凭据设置为 Web 服务,如下所示: |
| • |
Service1 obj = new Service1(); |
| • |
obj.Credentials = System.Net.CredentialCache.DefaultCredentials; |
在此之后,您将能够从客户端进入 Web 服务。
这些操作是必需的,因为当您进入 Web 服务时,某些 .NET Framework 组件需要使用系统级调试器组件 (MDM) 来共同创建它。如果不能提供正确的凭据,则此步骤将失败。如果没有这些正确的凭据,“step into”的运行将类似于“step over”。
调试器挂起
如果 Web 服务客户端代码在 STA (Single Thread Apartment) 模型中运行,并且它在等待异步调用完成,如下所示:
Service1 obj = new Service1();
System.IAsyncResult ar = obj.BeginHelloWorld(new System.AsyncCallback(Class1.Handle),obj);
while(ar.IsCompleted != true)
{
System.Threading.Thread.Sleep(1000);
}
则调试器将挂起。发生此挂起操作,原因在于调试器中的代码已锁定一个调试器组件。解决方案 1 是更改代码以使用与事件或 mutex 同步的线程。另一个解决方案是注销 csm.dll。第二个解决方案禁用 causality 步骤(从 Web 服务客户端代码到 Web 服务方法的步骤)。您可能需要手动连接 aspnet_wp.exe 才能调试 Web 服务。
远程调试
无法查看远程机器上的任何进程
确保在远程机器上安装了 Remote full debug 设置,并且您是 Debugger Users 组的成员。
因 RPC 问题而无法连接到远程机器
以下信息摘自 Mike Clay 撰写的 KB 文章。
如果通过“Processes”对话框连接到远程机器上时看到以下错误消息:
Error while trying to run project: Unable to start debugging on the web server. Not enough storage is available to complete this operation.
或者在进行 ASP.NET 调试期间看到这一消息:
Error while trying to run project: Unable to start debugging on the web server. Unable to map the debug start page URL to a machine name.
则确保 RPC 在您的机器与远程机器之间正确运行。下面的行为可能导致 RPC 问题:
| • |
通过防火墙进行调试。Microsoft 不建议或支持通过防火墙的远程 ASP.NET 调试。解决此问题最好的方式是,使用“终端服务”登录远程服务器并在本地进行调试。 |
| • |
RPC 的一种常见故障是无力解析远程机器名。RPC 依靠名称解析在计算机之间通信。如果未能将远程服务器机器名解析为正确的 IP 地址,则可能发生错误。 |
| • |
RPC 通信只能单向流动,另一个方向却不行。RPC 通信必须能够从用于调试的机器到达远程服务器,并从远程服务器返回用于调试的机器,这样才能成功进行远程调试。确保以双向方式启用 RPC 通信。 |
要分析 RPC,可以使用 RPCPing 工具。
远程调试工作组中的机器失败
当您的两台 Windows XP Pro 机器都不在域中但在工作组中时,将发生这种情况。在它们之间进行远程调试时,您根本无法访问远程机器。
在工作组环境中,您需要确保两台机器具有相同的用户帐户名和相同的密码。否则,DCOM 进行身份验证时将失败。
另外,在 Windows XP Pro 上,将 Sharing and security model for local accounts 的默认安全设置设置为现在允许共享。下面是更改此设置的步骤:
|
1. |
运行管理员工具中的 Local Security Settings。 |
|
2. |
选择 Security settings\Local policies\Security 选项。 |
|
3. |
将 Network access : Sharing and Security model for local accounts 从 Guest only – local users authenticate as Guest 更改为 Classic – local users authenticate as themselves。 |
|
4. |
重新启动计算机。 |
应该将此更改应用于进行远程调试的两台机器。
更改设置后,即可使用同一名称的用户帐户在两台机器上进行远程调试。请确保每台机器上的用户帐户都具有密码。在某些情况下,没有实际密码机器不能运行。
然而,因为更改了安全模型的默认设置,所以可能公开下面的内容:
| • |
意外的文件共享 |
| • |
意外的 DCOM 组件共享。 |
在进行这一更改之前,从远程机器到您的机器的任何种类的连接都是以 Guest 身份进行的;但更改后,他/她即可接受使用本地用户帐户的身份验证。因此,在调试案例中,如果将一个文件夹或 DCOM 对象共享出来,其他机器上的任何匹配用户(具有相同用户名和相同密码)都可能可以访问您的共享对象。
我极力建议,如果您要使用这一变通方法,则请确保所有用户帐户都具有强密码,否则应该设置一个网络孤岛来调试机器,以防止恶意攻击。
调用IE内置打印组件完成web打印方案及例程(10.28)
重点:
<OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0 VIEWASTEXT>
</OBJECT>
<script >
function window.onbeforeprint(){
alert("打印前事件");
}
function window.onafterprint(){
alert("打印后事件");
closes.Click();
}
function window.onload() {
WebBrowser.printing.header = "http://www.caoruomou.8u8.com"//页脚
WebBrowser.printing.footer = "青春驿站之练笔园地"//页眉
WebBrowser.printing.leftMargin = 0.75//左边距
WebBrowser.printing.topMargin = 1.5//顶边距
WebBrowser.printing.rightMargin = 0.75//右边距
WebBrowser.printing.bottomMargin = 1.5//底边距
WebBrowser.printing.portrait = false;//=true和=false是表示不同的方向
WebBrowser.printing.copies = 1;//打印份数
WebBrowser.printing.Print(false);//是否选择打印机
}
</script>
<input type=button value=打印 onclick="document.all.WebBrowser.ExecWB(6,1)" class="NOPRINT">
<input type=button value=直接打印 onclick="document.all.WebBrowser.ExecWB(6,6)" class="NOPRINT">
<input type=button value=页面设置 onclick="document.all.WebBrowser.ExecWB(8,1)" class="NOPRINT">
<input type=button value=打印预览 onclick="document.all.WebBrowser.ExecWB(7,1)" class="NOPRINT">
注意:
1、CSS对打印的控制:
<!–media=print 这个属性可以在打印时有效–>
<style media=print>
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>
Noprint样式可以使页面上的打印按钮等不出现在打印页面上,这一点非常重要,因为它可以用最少的代码完成最需要的功能
PageNext样式可以设置分页,在需要分页的地方<div class="PageNext"></div>就OK了,呵呵
2、表格线粗细的设置,更是通过样式表:
<style>
.tdp
{
border-bottom: 1 solid #000000;
border-left: 1 solid #000000;
border-right: 0 solid #ffffff;
border-top: 0 solid #ffffff;
}
.tabp
{
border-color: #000000;
border-collapse:collapse;
}
</style>
或者:
<style>
.TdCs1 {
border:solid windowtext 1.0pt;
}
.TdCs2 {
border:solid windowtext 1.0pt; border-left:none;
}
.TdCs3 {
border-top:none;
border-left:solid windowtext 1.0pt;
border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;
}
.TdCs4 {
border-top:none;
border-left:none;
border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;
}
.underline {
border-top-style: none;
border-right-style: none;
border-bottom-style: solid;
border-left-style: none;
border-bottom-color: #000000;
}
</style>