Posts Tagged ‘al’

探讨vertical-align应用

星期三, 06月 4th, 2008

与valignde对比
vertical-align在小雨手册上de解释是:设置或检索对象内容de垂直对其方式.我觉得不太理解de是vertical-align所在de分类是“属性/文本”
O3noBLOG特别强调de是vertical-align和valignde不同,de确vertical-align应用最多de应该是在td内,控制内部对象位置,和tddevalign属性极其相似.
valign共有四个参数:top, baseline, bottom, middle,相对而言vertical-align也有相同de属性值,以下是对td控制对比:

使用vertical-align:top;来避免td默认devalign=”middle”是很好de选择,当然也可以使用vertical-align:middle;来对td控制,但对div肯定也是无效de.
效果演示:http://www.rexsong.com/blog/attachments/20…1246_valign.htm
与alignde对比
按照w3de提示,使用vertical-align使用在inline对象上,比如对imgde控制,于是又和imgdealign属性类似.
使用align=”absmiddle”控制img绝对居中de时候,也可以尝试使用vertical-align:middle;,做个对比看de更清楚:


所以真正de绝对居中还是align=”absmiddle”,这是使用CSS不可替代de.
效果演示:http://www.rexsong.com/blog/attachments/20…41444_align.htm
inline应用
用来决定inline对象de垂直位置,看两个例子:
小图:http://www.rexsong.com/blog/attachments/20…ignmenttest.htm
大图:http://www.rexsong.com/blog/attachments/20…rticalalign.htm

alt属性和title属性

星期三, 06月 4th, 2008

作者:JunChen 2005-5-23 12:00:35
原文:http://www.456bereastreet.com/archive/200412/the_alt_and_title_attributes/
翻译:JunChen

首发:http://blog.handsbrain.com/junchen/archive/2005/05/21/3355.aspx
版权:本文版权归译者Junchen所有,转载请先联系译者.
当浏览器卖主扭曲了标准并且自顾自de不按规则去做一些事,他们可能会造成一些问题,或者至少产生了混淆.例子之一就是一些浏览器处理alt属性(一般会被错误de称作alt标签)de方式,比如拥有大量用户deWindowsdeIE浏览器.

替换文字(alt text)并不是用来做提示(tool tip),或者更加确切de说,它并不是为图片提供额外说明信息de.相反地,title属性才应该用来为元素提供额外说明信息.这些信息在大部分图像浏览器里显示为提示(tool tip),虽然制造商可以任意采取其他方式渲染title属性de文字.

很多人看来对这两个属性感到迷惑(最近这个问题在Web Standards Group邮件列表里变多了), 所以我写下我de想法,如何去用它们.

alt属性

为不能显示图像、窗体或appletsde用户代理(UA),alt属性用来指定替换文字.替换文字de语言由lang属性指定.
来源:How to specify alternate text.

Alt属性(注意是“属性”而不是“标签”)包括替换说明,对于图像和图像热点是必须de.它只能用在img、area和input元素中(包括applet元素).对于input元素,alt属性意在用来替换提交按钮de图片.比如:<input type=”image” src=”image.gif” alt=”Submit” />.

使用alt属性是为了给那些不能看到您文档中图像de浏览者提供文字说明.这包括那些使用本来就不支持图像显示或者图像显示被关闭de浏览器de用户,视觉障碍de用户和使用屏幕阅读器de用户.替换文字是用来替代图像而不是提供额外说明文字de.

在写替换文字前仔细想想,保证那些文字确实为那些看不到图像de人提供了说明信息,并且在上下文中有意义.对于那些装饰性de图片可以使用空de值(alt=”",引号中间没有空格),而不是使用不相关de替换文字比如“blue bullet”或者“spacer.gif”.不要忽略它,如果您忽略了,那么一些屏幕阅读器会直接阅读图像文件de文件名,那些文字浏览器,比如Lynx会显示图像文件de文件名,而那对于您de浏览者就没什么用了.

包含文字de图像图片设置替换文字是最简单de,图像中包含de文字一般来说就可以作为alt属性值.

至于替换文字de长度,看看WCAG 2.0(网站内容可用性指南2.0)是怎么说de:

Alt属性值得长度必须少于100个英文字符或者用户必须保证替换文字尽可能de短.
我把它理解为“尽可能短,尽需要长”.

即使您想让它显示为提示(tool tip),也不要给文字元素使用alt属性,这并不是它de用法.至今据我所知,那样做仅能在WindowsdeIE浏览器和古老deNetscape 4.*(windows版本)有效.没有一个Macde浏览器会将它显示为提示(tool tip).

当浏览器把替换文字显示为提示(tool tip)后,那些错误使用alt属性de行为也受到了鼓励.一些人开始写无意思de替换文字,因为他们趋向于认为它是一个额外de说明信息,而不是不能显示图像de替换.其他人可能不想让提示(tool tip)出现,然后就完全忽略了写alt属性值.这些错误de做法,都给那些不能看到图像de浏览者造成了困难.

额外de说明信息和非本质de信息请使用title属性.

title属性

title属性为设置该属性de元素提供建议性de信息.
来源: The title attribute.

title属性可以用在除了base,basefont,head,html,meta,param,script和title之外de所有标签.但是并不是必须de.可能这正是为什么很多人不明白何时使用它.

使用title属性提供非本质de额外信息.大部分de可视化浏览器在鼠标悬浮在特定元素上时显示title文字为提示信息(tool tip),然而这又由制造商来决定如何渲染title文字.一些浏览器会将title文字显示在状态栏里.比如早期版本deSafari浏览器.

title属性有一个很好de用途,即为链接添加描述性文字,特别是当连接本身并不是十分清楚de表达了链接de目de.这样就使得访问者知道那些链接将会带他们到什么地方,他们就不会加载一个可能完全不感兴趣de页面.另外一个潜在de应用就是为图像提供额外de说明信息,比如日期或者其他非本质de信息.

title属性值可以比alt属性值设置de更长.不过要注意de是,有些浏览器会截断过长de文字(比如工具提示或其他).比如Mozilla核心de浏览器只能显示最先de60个字符.这被认为是一个Mozilla bug,这是您要注意de.

使用前先考虑

我de建议是保证替换文字(alt text)精要.在大多数de应用里,都应该被留白,alt=”"(注意两引号中没有空格). 想想那些图像,为那些浏览者提供了什么样de信息,您应该用什么文字去描述它,或者您该为看不到图像de人提供什么信息? 将替换文字写成“照片:站在大楼外deCEO,穿着灰色西装和黑色领带,望着天”对于看不到图像de人真de有帮助?如果您觉得是,那么您就写吧.在很多情况下,我觉得让替换文字留白比较好.

对于title属性,比较难于给出严格de使用说明.我大部分用在那些不能自我释意de链接上,比如同一页面上de相同de链接文字,不同de链接页面.有时候也为一些按钮或者表单元素提供更多de说明文字.

更长de描述

当一个图片需要更加长de描述,而超过alt属性de限制,那么还有一些选择.

longdesc属性可以用来提供链接到一个包含图片文字描述de单独页面.这就意味着把浏览者链接到另外de页面,这可能会造成理解上de困难.另外浏览器对于longdesc属性de支持也是不一致de,并且不是非常好.

longdesc属性可以包含一个链接到当前文档de其他部分(锚点)来取代链接到另外de页面.在Accessibility footnotes, Andy Clarke很好de解释说明了如何应用.

描述链接(D links)可以用来补充longdesc.一个描述链接就是一个常规de链接,连接到含有替换文字de页面.该链接被置于图像de旁边,并且在所有浏览器中都是可是de.对于它de有效性人们有很多不同意见,我de个人意见不大喜欢这个注意.WCAG也是,在他们de工作草案HTML Techniques for WCAG 2.0中,描述链接是被“不赞成”de.

如果对图片de长de描述对于任何浏览者都有用,那么您得考虑让它简单de显示在同一个文档里面,而不是链接到其他页面里或者藏起来.这样每个人都可以阅读到.这是一种简单低技术含量de方法.

更多信息

想了解更多关于alt,title和longdesc属性?看这里:

Guidelines on alt texts in img elements
Writing good ALT text
Accessible alternatives
Accessibility footnotes
The image problem
Title Attribute – Your Take
Using link Titles to Help Users Predict Where They Are Going
How to specify alternate text
The title attribute

ASP.NET中使用IFRAME建立类Modal窗口

星期二, 06月 3rd, 2008

我经常要在程序de人机交互中用到模态窗口,但在B/S开发中,这一切变得不容易了,虽然也可以用window.showModalDialog函数实现(见http://dotnet.aspx.cc/ShowDetail.aspx?id=49ML4AO8-5PB3-4KNY-NJZD-LJOIOXV4M1X4),但多数用起来麻烦,还要为了回传值用Frameset建立2个无用de窗口.不爽!

我发现可以尝试在初始页面中嵌入一个IFRAME,然后用IFRAME来显示一个页面,并将IFRAME设定为按绝对位置摆放,Z-Index设置为最高de9999,这样就可以将这个页面覆盖在初始界面上,当需要显示模态窗口时,就显示这个IFRAME,可以将IFRAMEde尺寸扩大到能覆盖住初始窗口,也可以盖住关键项,目de就是不让后面de窗口有什么变化de可能.在IFRAME显示de窗口需要关闭时只要对它deparentdeIFRAME隐藏就可以了.实际试验时发现IFRAMEdediaplay不能在子窗口被改变,所以,我还需要将IFRAME放到一个DIV中,控制DIVde显示就可以控制窗口de出现或隐藏.但为什么不直接用DIV来显示窗口呢,原因有两个:1.DIV不能遮挡它后面deDropdownlist控件,而IFRAME能.2.不容易将窗口内de内容放置到一个单独de网页中,复用性差.

以下是相关代码,显示隐藏使用了客户端和服务端相关代码两种写法:

WebForm1.aspx

<%@ Page language=”c#” Codebehind=”WebForm1.aspx.cs” AutoEventWireup=”false” Inherits=”WSGUI1.WebForm1″ %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name=”GENERATOR” Content=”Microsoft Visual Studio .NET 7.1″>
<meta name=”CODE_LANGUAGE” Content=”C#”>
<meta name=”vs_defaultClientScript” content=”JavaScript”>
<meta name=”vs_targetSchema” content=”http://schemas.microsoft.com/intellisense/ie5“>
<script language=”javascript”>
function ShowLayer()
{
document.all.MyFormLayer.style.display=”;
return false;
}
function SetURL(url)
{
document.all.IFRAME1.src=url;
}
</script>
</HEAD>
<body MS_POSITIONING=”GridLayout”>
<form id=”Form1″ method=”post” runat=”server”>
<FONT face=”宋体”>
<asp:DropDownList id=”DropDownList1″ style=”Z-INDEX: 101; LEFT: 40px; POSITION: absolute; TOP: 208px”
runat=”server” Width=”184px”>
<asp:ListItem Value=”TEST1″>q</asp:ListItem>
<asp:ListItem Value=”TEST2″>w</asp:ListItem>
<asp:ListItem Value=”TEST3″>e</asp:ListItem>
<asp:ListItem Value=”TEST4″>r</asp:ListItem>
</asp:DropDownList></FONT> <input type=”button” name=”MyButton” value=”TEST” id=”MyButton” onclick=”ShowLayer();SetURL(’WebForm2.aspx’)” style=”Z-INDEX: 102; LEFT: 360px; POSITION: absolute; TOP: 336px”>
<div id=”MyFormLayer” style=”DISPLAY: none;Z-INDEX: 103;LEFT: 16px;WIDTH: 408px;POSITION: absolute;TOP: 24px;HEIGHT: 304px”>
<iframe scrolling=”no” frameborder=”0″ width=”100%” height=”100%” id=”IFRAME1″ runat=”server”>
</iframe>
</div>
<asp:Button id=”Button2″ style=”Z-INDEX: 104; LEFT: 256px; POSITION: absolute; TOP: 336px” runat=”server”
Text=”ASPXTest”></asp:Button>
</form>
</body>
</HTML>

WebForm1.aspx.cs

….

public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DropDownList DropDownList1;
protected System.Web.UI.HtmlControls.HtmlGenericControl IFRAME1;
protected System.Web.UI.WebControls.Button Button2;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户相关代码以初始化页面
if(!IsPostBack)
{
}
}
public static void CreateScript(System.Web.UI.Page mypage,string strScript,string ID)
{
string strscript=”<script language=’javascript’>”;
strscript = strScript;
strscript = “</script>”;
if(!mypage.IsStartupScriptRegistered(ID))
mypage.RegisterStartupScript(ID, strscript);
}
private void Button2_Click(object sender, System.EventArgs e)
{
IFRAME1.Attributes.Add(”src”,”WebForm2.aspx?NAME=’中国’”);
CreateScript(Page,”ShowLayer();”,”SHOW”);
}
}


WebForm2.aspx

<%@ Page language=”c#” Codebehind=”WebForm2.aspx.cs” AutoEventWireup=”false” Inherits=”WSGUI1.WebForm2″ %>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” >
<HTML>
<HEAD>
<title>WebForm2</title>
<meta name=”GENERATOR” Content=”Microsoft Visual Studio .NET 7.1″>
<meta name=”CODE_LANGUAGE” Content=”C#”>
<meta name=”vs_defaultClientScript” content=”JavaScript”>
<meta name=”vs_targetSchema” content=”http://schemas.microsoft.com/intellisense/ie5“>
<script language=”javascript”>
function hide()
{
parent.MyFormLayer.style.display = “none”;
}
</script>
</HEAD>
<body MS_POSITIONING=”GridLayout”>
<form id=”Form2″ method=”post” runat=”server”>
<table border=”0″ width=”100%” cellspacing=”0″ cellpadding=”0″ bgcolor=”#6887bb” height=”100%”
id=”table1″ style=”BORDER-TOP-STYLE: outset; BORDER-RIGHT-STYLE: outset; BORDER-LEFT-STYLE: outset; BORDER-BOTTOM-STYLE: outset”>
<tr>
<td>
</td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
</td>
<td>
<p align=”center”><font color=”#ffffff”>模仿模态窗口效果</font></p>
<p align=”center”><input type=”button” onclick=”hide()” style=”WIDTH: 80px” value=”点击关闭”>
<asp:Button id=”Button1″ runat=”server” Text=”ASPXTest”></asp:Button></p>
</td>
<td>
</td>
</tr>
<tr>
<td>
</td>
<td>
</td>
<td>
</td>
</tr>
</table>
</form>
</body>
</HTML>

WebFom2.aspx.cs

namespace WSGUI1
{
/// <summary>
/// WebForm2 de摘要说明.
/// </summary>
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户相关代码以初始化页面
if(!IsPostBack)
{
Button1.Attributes.Add(”onclick”,”hide()”);
}
}

}

ASP.NET中用healthMonitor属性用法

星期二, 06月 3rd, 2008

  在ASP.NET 2.0中,可以使用healthMonitoring属性监测事件.healthMonitoring属性是一个基于方法deprovider,在这里可以构造自己deprovider.利用healthMonitoring属性,我可以诸如记录错语、成功de事件等,对不同de数据源,如事件日志,Sql Server甚至对于自己通过继承WebEventProvider类创建自己deproviders.在此文章中,我打算介绍配置一个监测SqlServer错语de并且对某人de电子信箱地址发送邮件deweb应用程序.首先,看一下在web.config中dehealthMonitoring程序片段,在此可以建立将要用到de事件.

<healthMonitoring Enabled=”true|false” heartBeatInterval=”time interval”>
 <bufferModes>… </bufferModes>
 <providers>… </providers>
 <eventMappings>… </eventMappings>
 <profiles>… </profiles>
 <rules>… </rules>
</healthMonitoring>

  如果看一下<healthMonitoring>元素,就可以判断是否可以将设置属性为有效或无效,也可以指定对WebHeaderBeatEvent被唤醒de时间间隔.healthMonitoring有5个孩子.

  bufferModes,在此可以定义一个Providerde缓冲区大小.

  Providers,在此说明处理事件deProviders.

  eventMappings, 在此可以画出与友好事件类型相关de事件名称.

  profiles, 在此定义一个可以用来配置事件de参数集集合.

  rules, 在此画出Providersde事件图.

  可以阅读更多含在VS 2550文档中de关于这些元素de东西.

  在继续之前,这里有一份含ASP.NET中de一些Providers清单:

System.Web.Management.MailWebEventProvider
System.Web.Management.SimpleMailWebEventProvider
System.Web.Management.TemplatedMailWebEventProvider
System.Web.Management.TraceWebEventProvider
System.Web.Management.EventLogWebEventProvider
System.Web.Management.SqlWebEventProvider
System.Web.Management.WmiWebEventProvider

  不需要解释这些,名字告诉我它们是干什么de.还要提一下SqlWebEventProvider依靠Sql server而工作,它将事件存储在aspnet_Web_Event表.为了安装此数据库,必须运行位于framework文件夹中deaspnet_regsql.exe向导.

  现在,配置对Sql server provider有登录错语并且发送一个电子邮件而产生错误de程序.

  下面是一个使用SqlWebEventProvider和SimpleMailWebEventProvider来存错语事件de例子.

<healthMonitoring enabled=”true” heartBeatInterval=”0″>
<bufferModes>
<add name=”Critical Notification” maxBufferSize=”100″ maxFlushSize=”20″urgentFlushThreshold=”1″ regularFlushInterval=”Infinite” urgentFlushInterval=”00:01:00″ maxBufferThreads=”1″/>

<add name=”Analysis” maxBufferSize=”1000″ maxFlushSize=”100″ urgentFlushThreshold=”100″
regularFlushInterval=”00:05:00″ urgentFlushInterval=”00:01:00″ maxBufferThreads=”1″/>

</bufferModes>
<providers>

<add name=”CriticalMailEventProvider” type=”System.Web.Management.SimpleMailWebEventProvider, System.Web …” from=info@nsquared2.net to=fnormen@hotmail.com priority=”High” bodyHeader=”Warning!”
bodyFooter=”Please investigate ASAP.” subjectPrefix=”Action required.” buffer=”true” bufferMode=”Critical Notification” maxEventLength=”4096″ maxSize=”4096″ maxMessagesPerNotification=”1″/>

<add name=”SqlWebEventProvider” type=”System.Web.Management.SqlWebEventProvider, System.Web …”
connectionStringName=”LocalSqlServer” maxEventDetailsLength=”1073741823″ buffer=”true”
bufferMode=”Analysis”/>

</providers>

<eventMappings>

<add name=”All Errors” type=”System.Web.Management.WebBaseErrorEvent, System.Web …”/>
<add name=”Request Processing Errors” type=”System.Web.Management.WebRequestErrorEvent, System.Web …/>

</eventMappings>

<profiles>

<add name=”Default” minInstances=”1″ maxLimit=”Infinite” minInterval=”00:10:00″/>

</profiles>

<rules>

<add name=”All Errors Default” eventName=”All Errors” provider=”SqlWebEventProvider” profile=”Default”
minInterval=”00:00:30″/>

<add name=”Request Processing Errors” eventName=”Request Processing Errors” provider=”CriticalMailEventProvider” profile=”Default”/>

</rules>

</healthMonitoring>

  在此例子中,使用Sql provider来记录所有错语事件,并且当Web请求错误事件被唤醒时使用mail provider来发送一个消息.

  这里有一些ASP .NET 2.0一起发布de事件:

System.Web.Management.WebBaseEvent
System.Web.Management.WebHeartBeatEvent
System.Web.Management.WebApplicationLifetimeEvent
System.Web.Management.WebRequestEvent
System.Web.Management.WebBaseErrorEvent
System.Web.Management.WebErrorEvent
System.Web.Management.WebRequestErrorEvent
System.Web.Management.WebAuditEvent
System.Web.Management.WebFailureAuditEvent
System.Web.Management.WebSuccessAuditEvent
System.Web.Management.WebManagementEvent
System.Web.Management.WebViewStateFailureAuditEvent
System.Web.Management.WebAuthenticationFailureAuditEvent
System.Web.Management.WebAuthenticationSuccessAuditEvent

  可以使用这些事件来对一个provider画图.也可以创建通过WebBaseEvent类继承来de自己de事件.

  为自动唤醒一个事件,可以使用WebBaseEvent类de唤醒方法:

try
{
 //….
}

catch(Exception e)
{
 if (HealthMonitoringManager.Enabled)
 {
  WebBaseEvent.Raise(new WebErrorEvent(”My Error message”, null, 5000, e));
 }
}

or:

if (HealthMonitoringManager.Enabled)
{
 WebErrorEvent event = new WebErrorEvent(”My error message”, null, 5000, e);
 event.Raise();
}

ASP.NET技巧:做个DataList可分页的数据源

星期二, 06月 3rd, 2008

  这个数据源,分两部分,一是从数据类中调出数据,然后在本数据源中对分页参数以及页面分页辅助控件进行操作!在前面有三个控件控制翻页,一个下拉列表,两个LinkButton!

  下面 fill() 方法调用很简单,在页面中要重新绑定de地方 写上 fill() 就可以了,呵呵!但是一定要写哦,例如翻页动作执行后!

  下面是db类中deds方法

public static DataTable ds(string que)
{//返回一个装载了SQL制定留言de数据表,
OleDbConnection con = odb.con();
OleDbDataAdapter oda = new OleDbDataAdapter();
oda.SelectCommand=new OleDbCommand(que,con);
DataSet ds = new DataSet();
oda.Fill(ds,”thc”);
return ds.Tables["thc"];
con.Close();
}下面方法使用de数据源就是上面de这个
private void fill()
{//做de一个方法,因为页内将有多次de绑定
//这里设置一个隐藏deLabel,用与储存当前de页索引
int cup = Convert.ToInt32(pagelbl.Text);

PagedDataSource ps = new PagedDataSource();//NEW一个分页数据源
ps.DataSource = odb.ds(”select * from guest order by id desc”).DefaultView;//送一个SQL语句进去,确定该数据源de数据源,有点绕吧,呵呵
ps.AllowPaging = true;//允许分页
ps.PageSize = 2;//设置页de数量
ps.CurrentPageIndex = cup-1;
if (!IsPostBack)
{//判断页面是否第一次载入
for (int i = 1; i <= ps.PageCount; i )
{//循环出页码
pageddl.Items.Add(i.ToString());
}
}
//下面主要是控制上下翻页按纽是否起用
pageup.Enabled = true;
pagedown.Enabled = true;
if (ps.IsFirstPage)
{//如果是最前页,上页按纽不可用
pageup.Enabled = false;
}
if (ps.IsLastPage)
{//如果是最后页,下页按纽不可用
pagedown.Enabled = false;
}
//设置页码下拉菜单当前选中de值
pageddl.SelectedItem.Text = cup.ToString();
//终于可以绑定给DataList了
DataList1.DataSource = ps;
DataList1.DataKeyField = “id”;
DataList1.DataBind();
}

  再下面是翻页事件de处理

protected void pageddl_SelectedIndexChanged(object sender, EventArgs e)
{//页码下拉菜单事件
pagelbl.Text = pageddl.SelectedItem.Text.ToString();
fill();
}
protected void pagedown_Click(object sender, EventArgs e)
{//下页事件
pagelbl.Text = Convert.ToString(Convert.ToInt32(pagelbl.Text) 1);
fill();
}
protected void pageup_Click(object sender, EventArgs e)
{//上页事件
pagelbl.Text = Convert.ToString(Convert.ToInt32(pagelbl.Text)-1);
fill();
}

Visual Studio.Net 内幕(7)

星期二, 06月 3rd, 2008

编辑环境
  Visual Studio 为所有VS.NET支持de语言提供了单一de一个相关代码编辑器,而同时为每一种语言提供了特定de功能 .其编辑器引入了编辑环境方面de一些增强功能,诸如单词补齐,增量搜索,相关代码凸显,缩进文本,标记行号,彩色打印,和快捷方式.编辑器还提供了许多为特定语言设计de功能,比方在您输入原型和函数调用de时候它能够自动完成这些字符串de输入.
  除了编程语言,这个编辑器还提供对HTML文档,网络页甚至XML编写过程de支持.实际上,我很乐意把我de一个XML文档加载到VS.NET里然后看见我在XML中使用de关键词比方XML申明和属性被高亮显示.更进一步de说,这个编辑器还提供了源相关代码和数据de视图.在数据视图中,文档de结构被显示在左边de窗口里.当您在这个级联de结构中选择一个XML元素de时候,这个窗口右边de部分就会显示其子元素并能够让您一直深入查看元素数据.这个功能真是非常cool!但是我也发现了一个不正常de现象,就是并非所有deXML文档都能够被加载到数据视图中.拥有不可预知de结构de文档在加载到数据视图de时候好象会把编辑器弄糊涂.
  Visual Studio .NET 带来de另一个惊喜是您能够根据一个文档实例创建XML方案.打开文档实例,在缺省情况下会出现一个文档源程序视图.您可以留在源程序视图中浏览也可以转换到数据视图,然后在视图上右键并在弹出式菜单中选择“创建方案”.一旦XML方案已经被创建出来了,那么对它de一个引用就会被插入到原来de文档实例中.对于那些不想花工夫从头编写XML方案de人来说,Visual Studio .NET能够让您快速完成工作.

Visual Studio.Net 内幕(6)

星期二, 06月 3rd, 2008

Visual Basicde变化
特点
描述
布耳和位运算符
And, Or, Xor, 和 Not是严格de Boolean 运算符而且不能再用于位运算
.而应该使用 BitAnd, BitOr, BitXor, 和 BitNot.Eqv和Imp不再支持.
数据类型
Deftype语句 (DefBool, DefByte, 等等) 不再支持. Currency 类型被Decimal 类型取代. Dates 现在被作为 8-byte de整数进行存储与 CLR DateTime 类型相匹配.
Dim, ReDim
您不能在初始de数组声明中使用 ReDim了.您必须首先用Dim声明这个数组.然后您可以使用 ReDim 来改变这个数组de大小.
整数
Short 指de是 16-bit 有符号整数. Integer (类型字符串为 %) 指de是 32-bit有符号整数. Long (类型字符串为&)指de是64-bit有符号整数.
字符串
字符串类型现在与 .NET Framework String 类相对应, 在初始化后不能被修改.如果这个字符串必须被修改,您可以使用 StringBuilder 类.
变量作用域
在程序块中声明de变量de作用域为程序块而不是整个过程了.在过程而不是在程序块中声明de变量 (程序块即由 End, Loop, 或者 Next结束de语句组) de作用域是整个过程.
Variants变量
Variant已经为 Object所取代.但是 Variant仍然是这种语言中de关键词.
Visual Basic .NET中不再支持deVisual Basic 6.0de元素.

As Any, Atn, Calendar, Circle, Currency, Date, Date$, Debug.Assert, Debug.Print, Deftype, DoEvents, Empty, Eqv, GoSub, Imp, Initialize, Instancing, IsEmpty, IsMissing, IsNull, IsObject, Let, Line, LSet, MsgBox, Now, Null, On…GoSub, On…GoTo, Option Base, Option Private Module, Property Get, Property Let, Property Set, PSet, Rnd, Round, RSet, Scale, Set, Sgn, Sqr, String, Terminate, Time, Time$, Timer, Variant, VarType, Wend.

JDBCTM 指南:入门7-CallableStatement

星期一, 06月 2nd, 2008

7 - CallableStatement
本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》这本书中摘引来de.JavaSoft 目前正在准备这本书.这本书是一本教程,同时也是 JDBC de重要参考手册,它将作为 Java 系列de组成部份在 1997 年春季由 Addison-Wesley 出版公司出版.

7.1 概述
CallableStatement 对象为所有de DBMS 提供了一种以标准形式调用已储存过程de方法.已储存过程储存在数据库中.对已储存过程de调用是 CallableStatement 对象所含de内容.这种调用是用一种换码语法来写de,有两种形式:一种形式带结果参数,另一种形式不带结果参数(有关换码语法de信息,参见第 4 节“语句”).结果参数是一种输出 (OUT) 参数,是已储存过程de返回值.两种形式都可带有数量可变de输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)de参数.问号将用作参数de占位符.
在 JDBC 中调用已储存过程de语法如下所示.注意,方括号表示其间de内容是可选项;方括号本身并不是语法de组成部份.
{call 过程名[(?, ?, ...)]}
返回结果参数de过程de语法为:
{? = call 过程名[(?, ?, ...)]}
不带参数de已储存过程de语法类似:
{call 过程名}
通常,创建 CallableStatement 对象de人应当知道所用de DBMS 是支持已储存过程de,并且知道这些过程都是些什么.然而,如果需要检查,多种 DatabaseMetaData 方法都可以提供这样de信息.例如,如果 DBMS 支持已储存过程de调用,则 supportsStoredProcedures 方法将返回 true,而 getProcedures 方法将返回对已储存过程de描述.
CallableStatement 继承 Statement de方法(它们用于处理一般de SQL 语句),还继承了 PreparedStatement de方法(它们用于处理 IN 参数).CallableStatement 中定义de所有方法都用于处理 OUT 参数或 INOUT 参数de输出部分:注册 OUT 参数de JDBC 类型(一般 SQL 类型)、从这些参数中检索结果,或者检查所返回de值是否为 JDBC NULL.

7.1.1 创建 CallableStatement 对象
CallableStatement 对象是用 Connection 方法 prepareCall 创建de.下例创建 CallableStatement de实例,其中含有对已储存过程 getTestData 调用.该过程有两个变量,但不含结果参数:
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
其中 ? 占位符为 IN、 OUT 还是 INOUT 参数,取决于已储存过程 getTestData.

7.1.2 IN 和 OUT 参数
将 IN 参数传给 CallableStatement 对象是通过 setXXX 方法完成de.该方法继承自 PreparedStatement.所传入参数de类型决定了所用de setXXX 方法(例如,用 setFloat 来传入 float 值等).
如果已储存过程返回 OUT 参数,则在执行 CallableStatement 对象以前必须先注册每个 OUT 参数de JDBC 类型(这是必需de,因为某些 DBMS 要求 JDBC 类型).注册 JDBC 类型是用 registerOutParameter 方法来完成de.语句执行完后,CallableStatement de getXXX 方法将取回参数值.正确de getXXX 方法是为各参数所注册de JDBC 类型所对应de Java 类型(从 JDBC 类型到 Java 类型de标准映射见 8.6.1 节中de表).换言之, registerOutParameter 使用de是 JDBC 类型(因此它与数据库返回de JDBC 类型匹配),而 getXXX 将之转换为 Java 类型.
作为示例,下述相关代码先注册 OUT 参数,执行由 cstmt 所调用de已储存过程,然后检索在 OUT 参数中返回de值.方法 getByte 从第一个 OUT 参数中取出一个 Java 字节,而 getBigDecimal 从第二个 OUT 参数中取出一个 BigDecimal 对象(小数点后面带三位数):
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);
CallableStatement 与 ResultSet 不同,它不提供用增量方式检索大 OUT 值de特殊机制.

7.1.3 INOUT 参数
既支持输入又接受输出de参数(INOUT 参数)除了调用 registerOutParameter 方法外,还要求调用适当de setXXX 方法(该方法是从 PreparedStatement 继承来de).setXXX 方法将参数值设置为输入参数,而 registerOutParameter 方法将它de JDBC 类型注册为输出参数.setXXX 方法提供一个 Java 值,而驱动程序先把这个值转换为 JDBC 值,然后将它送到数据库中.
这种 IN 值de JDBC 类型和提供给 registerOutParameter 方法de JDBC 类型应该相同.然后,要检索输出值,就要用对应de getXXX 方法.例如,Java 类型为 byte de参数应该使用方法 setByte 来赋输入值.应该给 registerOutParameter 提供类型为 TINYINT de JDBC 类型,同时应使用 getByte 来检索输出值 (第 8 节“JDBC 和 Java 类型之间de映射”将给出详细信息和类型映射表).
下例假设有一个已储存过程 reviseTotal,其唯一参数是 INOUT 参数.方法 setByte 把此参数设为 25,驱动程序将把它作为 JDBC TINYINT 类型送到数据库中.接着,registerOutParameter 将该参数注册为 JDBC TINYINT.执行完该已储存过程后,将返回一个新de JDBC TINYINT 值.方法 getByte 将把这个新值作为 Java byte 类型检索.
CallableStatement cstmt = con.prepareCall(
"{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1);
7.1.4 先检索结果,再检索 OUT 参数
由于某些 DBMS de限制,为了实现最大de可移植性,建议先检索由执行 CallableStatement 对象所产生de结果,然后再用 CallableStatement.getXXX 方法来检索 OUT 参数.
如果 CallableStatement 对象返回多个 ResultSet 对象(通过调用 execute 方法),在检索 OUT 参数前应先检索所有de结果.这种情况下,为确保对所有de结果都进行了访问,必须对 Statement 方法 getResultSet、getUpdateCount 和 getMoreResults 进行调用,直到不再有结果为止.
检索完所有de结果后,就可用 CallableStatement.getXXX 方法来检索 OUT 参数中de值.

7.1.5 检索作为 OUT 参数de NULL 值
返回到 OUT 参数中de值可能会是 JDBC NULL.当出现这种情形时,将对 JDBC NULL 值进行转换以使 getXXX 方法所返回de值为 null、0 或 false,这取决于 getXXX 方法类型.对于 ResultSet 对象,要知道 0 或 false 是否源于 JDBC NULL de唯一方法,是用方法 wasNull 进行检测.如果 getXXX 方法读取de最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase.第 5 节“ResultSet”将给出详细信息.