雜合

转载 2007年10月10日 10:31:00

 无刷新显示即时更新数据两例
无刷新显示即时更新数据两例
因最近做网站需要用到无刷新数据,所以在网上查了一些资料,无刷新数据的实现无外乎用javascript或xmlhttp或iframe来实现。在网上找到一代码不是不能用就是效率太低,有的甚至使我的CPU达到100%,我根据网上的代码及查阅了一些资料,提供以下两例无刷新数据的例子,保证完全无错!
例一:
example1.htm
-------------------------------------
<html>
<head>
<title>无刷新</title>
<script language="JavaScript" type="text/javascript">
function GetData(url)
{
url="example1.asp";//调用页面
try
{
DataLoad.src = url;
}
catch(e)
{
return false;
}
{
var timeoutid = setTimeout("GetData()",1000)
}
}
</script>
<script id="DataLoad" language="JavaScript" type="text/javascript" defer></script>
<body onLoad="javascript:GetData();">
<span id=loadcontent>数据载入中……</span>
</body>
-------------------------------------
数据调用程序:example1.asp
--------------------------------------
loadcontent.innerHTML="<%=now()%>"
例二:
example2.htm
-------------------------------------
<HTML>
<head>
<title>无刷新</title>
<script language="javascript">
function GetData()
{
url="example2.asp";//调用页面
var http = new ActiveXObject("Microsoft.XMLHTTP");
http.open("GET",url,false);
http.send();
var str = http.responseText;
loadcontent.innerHTML=str;
setTimeout("GetData()",1000);
}
</script>
</head>
<BODY onload="javascript:GetData();">
<span id="loadcontent">数据载入中……</span>
</BODY>
</HTML>
-------------------------
数据调用程序:example2.asp
---------------------------
<%=now%>
---------------------------

  以上<%=now%>只是作为简单例子,可千万别误作这只是一个显示时间的程序哦,像在即时比分或者其它需要即时更新的数据中都可以用此二例,只是把<%=now%>换成其它的程序,当然你也可以用php程序或jsp程序等来实现数据的调用。

12:19 | 发送消息 | 固定链接 | 引用通告 (0) | 写入博客 | webservice
网页刷新技术
一、在HTML文件头里增加一个键,使该页面在设定的时间后跳转到指定的页面(包括自身);
例如:
<meta http-equiv="refresh" content="30">
二、使用框架(frame或iframe)然后在JS脚本里定时刷新框架内容。
上面两种方式都会重新加载页面,即刷新,给人的感觉不是很好,页面有明显的闪动。于是无刷新技术出现了。
三、是对第二种方式的一种变通。
即将众多框架中的一个长宽设置为0,使其不可见,然后通过脚本定时刷新该隐藏框架内容,再将该框架内容“写”到可浏览的框架里。早期的聊天室大多使用了这种技术。
真正意义上实现无刷新技术的还是以下两种技术,它们甚至可以实现局部刷新:
四、xmlHttp技术,可以通过xmlHttp访问asp页面、aspx页面、WebService等。
<script language="javascript">
function re()
{
var http = new ActiveXObject("Microsoft.XMLHTTP");
http.open("GET","../Advertisement/3.htm",false);
http.send();
var str = http.responseText;
t.innerHTML=str;
}
</script>
<span id=t></span>
五、WebService,使用WebService.htc组件访问Web服务。
var OBJ;
function init(obj,op,id)
{
OBJ=obj;
OBJ.useService("admin/DataOperation.asmx?WSDL","getBody");
OBJ.getBody.callService(show,op,id);
}
function show(result){
OBJ.innerHTML=result.value;
}
其他的无刷新实现方法还有:
六、Remoting,使用Remoting也可以实现无刷新技术。因为Remoting组件可以提供包括Http在内的多种访问方式,当作为Http访问时相当于一个WebService。
七、使用JavaApplet作为中介和服务器交互。不过用户必须为这交互过程编写Java代码。
八、使用ActiveX控件做中介。但是ActiveX的权限太大,未一定能得到客户信任。
九、还有一种推的技术,好象是要用到Lostinet.Janc组件,可以把服务器端的方法拿到客户端来用。
在这些技术中,我也只是用过WebService.htc组件,实现网页的局部动态刷新
使用方法如下:
在web目录中需要一个文件webservice.htc,可以到这里下载: http://msdn.microsoft.com/workshop/author/webservice/webservice.htc
本例通过WebService,不断的从数据库中取数值,动态刷新编辑框,间隔为6秒。
新建一个WebService,部分代码如下(省略了数据库打开关闭和异常处理代码,以下代码不能运行):
public class Service1 : System.Web.Services.WebService
{
//获得某个监测点的当天电压最大值
[WebMethod]
public double GetMAXValue(int clDmsId)
{
double returndouble = Double.NaN;
//从数据库中取值
return returndouble;
}
//获得某个监测点的当天电压最大值发生时间
[WebMethod]
public string GetMAXTime(int clDmsId)
{
string returnstr = null;
//从数据库中取值
return returnstr;
}
网页调用WebService代码如下:
<%@Page language="c#" Codebehind="rt.aspx.cs" AutoEventWireup="false" Inherits="power.rt" %>
<HTML>
<script>
var intCallId = 0;
function Init()
{
setInterval("GetMaxValue()",6000);
setInterval("GetMaxValueTime()",6000);
}
function GetMaxValue()
{
div_inputMaxValue.useService("rtService.asmx?WSDL","Service1");
intCallId = div_inputMaxValue.Service1.callService("GetMAXValue");
}
function GetMaxValueTime()
{
div_inputMaxValueTime.useService("rtService.asmx?WSDL","Service1");
//接口函数有参数的,调用方法
intCallId = div_inputMaxValueTime.Service1.callService("GetMAXTime",inputId.value);
}
//给input赋值
function SetInputMaxValue()
{
if (event.result.error)
{
inputMaxValue.innerText = event.result.errorDetail.string;
}
else
{
inputMaxValue.innerText = event.result.value;
}
}
function SetInputMaxValueTime()
{
if (event.result.error)
{
inputMaxValueTime.innerText = event.result.errorDetail.string;
}
else
{
inputMaxValueTime.innerText = event.result.value;
}
}
</script>
<HEAD>
<title>rtSingle</title>
</HEAD>
<body onload="Init();">
<form id="Form1" method="post" runat="server"></form>
<div id="div_inputMaxValue" style="BEHAVIOR:url(webservice.htc)" onresult="SetInputMaxValue()"></div>
<div id="div_inputMaxValueTime"
style="BEHAVIOR:url(webservice.htc)"onresult="SetInputMaxValueTime()"></div>
<p>最大值:<INPUT id="inputMaxValue" readOnly type="text"></p>
<p>最大值时间:<INPUT id="inputMaxValueTime" readOnly type="text"></p>
<INPUT id="inputId"  style="display='none'"  value=<%=cldmsid%> type="text">
</body>
</HTML>
其中inputId的作用只是负责把后台的cldmsid的值,当作webservice接口函数的参数传入,其在页面是隐藏的,没有更多的用途。
还有就是所有input不要放在<form></form>之间
1.行为只能用域内的web服务,因为DHTML内置的安全限制造成的
2.通过的这种方式的访问的类型会被限制,行为支持.net的基本类型和它们的数组
如:dataset,datatable得复杂类型就不支持了

 

12:18 | 发送消息 | 固定链接 | 引用通告 (0) | 写入博客 | webservice
利用XMLHTTP无刷新获取数据.
利用XMLHTTP无刷新获取数据.
 
利用XMLHTTP无刷新获取数据.
客户端和服务器端数据的交互有几种方法.
1.提交,通过<form></form>提交到服务器端.也称"有刷新"吧.
2.通过XMLHTTP无刷新提交到服务器端,并返回数据.也称"无刷新"吧.
利用XMLHTTP我们可以实现很多很强大的应用.这文章主要介绍它的一
些简单的应用.
附:因为XMLHTTP是IE5.0+支持的对象.所以你必须要有IE5.0+才能看到效果.
client.htm
<script language="JavaScript">
function GetResult(str)
{
/*
*--------------- GetResult(str) -----------------
* GetResult(str)
* 功能:通过XMLHTTP发送请求,返回结果.
* 参数:str,字符串,发送条件.
* 实例:GetResult(document.all.userid.value);
* author:wanghr100(灰豆宝宝.net)
* update:2004-5-27 19:02
*--------------- GetResult(str) -----------------
*/
var oBao = new ActiveXObject("Microsoft.XMLHTTP");
//特殊字符:+,%,&,=,?等的传输解决办法.字符串先用escape编码的.
//Update:2004-6-1 12:22
oBao.open("POST","server.asp?userid="+escape(str),false);
oBao.send();
//服务器端处理返回的是经过escape编码的字符串.
document.all.username.value=unescape(oBao.responseText)
}
</script>
<input type="button" onclick="GetResult(document.all.userid.value)" value="Get"><br>
userid:<input type="text" name="userid"><br>
username:<input type="text" name="username">

server.asp 服务器端处理.
<% @Language="JavaScript" %>
<%
function OpenDB(sdbname)
{
/*
*--------------- OpenDB(sdbname) -----------------
* OpenDB(sdbname)
* 功能:打开数据库sdbname,返回conn对象.
* 参数:sdbname,字符串,数据库名称.
* 实例:var conn = OpenDB("database.mdb");
* author:wanghr100(灰豆宝宝.net)
* update:2004-5-12 8:18
*--------------- OpenDB(sdbname) -----------------
*/
var connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(sdbname);
var conn = Server.CreateObject("ADODB.Connection");
conn.Open(connstr);
return conn;
}
var sResult = "";
var oConn = OpenDB("data.mdb");
//特殊字符:+,%,&,=,?等的传输解决办法.客户端字符是经过escape编码的
//所以服务器端先要经过unescape解码.
//Update:2004-6-1 12:22
var userid = unescape(Request("userid"));
var sql = "select username from users where userid=''"+userid+"''";
var rs = oConn.Execute(sql);
if(!rs.EOF)
{
sResult = rs("username").Value;
}
else
{
//加入容错.2004-5-30 10:15
sResult = "Sorry,没有找到..."
}
//escape解决了XMLHTTP。中文处理的问题.
Response.Write(escape(sResult));
%>
数据库设计 data.mdb
表users.
字段
id 自动编号
userid 文本
username 文本
表:users 数据:
id userid username
1 wanghr100 灰豆宝宝.net
 


12:16 | 发送消息 | 固定链接 | 引用通告 (0) | 写入博客 | webservice
利用Javascript 调用WebService
[总结]利用Javascript 调用WebService Calling WebServices using Javascript

If you are using Microsoft IE 5 or later, you can use the behavior/HTML-Component "WebService" to access a Web service. The "WebService" behavior communicates with Web services over HTTP using Simple Object Access Protocol (SOAP).
To use the "WebService" behavior, you must attach it to an element using the STYLE attribute, as follows:
<DIV ID="GiveItAName"
STYLE="behavior:url(webservice.htc)"></DIV>
A complete example taken from the Microsoft Web site is as follows:
<html>
<head>
<script language="JavaScript">
var iCallID;
function init()
{
service.useService
("http://myserver.com/services/myservice.asmx?WSDL",
                   "servicename");
}
function onmyresult()
{
   if ((event.result.error)&&(iCallID==event.result.id))
   {
      var xfaultcode = event.result.errorDetail.code;
      var xfaultstring = event.result.errorDetail.string;
      var xfaultsoap = event.result.errorDetail.raw;
      // Add code to output error information here
      alert("Error ");
   }
   else
   {
      service.innerHTML= "The method returned the result: "
                         + event.result.value;
   }
}
</script>
</HEAD>
<body onload="init();">
<BR>
Enter a Value <input type='text' id='param1'>
<BR>
<button onclick='iCallID = service.servicename.callService
("ProcedureName", param1.value);'>Call A Web Method</button>
<div id="service"
     style="behavior:url(webservice.htc)"
     onresult="onmyresult();">
</div>
</body>
</html>
source: http://weblogs.asp.net/Varad/archive/2004/06/14/155671.aspx

其实这篇更好
Remote Scripting in a .NET World
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnclinic/html/scripting11122001.asp
Scripting Web Services
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnclinic/html/scripting03132000.asp

调用的方法有很多种。但总体来说它是分两类:
一、有返回值的调用法:(该方法有没有反回值都可以用)
< script language="JavaScript" >
function getDatal(url){
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.4.0");//创建XMLHTTPRequest对象,需MSXML4.0支持 ["MSXML2.XMLHTTP.4.0"、"MSXML2.DOMDocument.4.0"]
xmlhttp.open("GET",url,false,"",""); //使用HTTP GET初始化HTTP请求
xmlhttp.send(""); //发送HTTP请求并获取HTTP响应
return xmlhttp.responseXML; //获取XML文档
}
< /script >

二、没有返回值的调用法:
上面的方法可以用。并且最起码还有其它两种方案:
<script language="JavaScript">
function gotoService()
{
myframe.src="http://../../serverics.asmx?aa";//这样就可以使你的方法被调用一次。
}
</script>
<iframe id="myframe"></iframe>
或者
window.open(服务URI);
或许打开模式对话框
============================
在坛上找了一篇上面的回复,但不是很情楚第一方法的一些细节,请熟悉的朋友针对下面的简单的应用情况给出上面第一种方法的具体参数的设定情况.
现有一web service 工作程:DataTransfer,其中有一个名为"test"的service,web method名为"test1",其返回值为"hello,world!".
现在页面上用javascript调用test.test1方法,显示"hello,world!".
function btnGetData_onclick()
{
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP.4.0");
xmlhttp.open("Get","http://localhost/DataTransfer/test.asmx?wsdl",false,"","");
xmlhttp.send("");
Form1.txtResults.value=xmlhttp.responseText;
}
返回的不是"hello,world!",请修正我的程序!


12:16 | 发送消息 | 固定链接 | 引用通告 (0) | 写入博客 | webservice
客户端xmlhttp调用webservice
SOAP对WebService进行调用
<SCRIPT language="JavaScript">
// Client invoke WebService use SOAP request and response
function GetHelloWorld_SOAP(i)
{
    var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    var soapMessage, soapData, URL;
    // Set the soap message
    soapMessage = "<?xml version=/"1.0/" encoding=/"utf-8/"?>";
    soapMessage += "<soap:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/""
    + " xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//">";
    soapMessage += "<soap:Body>";
    // Set the data for soap body ---- begin ------
    soapData = "<HelloWorld xmlns=/"http://tempuri.org//">";
    soapData += "    <i>" + i + "</i>";
    soapData += "</HelloWorld>";
    // Set the data for soap body ----  end  ------
    soapMessage = soapMessage + soapData + "</soap:Body>";
    soapMessage = soapMessage + "</soap:Envelope>";
    URL = "Service1.asmx"; //可以使用相对地址或完整URL
    xmlhttp.Open("POST",URL, false);
    xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=utf-8");
    xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/HelloWorld");
    xmlhttp.send(soapMessage);
    alert(soapMessage)
    var x =   xmlhttp.responseXML;
    alert(x.childNodes[1].text);
    //那么如何知道是否调用成功呢,状态为200说明调用成功,500则说明出错
    alert(xmlhttp.Status);
    alert(xmlhttp.StatusText);
}
</SCRIPT>
<SCRIPT language="vbscript">
' Client invoke WebService use SOAP request and response
Function vbGetHelloWorld_SOAP(i)
    dim soapMessage, soapData, URL
    ' Set the soap message
    soapMessage = "<?XML version=""1.0"" encoding=""utf-8""?>"
    soapMessage = soapMessage & "<SOAP:ENVELOPE xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"""
    +" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
    soapMessage = soapMessage & "<SOAP:BODY>"
    ' Set the data for soap body ---- begin ------
    soapData = "<HELLOWORLD xmlns=""http://tempuri.org/"">"
    soapData = soapData & "    <I>" & i & "</I>"
    soapData = soapData & "</HELLOWORLD>"
    ' Set the data for soap body ----  end  ------
    soapMessage = soapMessage & soapData & "</SOAP:BODY>"
    soapMessage = soapMessage & "</SOAP:ENVELOPE>"
    URL = "Service1.asmx" '可以使用相对地址或完整URL
    Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
    xmlhttp.Open "POST",URL, False 
    xmlhttp.SetRequestHeader "Content-Type","text/xml; charset=utf-8" 
    xmlhttp.SetRequestHeader "SOAPAction","http://tempuri.org/HelloWorld"
    xmlhttp.send(soapMessage)
    Set x2 =   xmlhttp.responseXML
    alert(x2.childNodes(1).text)
    '那么如何知道是否调用成功呢,状态为200说明调用成功,500则说明出错
    alert(xmlhttp.Status)
    alert(xmlhttp.StatusText)
End Function
</SCRIPT>
 
JavaScript vbscript  

通过HTTP POST对WebService进行调用
<SCRIPT language="JavaScript">
// Client invoke WebService use HTTP POST request and response
function GetHelloWorld_HTTPPOST(i)
{
    var URL = "http://localhost/WSInvoke/Service1.asmx/HelloWorld";
    var Params = "i=" + i;// Set postback parameters
    var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.Open("POST",URL, false);
    xmlhttp.SetRequestHeader ("Content-Type","application/x-www-form-urlencoded");
    xmlhttp.SetRequestHeader ("Content-Length",Params.length);
    xmlhttp.send(Params);
    var x =   xmlhttp.responseXML;
    alert(x.childNodes[1].text);
    //那么如何知道是否调用成功呢,状态为200说明调用成功,500则说明出错
    alert(xmlhttp.Status);
    alert(xmlhttp.StatusText);
}
</SCRIPT>
<SCRIPT language="vbscript">
' Client invoke WebService use HTTP POST request and response
Function vbGetHelloWorld_HTTPPOST(i)
    URL = "http://localhost/WSInvoke/Service1.asmx/HelloWorld"
    Params = "i=" & i ' Set postback parameters
    Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
    xmlhttp.Open "POST",URL,False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    xmlhttp.setRequestHeader "Content-Length",LEN(Params)
    xmlhttp.Send(Params)
    Set x =   xmlhttp.responseXML
    alert(x.childNodes(1).text)
    '那么如何知道是否调用成功呢,状态为200说明调用成功,500则说明出错
    alert(xmlhttp.Status)
    alert(xmlhttp.StatusText)
    Set xmlhttp = Nothing
End Function
</SCRIPT>
 
JavaScript vbscript  
 
借助MS的webservice.htc简化调用
webservice.htc是MS提供的一个对webservie常用方法的封装,可以从ms官方网站下载,安装iewebcontrols时也会安装到你的网站根目录下,使用时需要注意路径。请注意代码中body的属性设置,更多对WebService.htc的介绍,点击这里。
<SCRIPT language="JavaScript">
function Init()
{
    // establishes a friendly name for a Web service URL
    wsCaller.useService("http://localhost/WSInvoke/Service1.asmx?WSDL","HW");
}
function callWS(i)
{
    wsCaller.HW.callService(Handler_HW, "HelloWorld", i);
}
function Handler_HW(result)
{
    // if there is an error, and the call came from the call() in init()
    if(result.error)
    {
        // Pull the error information from the event.result.errorDetail properties
        var xfaultcode   = result.errorDetail.code;
        var xfaultstring = result.errorDetail.string;
        var xfaultsoap   = result.errorDetail.raw;
        // Add code to handle specific error codes here
    }
    // if there was no error
    else
    {
        document.all.Text1.value = result.value;
    }
}
</SCRIPT>
<BODY id="wsCaller" onload="Init()" style="BEHAVIOR:url(webservice.htc)">
<INPUT type="text" id="Text1" name="Text1">
<INPUT onclick="callWS(1)" type="button" value="Invoke" id="Button1" name="Button1">
 
 
 
Web Service 的完整代码(C#, Service1.asmx.cs)
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace WSInvoke
{
    /// <SUMMARY>
    /// Summary description for Service1.
    /// </SUMMARY>
    public class Service1 : System.Web.Services.WebService
    {
        public Service1()
        {
            //CODEGEN: This call is required by the ASP.NET Web Services Designer
            InitializeComponent();
        }
        #region Component Designer generated code
        //Required by the Web Services Designer
        private IContainer components = null;
        /// <SUMMARY>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </SUMMARY>
        private void InitializeComponent()
        {
        }
        /// <SUMMARY>
        /// Clean up any resources being used.
        /// </SUMMARY>
        protected override void Dispose( bool disposing )
        {
            if(disposing && components != null)
            {
                components.Dispose();
            }
            base.Dispose(disposing); 
        }
        #endregion
        // WEB SERVICE EXAMPLE
        // The HelloWorld() example service returns the string Hello World
        // To build, uncomment the following lines then save and build the project
        // To test this web service, press F5
        [WebMethod]
        public string HelloWorld(int i)
        {
            return "Hello World" + i;
        }
    }
}
 
 

测试所用的html页面(Invoke.html)
<HTML>
 <BODY>
  <INPUT type="button" value="SOAP" onclick="GetHelloWorld_SOAP('1')" id="Button1" name="Button1">
  <INPUT type="button" value="HTTPPOST" onclick="GetHelloWorld_HTTPPOST('2')" id="Button2" name="Button2">
  <INPUT type="button" value="异常测试" onclick="GetHelloWorld_SOAP('')" id="Button3" name="Button3"><BR><BR>
  <INPUT type="button" value="vbSOAP" onclick="vbGetHelloWorld_SOAP('3')" id="Button4" name="Button4">
  <INPUT type="button" value="vbHTTPPOST" onclick="vbGetHelloWorld_HTTPPOST('4')" id="Button5" name="Button5">
 </BODY>
</HTML>
 
 
很晚了,先把代码贴上。有空的时候把异步操作再仔细分析一下 :B
附表1(IXMLHTTPRequest - 属性)
Name  Type  Description 
onreadystatechange  N/A 指定当就绪状态发生改变时调用的事件处理函数,仅用于异步操作
readyState  Long 异步操作的状态:未初始化(0),正在加载(1),已加载(2),交互(3),已完成(4)
responseBody  Variant 将响应信息正文作为unsigned byte数组返回
responseStream  Variant 将响应信息正文作为一个ADO Stream对象返回
responseText  String 将响应信息正文作为一个文本字符串返回
responseXML  Object 通过XMLDom将响应信息正文解析为XMLDocument对象
status  Long 服务器返回的HTTP状态码
statusText  String 服务器HTTP响应行状态

附表2(IXMLHTTPRequest - 方法)
Name  Desciption 
abort 取消当前 HTTP 请求
getAllResponseHeaders 从响应信息中检索所有的标头字段
getResponseHeader 从响应信息正文中获得一个 HTTP 标头值
open(method, url, boolAsync, bstrUser, bstrPassword) 打开一个与 HTTP 服务器的连接
send(varBody) 设定一个请求的标头字段
setRequestHeader(bstrHeader, bstrValue) 向 HTTP 服务器发送请求。可包含正文。
 


几种调用WebService的方法
几种调用WebService的方法
   
 
  几种调用WebService的方法     选择自 Megres 的 Blog 
1.  在JavaScript中调用WebService
<script language="javascript">
function PostRequestData(URL,data){
       var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
       xmlhttp.Open("POST",URL, false);
       xmlhttp.SetRequestHeader ("Content-Type","text/xml; ch***t=utf-8");
       xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/myService/test/isNumner");
      
       try {
              xmlhttp.Send(data);
              var result = xmlhttp.status;
       }
       catch(ex) {
              return("0" + ex.description + "|" + ex.number);
       }
       if(result==200) {
              return("1" + xmlhttp.responseText);
       }
       xmlhttp = null;
}
 
function loadit(value){
       var url = 'http://localhost/myService/test.asmx';
       var data ;
       var r;
      
       data = '<?xml version="1.0" encoding="utf-8"?>';
       data = data + '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
    data = data + '<soap:Body>';
    data = data + '<isNumner xmlns="http://tempuri.org/myService/test">';
    data = data + '<str>'+value+'</str>';
    data = data + '</isNumner>';
    data = data + '</soap:Body>';
    data = data + '</soap:Envelope>';
      
       r=PostRequestData(url,data);
       do***ent.write(r);               
}
loadit('5');
</script>

 还可以使用微软的htc组件来实现,可以到这里下载:
http://msdn.microsoft.com/workshop/author/webservice/webservice.htc

<script language="javascript">
    function timer(){
        service.useService("http://localhost/myService/test.asmx?WSDL","test");
        service.test.callService(callback,"isNumner",'gdh');
     }
   
    function callback(res){
        if (!res.error)
            time.innerText=res.value;               
    }
 </script>
 
<div id="service" style="behavior:url(webservice.htc)"></div>
<span id="time"></span>
 
2. 在Asp中
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
             Dim strxml
        Dim str      
      
        '定义soap消息
        strxml = "<?xml version='1.0' encoding='tf-8'?>"
        strxml = strxml & "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>"
        strxml = strxml & "<soap:Body> "
              strxml = strxml & "<isNumner xmlns='http://tempuri.org/myService/test'>"
        strxml = strxml & "<str>4</str>"
        strxml = strxml & "</isNumner>"
              strxml = strxml & "</soap:Body>"
        strxml = strxml & "</soap:Envelope>"
             
        '定义一个XML的文档对象,将手写的或者接受的XML内容转换成XML对象
        'set x = createobject("Microsoft.DOMDo***ent")
        '初始化XML对象
        '将手写的SOAP字符串转换为XML对象
        ' x.loadXML strxml
        '初始化http对象
        Set h = createobject( "Microsoft.XMLHTTP")
        '向指定的URL发送Post消息
        h.open "POST", "http://localhost/myService/test.asmx", False
        h.setRequestHeader "Content-Type", "text/xml"
              h.setRequestHeader "SOAPAction", "http://tempuri.org/myService/test/isNumner"
        h.send (strxml)
        While h.readyState <> 4
        Wend
        '显示返回的XML信息
        str = h.responseText
        '将返回的XML信息解析并且显示返回值
        'Set x = createobject("MSXML2.DOMDo***ent")
        ' x.loadXML str
       
        'str = x.childNodes(1).Text
        
         response.write(str)
 
%>
 3.在.net中
在.net中调用WebService就方便多了,没有必要自己写soap消息了,以上都是用XMLHTTP来发送WebService请求的,在.net只要添加了web引用,会自动为你创建一个代理类。然后使用代理类就像用自己定义的类一样方便。 
 
 
非.NET语言调用.NET XMLWeb Services返回的数据集合的两个方法
 
摘要
本文介绍了如何在非.NET语言环境中(如Java、Delphi等)调用.NET XML Web Services,并特别针对很多开发者所关心的"如何在Java/Delphi中使用.NET的Web Service返回的DataSet"的问题,提出了两个解决方案:使用自定义类型数组和使用DataSet.WriteXML()。
-------------------------------------------------------------------

目录
1. 概述
2. 创建.NET Web Services,返回数据集合
3. 在Java中调用.NET Web Services,处理返回的数据集合
4. 小结
-------------------------------------------------------------------
1.概述
很多正在开发或者打算开发XML Web Services的程序员都问过这样的一个问题:"我的Web Service返回的结果是一个DataSet类型的对象,但如果我的客户端不是用.NET写的(因而没有内建的DataSet类型),那该如何调用这个Web Service并访问DataSet中的数据呢?"。
对于这个问题,首先应该说的是:1)在多种语言共存的编程环境下,是不适合使用类似DataSet这种只属于特定语言的数据类型的。不管是在XML Web Services还是CORBA的环境中,都应该尽量使用简单数据类型以及简单数据类型的数组。2)应当很谨慎的决定是否需要通过
Web Service来返回大量数据。由于网络传输的开销既包括HTTP连接建立的时间,也包括传送数据的时间,因此需要在减少访问服务器次数和减少网络传输量之间寻找一个合适的平衡。如非必须,则不适合通过Web Service传送含有几十条或者几百条数据的数据表。
然后,就问题本身而言,.NET Web Services返回的DataSet类型是可以直接被其他非.NET的客户端解析的,因为即便是DataSet类型的返回值,也会被表达成XML格式再进行传输。下面的例子就是一个返回类型为DataSet的Web Method,及其被调用后返回的XML格式数据:
[WebMethod]
public DataSet GetPersonData()
{
DataTable table=new DataTable("Person");
table.Columns.Add("Name");
table.Columns.Add("Gender");
table.Rows.Add(new string[2]{"Alice","Female"});
table.Rows.Add(new string[2]{"Bob","Male"});
table.Rows.Add(new string[2]{"Chris","Male"});
DataSet dataset=new DataSet("PersonTable");
dataset.Tables.Add(table);
return dataset;
}
图表1. 返回类型为DataSet的Web Method
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
<xs:schema id="PersonTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="PersonTable" msdata:IsDataSet="true" msdata:Locale="zh-CN">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="Gender" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<PersonTable xmlns="">
<Person diffgr:id="Person1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<Name>Alice</Name>
<Gender>Female</Gender>
</Person>
<Person diffgr:id="Person2" msdata:rowOrder="1" diffgr:hasChanges="inserted">
<Name>Bob</Name>
<Gender>Male</Gender>
</Person>
<Person diffgr:id="Person3" msdata:rowOrder="2" diffgr:hasChanges="inserted">
<Name>Chris</Name>
<Gender>Male</Gender>
</Person>
</PersonTable>
</diffgr:diffgram>
</DataSet>
图表2. 被格式化成XML的DataSet
从上面的例子可以看出,直接使用DataSet作为返回类型,其结果是相当复杂的,其中不但包含了DataSet中的数据,还包括了数据更改的信息,以及DataSet的Schema。虽然有些工具能够生成一个类似DataSet的客户端类型,但无论是直接解析复杂的XML还是使用类似DataSet的类,都不够直接不够清晰。
解决这个问题的方案有两种:
1) 用简单数据类型构造自定义类型,用每一个自定义类型对象封装数据集中的一行,将自定义类型对象的数组(Array)返回客户端;由于是用简单数据类型定义,客户端能够完全不变的还原出自定义类型的定义;
2) 用DataSet.WriteXML()方法将数据集中的数据提取成XML格式,并以字符串的形式返回给客户端,再由客户端解析XML字符串,还原出数据。由于使用WriteXML()的时候能够过滤掉冗余信息,返回的内容和图表2中的内容相比大大简化了。
下面就将用C#分别实现这两种方案,并详细演示如何在Java客户端中调用并获取数据。
-------------------------------------------------------------------
2. 创建.NET Web Services,返回数据集合
借助于Visual Studio.NET,只需编写Web Method本身的代码,即可非常快速的创建可以实用的Web Services:
[WebMethod]
public Person[] GetPersons()
{
Person Alice=new Person("Alice","Female");
Person Bob=new Person("Bob","Male");
Person Chris=new Person("Chris","Female");
Person Dennis=new Person("Dennis","Male");
return new Person[]{Alice,Bob,Chris,Dennis};
}
[WebMethod]
public string GetPersonTable()
{
DataTable table=new DataTable("Person");
table.Columns.Add("Name");
table.Columns.Add("Gender");
table.Rows.Add(new string[2]{"Alice","Female"});
table.Rows.Add(new string[2]{"Bob","Male"});
table.Rows.Add(new string[2]{"Chris","Female"});
table.Rows.Add(new string[2]{"Dennis","Male"});
table.Rows.Add(new string[2]{"Eric","Male"});
DataSet dataset=new DataSet("PersonTable");
dataset.Tables.Add(table);
System.Text.StringBuilder strbuilder=new System.Text.StringBuilder();
StringWriter writer=new StringWriter(strbuilder);
dataset.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema);
return strbuilder.ToString();
}
图表3. 用.NET实现的XML Web Services
在上面的代码中,函数GetPersons()和GetPersonTable()分别对应于"1. 概述"中所提到的两种解决方案。其中,Person类型就是用于封装数据集中一行数据的自定义的数据类型:
[Serializable]
public class Person
{
public Person()
{
}
public Person(string name,string gender)
{
this.Name=name;
this.Gender=gender;
}
public string Name="";
public string Gender="";
}
图表4. 自定义类型Person
下面就是在Internet Exploerer里直接调用这两个Web Method所得到的XML格式的结果:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://tempuri.org/">
<Person>
<Name>Alice</Name>
<Gender>Female</Gender>
</Person>
<Person>
<Name>Bob</Name>
<Gender>Male</Gender>
</Person>
<Person>
<Name>Chris</Name>
<Gender>Female</Gender>
</Person>
<Person>
<Name>Dennis</Name>
<Gender>Male</Gender>
</Person>
</ArrayOfPerson>
图表5. GetPersons()的返回结果
<PersonTable> <Person>
<Name>Alice</Name>
<Gender>Female</Gender>
</Person> <Person>
<Name>Bob</Name>
<Gender>Male</Gender>
</Person> <Person>
<Name>Chris</Name>
<Gender>Female</Gender>
</Person> <Person>
<Name>Dennis</Name>
<Gender>Male</Gender>
</Person> <Person>
<Name>Eric</Name>
<Gender>Male</Gender>
</Person> </PersonTable>
图表6. GetPersonTable()的返回的String类型的值
到这里,XML Web Service的创建就已经完成了。.NET中创建的XML Web Services遵循的是统一的行业标准(SOAP、XML等),因此无论使用.NET语言还是使用非.NET语言,都可以调用它。尤其对于GetPersonTable()返回的结果来说,只要用XML Parser作简单的处理,就能把数据提取出来。下面就将演示如何在Java中完成这一处理。
-------------------------------------------------------------------
3. 在Java中调用.NET Web Services,处理返回的数据集合
编写客户端调用Web Services时,最快速简便做法的是利用工具根据Web Services的WSDL描述生成客户端代理类(Proxy),而不是直接对SOAP Toolkit进行编程。在.NET Framework中,这个工作可以由wsdl.exe完成。在Java中,可以在JBuilder或者VisualAge Java等Java IDE中安装一个叫做WASP Developer的免费插件,这个插件也能完成由WSDL描述生成Proxy类的工作。另外,该公司还提供了WASP Server for Java和WASP UDDI,降低了用户用Java开发Web Services以及建立UDDI服务的难度。
在本文的例子中,用了JBuilder 7+WASP Developer来调用前文中建立的.NET XML Web Services。在调用之前,首先是用WASP Developer生成Proxy类。从图表7、8中可以看到,生成Proxy的工具已经在Java中也创建了一个Person类:

图表7. 用WASP Developer生成的Proxy类
package javaclient.service1Soap12Clientstruct;
public class Person {
public java.lang.String Name;
public java.lang.String Gender;
}
/*
* Generated by WSDLCompiler, (c) 2002, Systinet Corp.
* http://www.systinet.com
*/
图表8. WASP Developer创建的Person类
在Proxy类的基础上,就可以访问.NET编写的Web Services并提取数据了。对于GetPersons()来说,由于已经生成了Person类,所以调用代码非常简单直接:
import org.idoox.webservice.client.WebServiceLookup;
import org.idoox.wasp.Context;
import javax.swing.*;
import javax.swing.table.*;
try{
System.setProperty( "wasp.location","C://Home//Util//wasp_4.0SP2");
javaclient.service1Soap12Client.Service1Soap service;
String serviceURI = "http://localhost/dotNetHost/Service1.asmx";
String wsdlURI = "http://localhost/dotNetHost/Service1.asmx?wsdl";
WebServiceLookup lookup = (WebServiceLookup) Context.getInstance(Context.WEBSERVICE_LOOKUP);
service = (javaclient.service1Soap12Client.Service1Soap) lookup.lookup(
wsdlURI,
javaclient.service1Soap12Client.Service1Soap.class,
serviceURI);
Person[] persons=
service.GetPersons(new javaclient.service1Soap12Clientstruct.GetPersons()).GetPersonsResult;
DefaultTableModel model=new DefaultTableModel(new String[]{"name","gender"},0);
for(int i=0;i<persons.length;i++){
model.addRow(new String[]{persons[i].Name.toString(),persons[i].Gender.toString()});
}
this.jTable1.setModel(model);
}
catch(Exception ex)
{
javax.swing.JOptionPane.showMessageDialog(this,ex.getMessage());
}
图表9. 在Java中调用GetPersons()的代码
调用GetPersonTable()并解析XML字符串要相对复杂一些,需要用到XML Parser从图表6中的XML字符串中提取数据,并逐一显示在JTable中。下面是从访问Web Method到解析XML,最后提取数据并显示的完整代码,及其运行结果截图:
import javax.swing.*;
import javax.swing.table.*;
import org.idoox.webservice.client.WebServiceLookup;
import org.idoox.wasp.Context;
import org.w3c.dom.*;
import org.apache.xml.serialize.*;
import org.apache.xerces.dom.*;
try{
System.setProperty( "wasp.location","C://Home//Util//wasp_4.0SP2");
javaclient.service1Soap12Client.Service1Soap service;
String serviceURI = "http://localhost/dotNetHost/Service1.asmx";
String wsdlURI = "http://localhost/dotNetHost/Service1.asmx?wsdl";
WebServiceLookup lookup = (WebServiceLookup) Context.getInstance(Context.WEBSERVICE_LOOKUP);
service = (javaclient.service1Soap12Client.Service1Soap) lookup.lookup(
wsdlURI,
javaclient.service1Soap12Client.Service1Soap.class,
serviceURI);
String result=
service.GetPersonTable(new javaclient.service1Soap12Clientstruct.GetPersonTable()).GetPersonTableResult;
DefaultTableModel model=new DefaultTableModel(new String[]{"name","gender"},0);
java.io.StringReader reader=new java.io.StringReader(result);
org.apache.xerces.parsers.DOMParser parser=new org.apache.xerces.parsers.DOMParser();
parser.parse(new org.xml.sax.InputSource(reader));
org.w3c.dom.Document document=parser.getDocument();
org.w3c.dom.NodeList children=document.getDocumentElement().getChildNodes();
for(int i=0;i<children.getLength();i++){
org.w3c.dom.Node node=children.item(i);
if(node.getNodeName().equals("Person")){
org.w3c.dom.NodeList personAttrNodes=node.getChildNodes();
String name="N/A";
String gender="N/A";
for(int j=0;j<personAttrNodes.getLength();j++){
org.w3c.dom.Node attrNode=personAttrNodes.item(j);
String attrNodeName=attrNode.getNodeName();
if(attrNodeName.equals("Name")){
name=attrNode.getFirstChild().getNodeValue();
}else if(attrNodeName.equals("Gender")){
gender=attrNode.getFirstChild().getNodeValue();
}else{
continue;
}
}
model.addRow(new String[]{name,gender});
}
}
this.jTable1.setModel(model);
}
catch(Exception ex)
{
javax.swing.JOptionPane.showMessageDialog(this,ex.getMessage());
}
图表10. 在Java中调用GetPersonTable()的代码

图表11.调用GetPersonTable()的运行结果
-------------------------------------------------------------------
4. 小结
从前面的叙述和代码中可以看出,对于"如何在Java/Delphi中使用.NET的Web Service返回的DataSet"的问题,虽然在非.NET语言环境中直接接受DataSet类型的返回值比较困难,但可以有其他的解决方案。
对于第一种解决方案,也就是采用自定义数据类型,它的优点是客户端代码非常简单,容易编写,而且容易理解。它的缺点是服务器端需要定义新的类,而且当通过ADO.NET从数据库中提取数据以后,还要再手工编写代码,将DataSet中的数据遍历一遍,转存成自定义类型的对象。
对于第二种解决方案,就是用DataSet.WriteXML()的方案,它的优点和缺点正好和第一种方案是互补的。它在客户端需要编写较多的代码,尤其是需要用XML Parser编程,提高了编程的难度。另一方面,它在服务器端比较简单。如果开发者在原先的纯.NET环境(即客户端也是.NET)中已经开发了返回类型为DataSet的Web Services,那么当开发者希望在客户端引入非.NET语言时,服务器端只需要简单的再增加一个Web Method,通过简单的WriteXML()调用对原有的方法进行简单的包装,就能够适用于非.NET客户端了。
从更广阔的角度来看,上面两种解决方案也可以用在"非.NET服务器+.NET客户端"的Web Services环境中。在各种非原生(Native)的情况下,尽量使用简单数据类型,或者使用XML来表达数据,总是上佳的选择。
 

12:12 | 发送消息 | 固定链接 | 引用通告 (0) | 写入博客 | webservice
ASP如何调用。Net的WebService
ASP如何调用。Net的WebService
ASP调用.Net的webservice的例子:
假设webservice的地址是http://192.168.0.88/test.asmx 接口是doAdd
下面是WebService的 SOAP 请求和响应示例
POST /test.asmx HTTP/1.1
Host: 192.168.0.88
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.test.com/doAdd"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <doAdd xmlns="http://www.test.com/">
      <sRequest>string</sRequest>
    </doAdd>
  </soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <doAddResponse xmlns="http://www.test.com/">
      <doAddResult>string</doAddResult>
    </doAddResponse>
  </soap:Body>
</soap:Envelope>
下面是ASP页面:test.asp
<%
Dim url,xmlhttp,dom,node,xmlDOC
'根据webservice的测试页,构造不同的soap request
   SoapRequest = "<?xml version="&CHR(34)&"1.0"&CHR(34)&" encoding="&CHR(34)&"utf-8"&CHR(34)&"?>"&_
"<soap:Envelope xmlns:xsi="&CHR(34)&"http://www.w3.org/2001/XMLSchema-instance"&CHR(34)&" xmlns:xsd="&CHR(34)&"http://www.w3.org/2001/XMLSchema"&CHR(34)&" xmlns:soap="&CHR(34)&"http://schemas.xmlsoap.org/soap/envelope/"&CHR(34)&">"&_
  "<soap:Body>"&_
    "<queryCardInfo xmlns="&CHR(34)&"http://tempuri.org/"&CHR(34)&">"&_
      "<nCardID>0</nCardID>"&_
      "<nAmt>1</nAmt>"&_
    "</queryCardInfo>"&_
  "</soap:Body>"&_
"</soap:Envelope>"
  
url = "http://192.168.0.88/test.asmx?op=doAdd"

Set xmlDOC =CreateObject("MSXML.DOMDocument")
xmlDOC.loadXML(SoapRequest)
Set xmlhttp = CreateObject("Msxml2.XMLHTTP")
xmlhttp.Open "POST",url,false
xmlhttp.setRequestHeader "Content-Type", "text/xml;charset=utf-8"
'SOAPAction这个Header头同样可以在sample中找到
xmlhttp.setRequestHeader "SOAPAction", "http://tempuri.org/queryCardInfo"
xmlhttp.setRequestHeader "Content-Length",LEN(SoapRequest)
xmlhttp.Send(xmlDOC)
response.write  "status = "&xmlhttp.Status&"<br>"
response.write  "statustxt = "&xmlhttp.StatusText&"<br>"
response.write  "responseText = "&xmlhttp.responseText&"<br>"
If xmlhttp.Status = 200 Then 'ok responseXML
 xmlDOC.load(xmlhttp.responseXML)
 'response.write  "price = "&xmlDOC.getElementsByTagName("PARAMS").item(0).xml&"<br>"
 response.Write(xmlDOC.xml)
else
 response.write  "failed"
end if
%>

 

asp.net调用WebService
这里一定要添加WEB 引用菜单步骤如下project->add web reference...,然后输入我们Web Service的路径,这里是http://localhost/WebService1/Service1.asmx,点击添加就OK了。这时你将在类视图中看到localhost命名空间了。
 
WebApplication1
WebForm1.aspx
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebApplication1.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">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <asp:Panel id="Panel1" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 16px" runat="server"
                Width="568px" Height="256px">
                <P>Panel
                    <asp:Button id="Button3" runat="server" Text="Button3"></asp:Button>
                    <asp:Button id="Button2" runat="server" Text="Button2"></asp:Button>
                    <asp:Button id="Button1" runat="server" Text="Button1"></asp:Button>
                    <asp:TextBox id="TextBox1" runat="server"></asp:TextBox></P>
                <P>
                    <asp:Label id="Label1" runat="server">Label</asp:Label></P>
                <P>
                    <asp:DataGrid id="DataGrid1" runat="server" Width="568px" Height="120px"></asp:DataGrid></P>
            </asp:Panel>
        </form>
    </body>
</HTML>
 
 
 
====================================================
WebForm1.aspx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
 
namespace WebApplication1
{
    /// <summary>
    /// WebForm1 的摘要说明。
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Panel Panel1;
        protected System.Web.UI.WebControls.Button Button1;
        protected System.Web.UI.WebControls.Button Button2;
        protected System.Web.UI.WebControls.Button Button3;
        protected System.Web.UI.WebControls.TextBox TextBox1;
        protected System.Web.UI.WebControls.DataGrid DataGrid1;
        protected System.Web.UI.WebControls.Label Label1;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
           
            // 在此处放置用户代码以初始化页面
        }
 
        #region Web 窗体设计器生成的代码
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }
       
        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.Button1.Click += new System.EventHandler(this.Button1_Click);
            this.Button2.Click += new System.EventHandler(this.Button2_Click);
            this.Button3.Click += new System.EventHandler(this.Button3_Click);
            this.Load += new System.EventHandler(this.Page_Load);
 
        }
        #endregion
 
        private void Button2_Click(object sender, System.EventArgs e)
        {
            DataSet ds=new DataSet();
            localhost.WebService1 oService=new localhost.WebService1();
            //返回记录集
            ds=oService.GetService1Table();
            if (ds!=null)
            {
                //显示记录集的记录
                DataGrid1.DataSource=ds.Tables["mfTable1"];
                DataGrid1.DataBind();
            }
            else
            {
                this.Response.Write("加载数据错误!");
            }
        }
 
        //测试GetByUser()
        private void Button1_Click(object sender, System.EventArgs e)
        {
            DataSet ds=new DataSet();
            localhost.WebService1 oService=new localhost.WebService1();
            string mfCommand=TextBox1.Text;
            ds=oService.GetByUser(mfCommand);
            if (ds!=null)
            {
                DataGrid1.DataSource=ds;
                DataGrid1.DataBind();
            }
            else
            {
                Response.Write("错误!有可能是SQL命令有问题!");
            }
        }
        //测试About()
        private void Button3_Click(object sender, System.EventArgs e)
        {
            localhost.WebService1 oService=new localhost.WebService1();
            Label1.Text=oService.About();
        }
 
    }
}
 
 
 
====================================================
WebService1
Service1.asmx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;
 
namespace WebService1
{
    /// <summary>
    /// Service1 的摘要说明。
    /// </summary>
    [WebService(Namespace="http://localhost/WebService1/",Name="WebService1",Description="WebService1")]
    public class Service1 : System.Web.Services.WebService
    {
        public Service1()
        {
            //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
            InitializeComponent();
        }
 
        #region 组件设计器生成的代码
       
        //Web 服务设计器所必需的
        private IContainer components = null;
               
        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
        }
 
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if(disposing && components != null)
            {
                components.Dispose();
            }
            base.Dispose(disposing);       
        }
       
        #endregion
 
        // WEB 服务示例
        // HelloWorld() 示例服务返回字符串 Hello World
        // 若要生成,请取消注释下列行,然后保存并生成项目
        // 若要测试此 Web 服务,请按 F5 键
 
//        [WebMethod]
//        public string HelloWorld()
//        {
//            return "Hello World";
//        }
//连接字符串常量
        const string mfConn="uid=sa;pwd=mikecat


SQL集锦- -
SQL语句集锦

--语 句                                功 能
--数据操作
SELECT      --从数据库表中检索数据行和列
INSERT      --向数据库表添加新数据行
DELETE      --从数据库表中删除数据行
UPDATE      --更新数据库表中的数据
--数据定义
CREATE TABLE    --创建一个数据库表
DROP TABLE     --从数据库中删除表
ALTER TABLE     --修改数据库表结构
CREATE VIEW     --创建一个视图
DROP VIEW     --从数据库中删除视图
CREATE INDEX    --为数据库表创建一个索引
DROP INDEX     --从数据库中删除索引
CREATE PROCEDURE   --创建一个存储过程
DROP PROCEDURE    --从数据库中删除存储过程
CREATE TRIGGER    --创建一个触发器
DROP TRIGGER    --从数据库中删除触发器
CREATE SCHEMA    --向数据库添加一个新模式
DROP SCHEMA     --从数据库中删除一个模式
CREATE DOMAIN    --创建一个数据值域
ALTER DOMAIN    --改变域定义
DROP DOMAIN     --从数据库中删除一个域
--数据控制
GRANT      --授予用户访问权限
DENY      --拒绝用户访问
REVOKE      --解除用户访问权限
--事务控制
COMMIT      --结束当前事务
ROLLBACK     --中止当前事务
SET TRANSACTION    --定义当前事务数据访问特征
--程序化SQL
DECLARE      --为查询设定游标
EXPLAN      --为查询描述数据访问计划
OPEN      --检索查询结果打开一个游标
FETCH      --检索一行查询结果
CLOSE      --关闭游标
PREPARE      --为动态执行准备SQL 语句
EXECUTE      --动态地执行SQL 语句
DESCRIBE     --描述准备好的查询

 
---局部变量
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'

 
---全局变量
---必须以@@开头

 
--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --打印字符串'x > y'
else if @y > @z
print 'y > z'
else print 'z > y'

 
--CASE
use pangu
update employee
set e_wage =
case
  when job_level = ’1’ then e_wage*1.08
  when job_level = ’2’ then e_wage*1.07
  when job_level = ’3’ then e_wage*1.06
  else e_wage*1.05
end

 
--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
  print @x --打印变量x 的值
  while @y < 3
   begin
    select @c = 100*@x + @y
    print @c --打印变量c 的值
    select @y = @y + 1
   end
  select @x = @x + 1
  select @y = 1
end

 
--WAITFOR
--例 等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
select * from employee
 
 
***SELECT***

 
   select *(列名) from table_name(表名) where column_name operator value
   ex:(宿主)
  select * from stock_information where stockid   = str(nid)
     stockname = 'str_name'
     stockname like '% find this %'
     stockname like '[a-zA-Z]%' --------- ([]指定值的范围)
     stockname like '[^F-M]%'   --------- (^排除指定范围)
     --------- 只能在使用like关键字的where子句中使用通配符)
     or stockpath = 'stock_path'
     or stocknumber < 1000
     and stockindex = 24
     not stock*** = 'man'
     stocknumber between 20 and 100
     stocknumber in(10,20,30)
     order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
     order by 1,2 --------- by列号
     stockname = (select stockname from stock_information  where stockid  = 4)
     --------- 子查询
     --------- 除非能确保内层select只返回一个行的值,
     --------- 否则应在外层where子句中用一个in限定符
  select distinct column_name form table_name --------- distinct指定检索独有的列值,不重复
  select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
  select stockname , "stocknumber" = count(*) from table_name group by stockname
                                      --------- group by 将表按行分组,指定列中有相同的值
          having count(*) = 2  ---------  having选定指定的组
       
  select *
  from table1, table2                 
  where table1.id *= table2.id -------- 左外部连接,table1中有的而table2中没有得以null表示
     table1.id =* table2.id -------- 右外部连接

 
  select stockname from table1
  union [all]  -----  union合并查询结果集,all-保留重复行
  select stockname from table2

 
***insert***

 
  insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
              value (select Stockname , Stocknumber from Stock_table2)---value为select语句

 
***update***

 
  update table_name set Stockname = "xxx" [where Stockid = 3]
         Stockname = default
         Stockname = null
         Stocknumber = Stockname + 4

 
***delete***

 
  delete from table_name where Stockid = 3
  truncate table_name ----------- 删除表中所有行,仍保持表的完整性
  drop table table_name --------------- 完全删除表

 
***alter table*** --- 修改数据库表结构

 
  alter table database.owner.table_name add column_name char(2) null .....
  sp_help table_name ---- 显示表已有特征
  create table table_name (name char(20), age smallint, lname varchar(30))
  insert into table_name select ......... ----- 实现删除列的方法(创建新表)
  alter table table_name drop constraint Stockname_default ---- 删除Stockname的default约束
   
***function(/*常用函数*/)***

 
----统计函数----
AVG    --求平均值
COUNT   --统计数目
MAX    --求最大值
MIN    --求最小值
SUM    --求和

 
--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id

 
--MAX
--求工资最高的员工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
  from employee)

 
--STDEV()
--STDEV()函数返回表达式中所有数据的标准差

 
--STDEVP()
--STDEVP()函数返回总体标准差

 
--VAR()
--VAR()函数返回表达式中所有值的统计变异数

 
--VARP()
--VARP()函数返回总体变异数

 
----算术函数----

 
/***三角函数***/
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
/***反三角函数***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
        --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
                       --把弧度转换为角度返回与表达式相同的数据类型可为
        --INTEGER/MONEY/REAL/FLOAT 类型
RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
        --INTEGER/MONEY/REAL/FLOAT 类型
EXP(float_expression)  --返回表达式的指数值
LOG(float_expression)  --返回表达式的自然对数值
LOG10(float_expression)--返回表达式的以10 为底的对数值
SQRT(float_expression) --返回表达式的平方根
/***取近似值函数***/
CEILING(numeric_expression)  --返回>=表达式的最小整数返回的数据类型与表达式相同可为
        --INTEGER/MONEY/REAL/FLOAT 类型
FLOOR(numeric_expression)    --返回<=表达式的最小整数返回的数据类型与表达式相同可为
        --INTEGER/MONEY/REAL/FLOAT 类型
ROUND(numeric_expression)    --返回以integer_expression 为精度的四舍五入值返回的数据
        --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
ABS(numeric_expression)      --返回表达式的绝对值返回的数据类型与表达式相同可为
        --INTEGER/MONEY/REAL/FLOAT 类型
SIGN(numeric_expression)     --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
        --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
PI()       --返回值为π 即3.1415926535897936
RAND([integer_expression])   --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数

 

----字符串函数----
ASCII()         --函数返回字符表达式最左端字符的ASCII 码值
CHAR()   --函数用于将ASCII 码转换为字符
    --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
LOWER()   --函数把字符串全部转换为小写
UPPER()   --函数把字符串全部转换为大写
STR()   --函数把数值型数据转换为字符型数据
LTRIM()   --函数把字符串头部的空格去掉
RTRIM()   --函数把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING()  --函数返回部分字符串
CHARINDEX(),PATINDEX()  --函数返回字符串中某个指定的子串出现的开始位置
SOUNDEX()  --函数返回一个四位字符码
    --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值    
DIFFERENCE()    --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
    --0 两个SOUNDEX 函数返回值的第一个字符不同
    --1 两个SOUNDEX 函数返回值的第一个字符相同
    --2 两个SOUNDEX 函数返回值的第一二个字符相同
    --3 两个SOUNDEX 函数返回值的第一二三个字符相同
    --4 两个SOUNDEX 函数返回值完全相同
                                      

 
QUOTENAME()  --函数返回被特定字符括起来的字符串
/*select quotename('abc', '{') quotename('abc')
运行结果如下
----------------------------------{
{abc} [abc]*/

 
REPLICATE()     --函数返回一个重复character_expression 指定次数的字符串
/*select replicate('abc', 3) replicate( 'abc', -2)
运行结果如下
----------- -----------
abcabcabc NULL*/

 
REVERSE()       --函数将指定的字符串的字符排列顺序颠倒
REPLACE()       --函数返回被替换了指定子串的字符串
/*select replace('abc123g', '123', 'def')
运行结果如下
----------- -----------
abcdefg*/

 
SPACE()   --函数返回一个有指定长度的空白字符串
STUFF()   --函数用另一子串替换字符串指定位置长度的子串

 

----数据类型转换函数----
CAST() 函数语法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函数语法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])

 
select cast(100+99 as char) convert(varchar(12), getdate())
运行结果如下
------------------------------ ------------
199   Jan 15 2000

 
----日期函数----
DAY()   --函数返回date_expression 中的日期值
MONTH()   --函数返回date_expression 中的月份值
YEAR()   --函数返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>)
    --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
    --函数返回两个指定日期在datepart 方面的不同之处
DATENAME(<datepart> , <date>)  --函数以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>)  --函数以整数值的形式返回日期的指定部分
GETDATE()  --函数以DATETIME 的缺省格式返回系统当前的日期和时间

 
----系统函数----
APP_NAME()      --函数返回当前执行的应用程序的名称
COALESCE()  --函数返回众多表达式中第一个非NULL 表达式的值
COL_LENGTH(<'table_name'>, <'column_name'>) --函数返回表中指定字段的长度值
COL_NAME(<table_id>, <column_id>)   --函数返回表中指定字段的名称即列名
DATALENGTH() --函数返回数据表达式的数据的实际长度
DB_ID(['database_name']) --函数返回数据库的编号
DB_NAME(database_id)  --函数返回数据库的名称
HOST_ID()     --函数返回服务器端计算机的名称
HOST_NAME()     --函数返回服务器端计算机的名称
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中
/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE()  --函数判断所给定的表达式是否为合理日期
ISNULL(<check_expression>, <replacement_value>) --函数将表达式中的NULL 值用指定值替换
ISNUMERIC()  --函数判断所给定的表达式是否为合理的数值
NEWID()   --函数返回一个UNIQUEIDENTIFIER 类型的数值
NULLIF(<expression1>, <expression2>)
--NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值
 


影响SQL server性能的设计关键
1 逻辑数据库和表的设计
  数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序打下良好的基础。
  标准化的数据库逻辑设计包括用多的、有相互关系的窄表来代替很多列的长数据表。下面是一些使用标准化表的一些好处。
  A:由于表窄,因此可以使排序和建立索引更为迅速
  B:由于多表,所以多镞的索引成为可能
  C:更窄更紧凑的索引
  D:每个表中可以有少一些的索引,因此可以提高insert update delete等的速度,因为这些操作在索引多的情况下会对系统性能产生很大的影响
  E:更少的空值和更少的多余值,增加了数据库的紧凑性由于标准化,所以会增加了在获取数据时引用表的数目和其间的连接关系的复杂性。太多的表和复杂的连接关系会降低服务器的性能,因此在这两者之间需要综合考虑。
  定义具有相关关系的主键和外来键时应该注意的事项主要是:用于连接多表的主键和参考的键要有相同的数据类型。
  2 索引的设计
  A:尽量避免表扫描
  检查你的查询语句的where子句,因为这是优化器重要关注的地方。包含在where里面的每一列(column)都是可能的侯选索引,为能达到最优的性能,考虑在下面给出的例子:对于在where子句中给出了column1这个列。
  下面的两个条件可以提高索引的优化查询性能!
  第一:在表中的column1列上有一个单索引
  第二:在表中有多索引,但是column1是第一个索引的列
  避免定义多索引而column1是第二个或后面的索引,这样的索引不能优化服务器性能
  例如:下面的例子用了pubs数据库。
  SELECT au_id, au_lname, au_fname FROM authors
  WHERE au_lname = ’White’
  按下面几个列上建立的索引将会是对优化器有用的索引
  ?au_lname
  ?au_lname, au_fname
  而在下面几个列上建立的索引将不会对优化器起到好的作用
  ?au_address
  ?au_fname, au_lname
  考虑使用窄的索引在一个或两个列上,窄索引比多索引和复合索引更能有效。用窄的索引,在每一页上将会有更多的行和更少的索引级别(相对与多索引和复合索引而言),这将推进系统性能。
对于多列索引,SQL Server维持一个在所有列的索引上的密度统计(用于联合)和在第一个索引上的histogram(柱状图)统计。根据统计结果,如果在复合索引上的第一个索引很少被选择使用,那么优化器对很多查询请求将不会使用索引。
  有用的索引会提高select语句的性能,包括insert,uodate,delete。
  但是,由于改变一个表的内容,将会影响索引。每一个insert,update,delete语句将会使性能下降一些。实验表明,不要在一个单表上用大量的索引,不要在共享的列上(指在多表中用了参考约束)使用重叠的索引。
  在某一列上检查唯一的数据的个数,比较它与表中数据的行数做一个比较。这就是数据的选择性,这比较结果将会帮助你决定是否将某一列作为侯选的索引列,如果需要,建哪一种索引。你可以用下面的查询语句返回某一列的不同值的数目。
  select count(distinct cloumn_name) from table_name
  假设column_name是一个10000行的表,则看column_name返回值来决定是否应该使用,及应该使用什么索引。
  Unique values Index
  5000 Nonclustered index
  20 Clustered index
  3 No index
  镞索引和非镞索引的选择
  <1:>镞索引是行的物理顺序和索引的顺序是一致的。页级,低层等索引的各个级别上都包含实际的数据页。一个表只能是有一个镞索引。由于update,delete语句要求相对多一些的读操作,因此镞索引常常能加速这样的操作。在至少有一个索引的表中,你应该有一个镞索引。
  在下面的几个情况下,你可以考虑用镞索引:
  例如: 某列包括的不同值的个数是有限的(但是不是极少的)
  顾客表的州名列有50个左右的不同州名的缩写值,可以使用镞索引。
  例如: 对返回一定范围内值的列可以使用镞索引,比如用between,>,>=,<,<=等等来对列进行操作的列上。
  select * from sales where ord_date between ’5/1/93’ and ’6/1/93’
  例如: 对查询时返回大量结果的列可以使用镞索引。
  SELECT * FROM phonebook WHERE last_name = ’Smith’
  当有大量的行正在被插入表中时,要避免在本表一个自然增长(例如,identity列)的列上建立镞索引。如果你建立了镞的索引,那么insert的性能就会大大降低。因为每一个插入的行必须到表的最后,表的最后一个数据页。
  当一个数据正在被插入(这时这个数据页是被锁定的),所有的其他插入行必须等待直到当前的插入已经结束。
 一个索引的叶级页中包括实际的数据页,并且在硬盘上的数据页的次序是跟镞索引的逻辑次序一样的。
  <2:>一个非镞的索引就是行的物理次序与索引的次序是不同的。一个非镞索引的叶级包含了指向行数据页的指针。
  在一个表中可以有多个非镞索引,你可以在以下几个情况下考虑使用非镞索引。
  在有很多不同值的列上可以考虑使用非镞索引
  例如:一个part_id列在一个part表中
  select * from employee where emp_id = ’pcm9809f’
  查询语句中用order by 子句的列上可以考虑使用镞索引
  3 查询语句的设计
  SQL Server优化器通过分析查询语句,自动对查询进行优化并决定最有效的执行方案。优化器分析查询语句来决定那个子句可以被优化,并针对可以被优化查询的子句来选择有用的索引。最后优化器比较所有可能的执行方案并选择最有效的一个方案出来。
  在执行一个查询时,用一个where子句来限制必须处理的行数,除非完全需要,否则应该避免在一个表中无限制地读并处理所有的行。
  例如下面的例子,
  select qty from sales where stor_id=7131
  是很有效的比下面这个无限制的查询
  select qty from sales
  避免给客户的最后数据选择返回大量的结果集。允许SQL Server运行满足它目的的函数限制结果集的大小是更有效的。
  这能减少网络I/O并能提高多用户的相关并发时的应用程序性能。因为优化器关注的焦点就是where子句的查询,以利用有用的索引。在表中的每一个索引都可能成为包括在where子句中的侯选索引。为了最好的性能可以遵照下面的用于一个给定列column1的索引。
  第一:在表中的column1列上有一个单索引
  第二:在表中有多索引,但是column1是第一个索引的列不要在where子句中使用没有column1列索引的查询语句,并避免在where子句用一个多索引的非第一个索引的索引。
  这时多索引是没有用的。
  For example, given a multicolumn index on the au_lname, au_fname columns of the authors table in
  the pubs database,
  下面这个query语句利用了au_lname上的索引
  SELECT au_id, au_lname, au_fname FROM authors
  WHERE au_lname = ’White’
  AND au_fname = ’Johnson’
  SELECT au_id, au_lname, au_fname FROM authors
  WHERE au_lname = ’White’
  下面这个查询没有利用索引,因为他使用了多索引的非第一个索引的索引
  SELECT au_id, au_lname, au_fname FROM authors
  WHERE au_fname = ’Johnson’

 

数据库设计方法、规范与技巧
一、数据库设计过程
  数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求。
  数据库设计中需求分析阶段综合各个用户的应用需求(现实世界的需求),在概念设计阶段形成独立于机器特点、独立于各个DBMS产品的概念模式(信息世界模型),用E-R图来描述。在逻辑设计阶段将E-R图转换成具体的数据库产品支持的数据模型如关系模型,形成数据库逻辑模式。然后根据用户处理的要求,安全性的考虑,在基本表的基础上再建立必要的视图(VIEW)形成数据的外模式。在物理设计阶段根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。
  1. 需求分析阶段
  需求收集和分析,结果得到数据字典描述的数据需求(和数据流图描述的处理需求)。
  需求分析的重点是调查、收集与分析用户在数据管理中的信息要求、处理要求、安全性与完整性要求。
  需求分析的方法:调查组织机构情况、调查各部门的业务活动情况、协助用户明确对新系统的各种要求、确定新系统的边界。
  常用的调查方法有: 跟班作业、开调查会、请专人介绍、询问、设计调查表请用户填写、查阅记录。
  分析和表达用户需求的方法主要包括自顶向下和自底向上两类方法。自顶向下的结构化分析方法(Structured Analysis,简称SA方法)从最上层的系统组织机构入手,采用逐层分解的方式分析系统,并把每一层用数据流图和数据字典描述。
  数据流图表达了数据和处理过程的关系。系统中的数据则借助数据字典(Data Dictionary,简称DD)来描述。
  数据字典是各类数据描述的集合,它是关于数据库中数据的描述,即元数据,而不是数据本身。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分(至少应该包含每个字段的数据类型和在每个表内的主外键)。
  数据项描述={数据项名,数据项含义说明,别名,数据类型,长度,
         取值范围,取值含义,与其他数据项的逻辑关系}
  数据结构描述={数据结构名,含义说明,组成:{数据项或数据结构}}
  数据流描述={数据流名,说明,数据流来源,数据流去向,
         组成:{数据结构},平均流量,高峰期流量}
  数据存储描述={数据存储名,说明,编号,流入的数据流,流出的数据流,   
          组成:{数据结构},数据量,存取方式}
  处理过程描述={处理过程名,说明,输入:{数据流},输出:{数据流},
          处理:{简要说明}}
  2. 概念结构设计阶段
  通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型,可以用E-R图表示。
  概念模型用于信息世界的建模。概念模型不依赖于某一个DBMS支持的数据模型。概念模型可以转换为计算机上某一DBMS支持的特定数据模型。
  概念模型特点:
  (1) 具有较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识。
  (2) 应该简单、清晰、易于用户理解,是用户与数据库设计人员之间进行交流的语言。
  概念模型设计的一种常用方法为IDEF1X方法,它就是把实体-联系方法应用到语义数据模型中的一种语义模型化技术,用于建立系统信息模型。
  使用IDEF1X方法创建E-R模型的步骤如下所示:
  2.1 第零步——初始化工程
  这个阶段的任务是从目的描述和范围描述开始,确定建模目标,开发建模计划,组织建模队伍,收集源材料,制定约束和规范。收集源材料是这阶段的重点。通过调查和观察结果,业务流程,原有系统的输入输出,各种报表,收集原始数据,形成了基本数据资料表。
  2.2 第一步——定义实体
  实体集成员都有一个共同的特征和属性集,可以从收集的源材料——基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及具有“代码”结尾的术语,如客户代码、代理商代码、产品代码等将其名词部分代表的实体标识出来,从而初步找出潜在的实体,形成初步实体表。
  2.3 第二步——定义联系
  IDEF1X模型中只允许二元联系,n元联系必须定义为n个二元联系。根据实际的业务需求和规则,使用实体联系矩阵来标识实体间的二元关系,然后根据实际情况确定出连接关系的势、关系名和说明,确定关系类型,是标识关系、非标识关系(强制的或可选的)还是非确定关系、分类关系。如果子实体的每个实例都需要通过和父实体的关系来标识,则为标识关系,否则为非标识关系。非标识关系中,如果每个子实体的实例都与而且只与一个父实体关联,则为强制的,否则为非强制的。如果父实体与子实体代表的是同一现实对象,那么它们为分类关系。
  2.4 第三步——定义码
  通过引入交叉实体除去上一阶段产生的非确定关系,然后从非交叉实体和独立实体开始标识侯选码属性,以便唯一识别每个实体的实例,再从侯选码中确定主码。为了确定主码和关系的有效性,通过非空规则和非多值规则来保证,即一个实体实例的一个属性不能是空值,也不能在同一个时刻有一个以上的值。找出误认的确定关系,将实体进一步分解,最后构造出IDEF1X模型的键基视图(KB图)。
  2.5 第四步——定义属性
  从源数据表中抽取说明性的名词开发出属性表,确定属性的所有者。定义非主码属性,检查属性的非空及非多值规则。此外,还要检查完全依赖函数规则和非传递依赖规则,保证一个非主码属性必须依赖于主码、整个主码、仅仅是主码。以此得到了至少符合关系理论第三范式的改进的IDEF1X模型的全属性视图。
  2.6 第五步——定义其他对象和规则
  定义属性的数据类型、长度、精度、非空、缺省值、约束规则等。定义触发器、存储过程、视图、角色、同义词、序列等对象信息。
  3. 逻辑结构设计阶段
  将概念结构转换为某个DBMS所支持的数据模型(例如关系模型),并对其进行优化。设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型,然后选择最合适的DBMS。
  将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则:
  1)一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。
  2)一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。
  3)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
  4)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
  5)三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。 
  6)同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。
  7)具有相同码的关系模式可合并。
  为了进一步提高数据库应用系统的性能,通常以规范化理论为指导,还应该适当地修改、调整数据模型的结构,这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准,即:
  表内的每一个值都只能被表达一次。
  表内的每一行都应该被唯一的标识(有唯一键)。
  表内不应该存储依赖于其他键的非键信息。  
  4. 数据库物理设计阶段
  为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。根据DBMS特点和处理的需要,进行物理存储安排,设计索引,形成数据库内模式。
  5. 数据库实施阶段
  运用DBMS提供的数据语言(例如SQL)及其宿主语言(例如C),根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 数据库实施主要包括以下工作:用DDL定义数据库结构、组织数据入库 、编制与调试应用程序、数据库试运行
  6. 数据库运行和维护阶段
  数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重组织和重构造。
  建模工具的使用
  为加快数据库设计速度,目前有很多数据库辅助工具(CASE工具),如Rational公司的Rational Rose,CA公司的Erwin和Bpwin,Sybase公司的PowerDesigner以及Oracle公司的Oracle Designer等。
  ERwin主要用来建立数据库的概念模型和物理模型。它能用图形化的方式,描述出实体、联系及实体的属性。ERwin支持IDEF1X方法。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型,不仅能得到优秀的业务功能和数据需求模型,而且可以实现从IDEF1X模型到数据库物理设计的转变。ERwin工具绘制的模型对应于逻辑模型和物理模型两种。在逻辑模型中,IDEF1X工具箱可以方便地用图形化的方式构建和绘制实体联系及实体的属性。在物理模型中,ERwin可以定义对应的表、列,并可针对各种数据库管理系统自动转换为适当的类型。
  设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后,设计人员可以使用Erwin画ER图,将ER图转换为关系数据模型,生成数据库结构;画数据流图,生成应用程序。
  二、数据库设计技巧
  1. 设计数据库之前(需求分析阶段)
  1) 理解客户需求,询问用户如何看待未来需求变化。让客户解释其需求,而且随着开发的继续,还要经常询问客户保证其需求仍然在开发的目的之中。
  2) 了解企业业务可以在以后的开发阶段节约大量的时间。
  3) 重视输入输出。
  在定义数据库表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪些是必要的表和字段。
  举例:假如客户需要一个报表按照邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。
  4) 创建数据字典和ER 图表
  ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。ER图对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。
  5) 定义标准的对象命名规范
  数据库各种对象的命名必须规范。
  2. 表和字段的设计(数据库逻辑设计)
  表设计原则
  1) 标准化和规范化
  数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。
  举例:某个存放客户及其有关定单的3NF 数据库就可能有两个表:Customer 和Order。Order 表不包含定单关联客户的任何信息,但表内
  会存放一个键值,该键指向Customer 表里包含该客户信息的那一行。
  事实上,为了效率的缘故,对表不进行标准化有时也是必要的。
  2) 数据驱动
  采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。
  举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
  3) 考虑各种变化
  在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。
  举例,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。
  字段设计原则
  4) 每个表中都应该添加的3 个有用的字段
  ??dRecordCreationDate,在VB 下默认是Now(),而在SQL Server 下默认为GETDATE()
  ??sRecordCreator,在SQL Server 下默认为NOT NULL DEFAULT USER
  ??nRecordVersion,记录的版本标记;有助于准确说明记录中出现null 数据或者丢失数据的原因
  5) 对地址和电话采用多个字段
  描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。
  6) 使用角色实体定义属于某类别的列
  在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化。
  举例:用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说,当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不过是改变两个表PERSON 和PERSON_TYPE 之间关系的键值,同时增加一个日期/时间字段来知道变化是何时发生的。这样,你的PERSON_TYPE 表就包含了所有PERSON 的可能类型,比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变PERSON 记录来反映新头衔的变化,不过这样一来在时间上无法跟踪个人所处位置的具体时间。
  7) 选择数字类型和文本类型尽量充足
  在SQL 中使用smallint 和tinyint 类型要特别小心。比如,假如想看看月销售总额,总额字段类型是smallint,那么,如果总额超过了$32,767 就不能进行计算操作了。
  而ID 类型的文本字段,比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。
  8) 增加删除标记字段
  在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。
  3. 选择键和索引(数据库逻辑设计)
  键选择原则:
  1) 键设计4 原则
  ??为关联字段创建外键。
  ??所有的键都必须唯一。
  ??避免使用复合键。
  ??外键总是关联唯一的键字段。
  2) 使用系统生成的主键
  设计数据库的时候采用系统生成的键作为主键,那么实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点:当拥有一致的键结构时,找到逻辑缺陷很容易。
  3) 不要用用户的键(不让主键具有可更新性)
  在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。
  4) 可选键有时可做主键
  把可选键进一步用做主键,可以拥有建立强大索引的能力。
  索引使用原则:
  索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。
  1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。
  2) 大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。
  3) 不要索引memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。
  4) 不要索引常用的小型表
  不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。
  4. 数据完整性设计(数据库逻辑设计)
  1) 完整性实现机制:
  实体完整性:主键
  参照完整性:
  父表中删除数据:级联删除;受限删除;置空值
  父表中插入数据:受限插入;递归插入
  父表中更新数据:级联更新;受限更新;置空值
  DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制
  用户定义完整性:
  NOT NULL;CHECK;触发器
  2) 用约束而非商务规则强制数据完整性
  采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。
  3) 强制指示完整性
  在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。
  4) 使用查找控制数据完整性
  控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。
  5) 采用视图
  为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。
  5. 其他设计技巧
  1) 避免使用触发器
  触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。
  2) 使用常用英语(或者其他任何语言)而不要使用编码
  在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。
  3) 保存常用信息
  让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。
  4) 包含版本机制
  在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。
  5) 编制文档
  对所有的快捷方式、命名规范、限制和函数都要编制文档。
  采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。
  对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。
  6) 测试、测试、反复测试
  建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。
  7) 检查设计
  在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。
  三、数据库命名规范
  1. 实体(表)的命名
  1) 表以名词或名词短语命名,确定表名是采用复数还是单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如果表的名字由3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成4 字母长的别名,其余依次类推)
  对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中,根据语义拼凑缩写即可。注意,由于ORCLE会将字段名称统一成大写或者小写中的一种,所以要求加上下划线。
  举例:
  定义的缩写 Sales: Sal 销售;
  Order: Ord 订单;
  Detail: Dtl 明细;
  则销售订单明细表命名为:Sal_Ord_Dtl;
  2) 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词。
  举例:
  定义的缩写 Material Ma 物品;
  物品表名为:Material, 而不是 Ma.
  但是字段物品编码则是:Ma_ID;而不是Material_ID
  3) 所有的存储值列表的表前面加上前缀Z
  目的是将这些值列表类排序在数据库最后。
  4) 所有的冗余类的命名(主要是累计表)前面加上前缀X
  冗余类是为了提高数据库效率,非规范化数据库的时候加入的字段或者表
  5) 关联类通过用下划线连接两个基本类之后,再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。
  关联表用于保存多对多关系。
  如果被关联的表名大于10个字母,必须将原来的表名的进行缩写。如果没有其他原因,建议都使用缩写。
  举例:表Object与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object;
  表 Depart和Employee;存在多对多的关系;则关联表命名为R_Dept_Emp
  2. 属性(列)的命名
  1) 采用有意义的列名,表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码,统一命名为:ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。
  举例:销售订单的编号字段命名:Sal_Ord_ID;如果还存在一个数据库生成的自动编号,则命名为:ID。
  2) 所有的属性加上有关类型的后缀,注意,如果还需要其它的后缀,都放在类型后缀之前。
  注: 数据类型是文本的字段,类型后缀TX可以不写。有些类型比较明显的字段,可以不写类型后缀。
  3) 采用前缀命名
  给每个表的列名都采用统一的前缀,那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来。
  3. 视图的命名
  1) 视图以V作为前缀,其他命名规则和表的命名类似;
  2) 命名应尽量体现各视图的功能。
  4. 触发器的命名
  触发器以TR作为前缀,触发器名为相应的表名加上后缀,Insert触发器加"_I",Delete触发器加"_D",Update触发器加"_U",如:
  TR_Customer_I,TR_Customer_D,TR_Customer_U。
  5. 存储过程名
  存储过程应以"UP_"开头,和系统的存储过程区分,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为"UP_Ins_Agent_Account"。
  6. 变量名
  变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。
  7. 命名中其他注意事项
  1)  以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。
  2)  数据对象、变量的命名都采用英文字符,禁止使用中文命名。绝对不要在对象名的字符之间留空格。
  3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突
  5) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。

 

SQL常用语句及其使用方法
SQL常用语句及其使用方法

在进行数据库操作时,无非就是添加、删除、修改,这得设计到一些常用的SQL语句:

SQL常用命令使用方法:

(1) 数据记录筛选:

sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"

sql="select * from 数据表 where 字段名 like %字段值% order by 字段名 [desc]"

sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"

sql="select * from 数据表 where 字段名 in (值1,值2,值3)"

sql="select * from 数据表 where 字段名 between 值1 and 值2"

(2) 更新数据记录:

sql="update 数据表 set 字段名=字段值 where 条件表达式"

sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

(3) 删除数据记录:

sql="delete from 数据表 where 条件表达式"

sql="delete from 数据表" (将数据表所有记录删除)

(4) 添加数据记录:

sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"

sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)

(5) 数据记录统计函数:

AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加

引用以上函数的方法:

sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)

用 rs("别名") 获取统的计值,其它函数运用同上。

(5) 数据表的建立和删除:

CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

例:CREATE TABLE tab01(name varchar(50),datetime default now())

DROP TABLE 数据表名称 (永久性删除一个数据表)

 

sqlserver有用函数
sqlserver有用函数
使用指定的替换值替换 NULL。
语法
ISNULL ( check_expression , replacement_value )
参数
check_expression
将被检查是否为 NULL的表达式。check_expression 可以是任何类型的。
replacement_value
在 check_expression 为 NULL时将返回的表达式。replacement_value 必须与 check_expresssion 具有相同的类型。
返回类型
返回与 check_expression 相同的类型。
注释
如果 check_expression 不为 NULL,那么返回该表达式的值;否则返回 replacement_value。
示例
A. 将 ISNULL 与 AVG 一起使用
下面的示例查找所有书的平均价格,用值 $10.00 替换 titles 表的 price 列中的所有 NULL 条目。
USE pubs
GO
SELECT AVG(ISNULL(price, $10.00))
FROM titles
GO
下面是结果集:
--------------------------
14.24
(1 row(s) affected)
B. 使用 ISNULL
下面的示例为 titles 表中的所有书选择书名、类型及价格。如果一个书名的价格是 NULL,那么在结果集中显示的价格为 0.00。
USE pubs
GO
SELECT SUBSTRING(title, 1, 15) AS Title, type AS Type,
   ISNULL(price, 0.00) AS Price
FROM titles
GO
下面是结果集:
Title           Type         Price
--------------- ------------ --------------------------
The Busy Execut business     19.99
Cooking with Co business     11.95
You Can Combat  business     2.99
Straight Talk A business     19.99
Silicon Valley  mod_cook     19.99
The Gourmet Mic mod_cook     2.99
The Psychology  UNDECIDED    0.00
But Is It User  popular_comp 22.95
Secrets of Sili popular_comp 20.00
Net Etiquette   popular_comp 0.00
Computer Phobic psychology   21.59
Is Anger the En psychology   10.95
Life Without Fe psychology   7.00
Prolonged Data  psychology   19.99
Emotional Secur psychology   7.99
Onions, Leeks,  trad_cook    20.95
Fifty Years in  trad_cook    11.95
Sushi, Anyone?  trad_cook    14.99
(18 row(s) affected)

 

SQLServer基本函数
1.字符串函数 
长度与分析用 
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 
substring(expression,start,length) 不多说了,取子串 
right(char_expr,int_expr) 返回字符串右边int_expr个字符 
字符操作类 
upper(char_expr) 转为大写 
lower(char_expr) 转为小写 
space(int_expr) 生成int_expr个空格 
replicate(char_expr,int_expr)复制字符串int_expr次 
reverse(char_expr) 反转字符串 
stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从 
start开始的length个字符用char_expr2代替 
ltrim(char_expr) rtrim(char_expr) 取掉空格 

ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符 

字符串查找 
charindex(char_expr,expression) 返回char_expr的起始位置 
patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0 

2.数学函数 
abs(numeric_expr) 求绝对值 
ceiling(numeric_expr) 取大于等于指定值的最小整数 
exp(float_expr) 取指数 
floor(numeric_expr) 小于等于指定值得最大整数 
pi() 3.1415926......... 
power(numeric_expr,power) 返回power次方 
rand([int_expr]) 随机数产生器 
round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入 
sign(int_expr) 根据正数,0,负数,,返回+1,0,-1 
sqrt(float_expr) 平方根 

3.日期函数 
getdate() 返回日期 
datename(datepart,date_expr) 返回名称如 June 
datepart(datepart,date_expr) 取日期一部份 
datediff(datepart,date_expr1.dateexpr2) 日期差 
dateadd(datepart,number,date_expr) 返回日期加上 number 
上述函数中datepart的 
写法 取值和意义 
yy 1753-9999 年份 
qq 1-4 刻 
mm 1-12 月 
dy 1-366 日 
dd 1-31 日 
wk 1-54 周 
dw 1-7 周几 
hh 0-23 小时 
mi 0-59 分钟 
ss 0-59 秒 
ms 0-999 毫秒 

日期转换 
convert() 
 
4.系统函数 
suser_name() 用户登录名 
user_name() 用户在数据库中的名字 
user 用户在数据库中的名字 
show_role() 对当前用户起作用的规则 

db_name() 数据库名 
object_name(obj_id) 数据库对象名 
col_name(obj_id,col_id) 列名 
col_length(objname,colname) 列长度 
valid_name(char_expr) 是否是有效标识符


SQL Server中Case 的不同用法
CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。
首先让我们看一下 CASE 的语法。在一般的 SELECT 中,其语法如下:
SELECT <myColumnSpec> =
CASE
WHEN <A> THEN <somethingA>
WHEN <B> THEN <somethingB>
ELSE <somethingE>
END 
在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:
USE pubs
GO
SELECT
    Title,
    'Price Range' =
    CASE
        WHEN price IS NULL THEN 'Unpriced'
        WHEN price < 10 THEN 'Bargain'
        WHEN price BETWEEN 10 and 20 THEN 'Average'
        ELSE 'Gift to impress relatives'
    END
FROM titles
ORDER BY price
GO 
这是 CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE:
SELECT 'Number of Titles', Count(*)
FROM titles
GROUP BY
    CASE
        WHEN price IS NULL THEN 'Unpriced'
        WHEN price < 10 THEN 'Bargain'
        WHEN price BETWEEN 10 and 20 THEN 'Average'
        ELSE 'Gift to impress relatives'
    END
GO 
你甚至还可以组合这些选项,添加一个 ORDER BY 子句,如下所示:
USE pubs
GO
SELECT
    CASE
        WHEN price IS NULL THEN 'Unpriced'
        WHEN price < 10 THEN 'Bargain'
        WHEN price BETWEEN 10 and 20 THEN 'Average'
        ELSE 'Gift to impress relatives'
    END AS Range,
    Title
FROM titles
GROUP BY
    CASE
        WHEN price IS NULL THEN 'Unpriced'
        WHEN price < 10 THEN 'Bargain'
        WHEN price BETWEEN 10 and 20 THEN 'Average'
        ELSE 'Gift to impress relatives'
    END,
    Title
ORDER BY
    CASE
        WHEN price IS NULL THEN 'Unpriced'
        WHEN price < 10 THEN 'Bargain'
        WHEN price BETWEEN 10 and 20 THEN 'Average'
        ELSE 'Gift to impress relatives'
    END,
    Title
GO 
注意,为了在 GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。
除了选择自定义字段之外,在很多情况下 CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。


SQL SERVER基本语法参考
一、资料定义 ddl(data definition language)
资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。

1、建表格:
create table table_name(
column1 datatype [not null] [not null primary key],
column2 datatype [not null],
...)
说明: 
datatype --是资料的格式,详见表。
nut null --可不可以允许资料有空的(尚未有资料填入)。
primary key --是本表的主键。

2、更改表格 
alter table table_name
add column column_name datatype
说明:增加一个栏位(没有删除某个栏位的语法。
alter table table_name
add primary key (column_name)
说明:更改表得的定义把某个栏位设为主键。
alter table table_name
drop primary key (column_name)
说明:把主键的定义删除。

3、建立索引 
create index index_name on table_name (column_name)
说明:对某个表格的栏位建立索引以增加查询时的速度。

4、删除 
drop table_name
drop index_name

二、的资料形态 datatypes
smallint
16 位元的整数。
interger
32 位元的整数。
decimal(p,s)
p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数
点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float
32位元的实数。
double
64位元的实数。
char(n)
n 长度的字串,n不能超过 254。
varchar(n)
长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)
和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为
了支援两个字元长度的字体,例如中文字。
vargraphic(n)
可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date
包含了 年份、月份、日期。
time
包含了 小时、分钟、秒。
timestamp
包含了 年、月、日、时、分、秒、千分之一秒。

三、资料操作 dml (data manipulation language)
资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法:

1、增加资料:
insert into table_name (column1,column2,...)
values ( value1,value2, ...)
说明:
1.若没有指定column 系统则会按表格内的栏位顺序填入资料。
2.栏位的资料形态和所填入的资料必须吻合。
3.table_name 也可以是景观 view_name。

insert into table_name (column1,column2,...)
select columnx,columny,... from another_table
说明:也可以经过一个子查询(subquery)把别的表格的资料填入。

2、查询资料:
基本查询
select column1,columns2,...
from table_name
说明:把table_name 的特定栏位资料全部列出来
select *
from table_name
where column1 = ***
[and column2 > yyy] [or column3 <> zzz]
说明:
1.'*'表示全部的栏位都列出来。
2.where 之後是接条件式,把符合条件的资料列出来。

select column1,column2
from table_name
order by column2 [desc]
说明:order by 是指定以某个栏位做排序,[desc]是指从大到小排列,若没有指明,则是从小到大
排列

组合查询
组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的
表格才能够得到结果的。
select *
from table1,table2
where table1.colum1=table2.column1
说明:
1.查询两个表格中其中 column1 值相同的资料。
2.当然两个表格相互比较的栏位,其资料形态必须相同。
3.一个复杂的查询其动用到的表格可能会很多个。

整合性的查询:
select count (*)
from table_name
where column_name = ***
说明:
查询符合条件的资料共有几笔。
select sum(column1)
from table_name
说明:
1.计算出总和,所选的栏位必须是可数的数字形态。
2.除此以外还有 avg() 是计算平均、max()、min()计算最大最小值的整合性查询。
select column1,avg(column2)
from table_name
group by column1
having avg(column2) > ***
说明:
1.group by: 以column1 为一组计算 column2 的平均值必须和 avg、sum等整合性查询的关键字
一起使用。
2.having : 必须和 group by 一起使用作为整合性的限制。

复合性的查询
select *
from table_name1
where exists (
select *<BR>from table_name2
where conditions )
说明:
1.where 的 conditions 可以是另外一个的 query。
2.exists 在此是指存在与否。
select *
from table_name1
where column1 in (
select column1
from table_name2
where conditions )
说明: 
1. in 後面接的是一个集合,表示column1 存在集合里面。
2. select 出来的资料形态必须符合 column1。


其他查询
select *
from table_name1
where column1 like 'x%'
说明:like 必须和後面的'x%' 相呼应表示以 x为开头的字串。
select *
from table_name1
where column1 in ('***','yyy',..)
说明:in 後面接的是一个集合,表示column1 存在集合里面。
select *
from table_name1
where column1 between xx and yy
说明:between 表示 column1 的值介於 xx 和 yy 之间。

3、更改资料:
update table_name
set column1='***'
where conditoins
说明:
1.更改某个栏位设定其值为'***'。
2.conditions 是所要符合的条件、若没有 where 则整个 table 的那个栏位都会全部被更改。

4、删除资料:
delete from table_name
where conditions
说明:删除符合条件的资料。

说明:关于where条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下:
(1)如果是access数据库,则为:where mydate>#2000-01-01#
(2)如果是oracle数据库,则为:where mydate>cast('2000-01-01' as date)
或:where mydate>to_date('2000-01-01','yyyy-mm-dd')
在delphi中写成:
thedate='2000-01-01';
query1.sql.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)');

如果比较日期时间型,则为:
where mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')

 


SQL Server 中易混淆的数据类型
近来在做数据库设计,有时候真弄不清SQL2000里的数据类型,所以摘了这篇文章。
  (1)char、varchar、text和nchar、nvarchar、ntext
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
  后面三种数据类型和前面的相比,从名称上看只是多了个字母"n",它表示存储的是Unicode数据类型的字符。写过程序的朋友对Unicode应该很了解。字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较:nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
  (2)datetime和smalldatetime
datetime:从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之三秒。
smalldatetime:从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟。
  (3)bitint、int、smallint、tinyint和bit
bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据。
int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据。
smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据。
tinyint:从0到255的整数数据。
bit:1或0的整数数据。
  (4)decimal和numeric
这两种数据类型是等效的。都有两个参数:p(精度)和s(小数位数)。p指定小数点左边和右边可以存储的十进制数字的最大个数,p必须是从 1到38之间的值。s指定小数点右边可以存储的十进制数字的最大个数,s必须是从0到p之间的值,默认小数位数是0。
  (5)float和real
float:从-1.79^308到1.79^308之间的浮点数字数据。
real:从-3.40^38到3.40^38之间的浮点数字数据。在SQL Server中,real的同义词为float(24)。

 

MYSQL数据库初学者使用指南
有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。
  一、连接MYSQL。
格式:

mysql -h主机地址
-u用户名
-p用户密码
 
 
  1、例1:连接到本机上的MYSQL。
  首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:

mysql>
 

  2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

mysql -h110.110.110.110 -uroot -pabcd123
(注:u与root可以不用加空格,其它也一样)
 
 
  3、退出MYSQL命令:

exit (回车)
 
 
  二、修改密码。
  格式:mysqladmin -u用户名 -p旧密码 password 新密码
  1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令

mysqladmin -uroot -password ab12
 
 
  注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
  2、例2:再将root的密码改为djg345。

mysqladmin -uroot -pab12 password djg345
 

  三、增加新用户。(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
  格式:

grant select on 数据库.* to 用户名@登录主机 identified by "密码"
 
 
  例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:

grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
 
 
  但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台计算机上登录你的mysql数据库并对你的资料可以为所欲为了,解决办法见例2。
  例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。

grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
 

  如果你不想test2有密码,可以再打一个命令将密码消掉。

grant select,insert,update,delete on mydb.* to test2@localhost identified by "";
 
 
  在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。 一、操作技巧 1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。 2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是:
mysql-3.23.27-beta-win。
 

  四、显示命令
  1、显示数据库列表。
  show databases;
  刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
  2、显示库中的资料表:
  use mysql; //打开库,学过FOXBASE的一定不会陌生吧
  show tables;
  3、显示资料表的结构:
  describe 表名;
  4、建库:
  create database 库名;
  5、建表:
  use 库名;
  create table 表名 (字段设定列表);
  6、删库和删表:
  drop database 库名;
  drop table 表名;
  7、将表中记录清空:
  delete from 表名;
  8、显示表中的记录:
  select * from 表名;
  五、一个建库和建表以及插入数据的实例
drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default 深圳,
year date
); //建表结束
//以下为插入字段
insert into teacher valuess(,glchengang,深圳一中,1976-10-10);
insert into teacher valuess(,jack,深圳一中,1975-12-23);
  注:在建表中(1)将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key(2)将NAME设为长度为10的字符字段(3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。varchar和char有什么区别呢,只有等以后的文章再说了。 (4)将YEAR设为日期字段。
  如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:下,并在DOS状态进入目录mysqlbin,然后键入以下命令:
  mysql -uroot -p密码 < c:school.sql
  如果成功,空出一行无任何显示;如有错误,会有提示。(以上命令已经调试,你只要将//的注释去掉即可使用)。
  六、将文本资料转到数据库中
  1、文本资料应符合的格式:字段资料之间用tab键隔开,null值用n来代替.
  例:
  3 rose 深圳二中 1976-10-10
  4 mike 深圳一中 1975-12-23
  2、数据传入命令 load data local infile "文件名" into table 表名;
  注意:你最好将文件复制到mysqlbin目录下,并且要先用use命令打表所在的库 。
  七、备份数据库:(命令在DOS的mysqlbin目录下执行)
  mysqldump --opt school>school.bbb
  注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
  后记:其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异,您最好找本将SQL的书看看。我在这里只介绍一些基本的,其实我也就只懂这些了,呵呵。最好的MYSQL教程还是“晏子“译的“MYSQL中文参考手册“不仅免费每个相关网站都有下载,而且它是最权威的。可惜不是象"PHP4中文手册"那样是chm的格式,在查找函数命令的时候不太方便


自学ing..Ajax循序渐近
好久没来写东西了,不是没空就是懒得动笔,今天正好有空,写一写吧!!
都说Ajax是好东西,看了google新东东一个个推出,发现还真是个好东西啊,赶快自学!!高手有路过麻烦留言啊!!
创建异步请求的对象:
对于不同浏览器有不同实现
以下方法可以根据不同的浏览器返回不同的实例:
function getRequestByBrowser(){
  var result;
  if (window.XMLHttpRequest) {  // 如果为Mozilla等浏览器
    // 为Mozilla等浏览器创建适用的的实例
    result = new XMLHttpRequest();
  } else if (window.ActiveXObject) {  // 如果是IE
    var ieReqs = ["MSXML3", "MSXML2", "Microsoft"]
    for (var i = 0; i < ieReqs.length; ++ i) {
      try {
        result= new ActiveXObject(ieReqs[i] + ".XMLHTTP")
      } catch (e) {
        continue;
      }
      break;
    }
  }
  // 如果以上创建方法都不能成功创建实例,则给出一个提示
  if (typeof result == "undefined"){
      alert("妖怪,你用的是什么浏览器?");
  }
  return result;
}
这里是对所返回的对象的详细分析:
首先分析这个request的几种常用方法:
abort()
中止当前的请求
getAllResponseHeaders()
以字符串形式返回headers
getResponseHeader("header")
以字符串形式返回某个header值
open("method", "URL"[, async[, "userName"[, "password"]]])
设置未决的请求的目标 URL, 方法, 和其他参数
method - 请求方法如GET、POST
URL- 请求的url
async - 是否异步true|false
userName、password - 偶暂时还不知道具体用处,省略先~~
[ ]包含的都可省略
send(content)
发送请求:具体content的要求暂时不清楚,只知道GET时为null,POST时需要,确认前留空先~~
setRequestHeader("label", "value")
设置header并和请求一起发送:这个应该不用解释了吧...
 
然后了解一下属性:
onreadystatechange
该属性是状态改变的事件触发器
readyState
对象状态(integer型),包含以下几种情况:
0 = 未初始化
1 = 读取中
2 = 已读取
3 = 交互中
4 = 完成
responseText  服务器进程返回数据的文本版本
responseXML  服务器进程返回数据的兼容DOM的XML文档对象
status  服务器返回的状态码, 如:404 = "文件末找到" 、200 ="成功"
statusText  服务器返回的状态文本信息

然后看看调用代码:
var url = "http://www.csdn.net";
var handlerCallback = getTextCompleteHandler(request, callback);
request.onreadystatechange = handlerCallback;
request.open("GET", url, true);
request.send(null);
再看看回调代码:
function getTextCompleteHandler(req, processFunction) {
  // 返回一个监听request实例的匿名函数
  return function () {
    // 如果请求的状态是“完成”
    if (req.readyState == 4) {
      // 如果已经成功接收了服务器响应
      if (req.status == 200) {
        // 一切正常,取出响应的文本,交给处理函数
        processFunction(req.responseText);
      } else {
        // 异常的http响应
        alert("HTTP error: " + req.status);
      }
    }
  }
}
接下来就太太太太简单了
只需要写一个callback就可以开始工作了!
function callback(str){
  alert(str);
}
理一下流程先:
调用函数是这样的:
var handlerCallback = getTextCompleteHandler(request, callback);
也就是用request和最终期望调用的处理实际业务逻辑的函数名作为参数,让getTextCompleteHandler自动生成一个函数handlerCallback
而这个handlerCallback接着被以下代码作为回调参数:
request.onreadystatechange = handlerCallback;
至此开始,每当request出现状态的改变,都会去的调用一次这个被自动生成的handlerCallback函数,而我们可以从这个函数的定义了解到,它只是用来简单的判断request的运行状态,在执行完毕并且返回的响应也为正常(200)时,拿出返回的Text对象,交给实现定义好的执行函数(本例中就是callback),如下:
processFunction(req.responseText);
这个时候,callback就被调用了,这个处理函数就可以用来解析获得的text,并且对document对象做适当的修改,本例没有做逻辑,只是简单的alert出来而已
整理后的代码基本上象这样!测一下吧!
<html>
  <head>
    <script>
function getRequestByBrowser(){
  var result;
  if (window.XMLHttpRequest){
    result= new XMLHttpRequest();
  } else if (window.ActiveXObject){
    var ieReqs = ["MSXML3", "MSXML2", "Microsoft"]
    for (var i = 0; i < ieReqs.length; ++ i) {
      try {
        result= new ActiveXObject(ieReqs[i] + ".XMLHTTP")
      } catch (e) {
        continue;
      }
      break;
    }
  }
  if (typeof result == "undefined"){
      alert("浏览器不支持哦!你的操作将被取消!");
  }
  return result;
}
function doAction(){
        var request = false;
        request = getRequestByBrowser();
        if (!request) {
                return;
        }
        var url = "#任意可以访问的网址#";
        var handlerCallback = getTextCompleteHandler(request, callback);
        request.onreadystatechange = handlerCallback;
        request.open("GET", url, true);
        request.send(null);
}
function getTextCompleteHandler(req, processFunction) {
  return function () {
    if (req.readyState == 4) {
      if (req.status == 200) {
        processFunction(req.responseText);
      } else {
        alert("出现HTTP错误,错误号为: " + req.status);
      }
    }
  }
}
function callback(str){
  alert(str);
}

    </script>
  </head>
  <body>
    我的第一个Ajax的HelloWorld!<br/>
    <div>
      <a href="javascript:doAction();" >Click Here</a>
    </div>
  </body>
</html>
用这些代码在本地新建一个htm文件,打开(XP-sp2的话记得先点掉限制提示),点链接...
沉默数秒(取决与服务器的处理速度与响应包含数据的大小)后,将会看到一个硕大无比的alert框....看看代码,url指定网址的html源码码哦!!
注意:完整和规范的Ajax应用中getTextCompleteHandler应该被替换成getXmlCompleteHandler实现,由回掉的函数获取一个XML的DOM对象来处理数据及页面表现。Text一般适合用在返回的数据比较少或应用十分简单时。
 
 


使用JavaScript操作XML數據据
使用JavaScript操作XML數據据 - -
                                      
<script language="JavaScript">
<!--
var doc = new ActiveXObject("Msxml2.DOMDocument"); //ie5.5+,CreateObject("Microsoft.XMLDOM")

//加载文档
//doc.load("b.xml");
//创建文件头
var p = doc.createProcessingInstruction("xml","version='1.0' encoding='gb2312'");
//添加文件头
doc.appendChild(p);
//用于直接加载时获得根接点
//var root = doc.documentElement;
//两种方式创建根接点
// var root = doc.createElement("students");
var root = doc.createNode(1,"students","");
//创建子接点
var n = doc.createNode(1,"ttyp","");
//指定子接点文本
//n.text = " this is a test";
//创建孙接点
var o = doc.createElement("sex");
o.text = "男"; //指定其文本
//创建属性
var r = doc.createAttribute("id");
r.value="test";
//添加属性
n.setAttributeNode(r);
//创建第二个属性
var r1 = doc.createAttribute("class");
r1.value="tt";
//添加属性
n.setAttributeNode(r1);
//删除第二个属性
n.removeAttribute("class");
//添加孙接点
n.appendChild(o);
//添加文本接点
n.appendChild(doc.createTextNode("this is a text node."));
//添加注释
n.appendChild(doc.createComment("this is a comment/n"));
//添加子接点
root.appendChild(n);
//复制接点
var m = n.cloneNode(true);
root.appendChild(m);
//删除接点
root.removeChild(root.childNodes(0));
//创建数据段
var c = doc.createCDATASection("this is a cdata");
c.text = "hi,cdata";
//添加数据段
root.appendChild(c);
//添加根接点
doc.appendChild(root);
//查找接点
var a = doc.getElementsByTagName("ttyp");
//var a = doc.selectNodes("//ttyp");
//显示改接点的属性
for(var i= 0;i<a.length;i++)
{
alert(a[i].xml);
for(var j=0;j<a[i].attributes.length;j++)
{
alert(a[i].attributes[j].name);
}
}
//XML保存(需要在服务端,客户端用FSO)
//doc.save();
//查看根接点XML
if(n)
{
alert(n.ownerDocument.xml);
}
//-->
</script>

 

如何通过javascript给.net传参量
javascript是运行在客户端的,通过javascript可以得到客户端屏幕的分辨率,鼠标位置等信息,那么怎样才可以将这些信息传给服务端的控件,并让服务端做相应的响应呢,现
在能想到的办法大概就是通过HtmlControls做中介。
下面给出一个简单的例子。
取得客户端的鼠标坐标并反馈到服务器端
前台代码:
<%@ Page language="c#" Codebehind="mouseXY.aspx.cs" AutoEventWireup="false" Inherits="CommonFunction.mouseXY" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
 <HEAD>
  <title>mouseXY</title>
  <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
  <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 document.onmousemove()
        {
          document.all("txtbox").value = event.screenX + "x" + event.screenY;
        }
  </script>
 </HEAD>
 <body MS_POSITIONING="GridLayout">
  <form id="mouseXY" method="post" runat="server">
   <input id="txtbox" type="hidden" name="txtbox" runat="server">
   <asp:TextBox id="txtXY" style="Z-INDEX: 101; LEFT: 358px; POSITION: absolute; TOP: 85px" runat="server"></asp:TextBox>
   <asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 269px; POSITION: absolute; TOP: 89px" runat="server">鼠标坐标:</asp:Label>
   <asp:Button id="btnGet" style="Z-INDEX: 103; LEFT: 282px; POSITION: absolute; TOP: 139px" runat="server" Text="获取当前客户端鼠标坐标"></asp:Button>
  </form>
 </body>
</HTML>
后台代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace CommonFunction
{
 /// <summary>
 /// mouseXY 的摘要说明。
 /// </summary>
 public class mouseXY : System.Web.UI.Page
 {
  protected System.Web.UI.HtmlControls.HtmlInputHidden txtbox;
  protected System.Web.UI.WebControls.Label Label1;
  protected System.Web.UI.WebControls.Button btnGet;
  protected System.Web.UI.WebControls.TextBox txtXY;
 
  private void Page_Load(object sender, System.EventArgs e)
  {
  
  }
  #region Web Form Designer generated code
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
   //
   InitializeComponent();
   base.OnInit(e);
  }
 
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {   
   this.btnGet.Click += new System.EventHandler(this.btnGet_Click);
   this.Load += new System.EventHandler(this.Page_Load);
  }
  #endregion
  private void btnGet_Click(object sender, System.EventArgs e)
  {
   txtXY.Text = txtbox.Value;
  }

 }
}
 


JavaScript语言
JavaScript语言的前身叫作Livescript。自从Sun公司推出著名的Java语言之后,Netscape公司引进了Sun公司有关Java的程序概念,将自己原有的Livescript 重新进行设计,并改名为JavaScript。

   JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,有了JavaScript,可使网页变得生动。使用它的目的是与HTML超文本标识语言、Java 脚本语言一起实现在一个网页中链接多个对象,与网络客户交互作用,从而可以开发客户端的应用程序。它是通过嵌入或调入在标准的HTML语言中实现的。

   JavaScript具有很多优点:
   1.简单性  JavaScript是一种脚本编写语言,它采用小程序段的方式实现编程,像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个简易的开发过程。它的基本结构形式与C、C++、VB、Delphi十分类似。但它不像这些语言一样,需要先编译,而是在程序运行过程中被逐行地解释。它与HTML标识结合在一起,从而方便用户的使用操作。

   2.动态性  JavaScript是动态的,它可以直接对用户或客户输入做出响应,无须经过Web服务程序。它对用户的反映响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页中执行了某种操作所产生的动作,就称为“事件”。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。

   3.跨平台性  JavaScript是依赖于浏览器本身,与操作环境无关,只要能运行浏览器的计算机,并支持JavaScript的浏览器就可以正确执行。

   4.节省CGI的交互时间  随着WWW的迅速发展有许WWW服务器提供的服务要与浏览者进行交流,确浏览的身份、需服务的内等等,这项工作通常由CGI/PERL编写相应的接口程序与用户进行交互来完成。很显然,通过网络与用户的交互过程一方面增大了网络的通信量,另一方面影响了服务器的服务性能。服务器为一个用户运行一个CGI时,需要一个进程为它服务,它要占用服务器的资源(如CPU服务、内存耗费等),如果用户填表出现错误,交互服务占用的时间就会相应增加。被访问的热点主机与用户交互越多,服务器的性能影响就越大。

   JavaScript是一种基于客户端浏览器的语言,用户在浏览中填表、验证的交互过程只是通过浏览器对调入HTML文档中的JavaScript源代码进行解释执行来完成的,即使是必须调用CGI的部分,浏览器只将用户输入验证后的信息提交给远程的服务器,大大减少了服务器的开销
JavaScript语言和Java语言是相关的,但它们之间的联系并不像想象中的那样紧密。

   二者的区别体现在:
   首先,它们是两个公司开发的不同的两个产品,Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是Netscape公司的产品,其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言。

   其次,JavaScript是基于对象的,而Java是面向对象的,即Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象。JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象和事件驱动的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用。

   第三,两种语言在其浏览器中所执行的方式不一样。Java的源代码在传递到客户端执行之前,必须经过编译,因而客户端上必须具有相应平台上的仿真器或解释器,它可以通过编译器或解释器实现独立于某个特定的平台编译代码的束缚。JavaScript是一种解释性编程语言,其源代码在发往客户端执行之前不需经过编译,而是将文本格式的字符代码发送给客户,由浏览器解释执行。

   第四,两种语言所采取的变量是不一样的。Java采用强类型变量检查,即所有变量在编译之前必须作声明。JavaScript中变量声明,采用其弱类型。即变量在使用前不需作声明,而是解释器在运行时检查其数据类型。

   第五,代码格式不一样。Java是一种与HTML无关的格式,必须通过像HTML中引用外媒体那么进行装载,其代码以字节代码的形式保存在独立的文档中。JavaScript的代码是一种文本字符格式,可以直接嵌入HTML文档中,并且可动态装载。编写HTML文档就像编辑文本文件一样方便。

   第六,嵌入方式不一样。在HTML文档中,两种编程语言的标识不同,JavaScript使用 <script>...</script> 来标识,而Java使用<applet> ... </applet>来标识。

   第七,静态绑定和动态绑定。Java采用静态联编,即Java的对象引用必须在编译时的进行,以使编译器能够实现强类型检查。JavaScript采用动态联编,即JavaScript的对象引用在运行时进行检查,如不经编译则就无法实现对象引用的检查。
 在目前流行的浏览器中,Netscape公司的Navigator 2.0以上版本的浏览器具都有处理JavaScript源代码的能力。JavaScript在其中实现了它的1.0版本,并在后来的Navigator 3.0实现了它的1.1版本,在现在推出的Navigator 4.0(Communicator)中,JavaScript在其中实现了它的1.2版本。

  微软公司从它的Internet Explorer 3.0版开始支持JavaScript。Microsoft把自己实现的JavaScript规范叫做JScript。这个规范与Netscape Navigator浏览器中的JavaScript规范在基本功能上和语法上是一致的,但是在个别的对象实现方面还有一定的差别,这里特别需要予以注意。
JavaScript 有六种数据类型。主要的类型有 number、string、object 以及 Boolean 类型,其他两种类型为 null 和 undefined。

   String 字符串类型:字符串是用单引号或双引号来说明的。(使用单引号来输入包含引号的字符串。)如:“The cow jumped over the moon.”

   数值数据类型:JavaScript 支持整数和浮点数。整数可以为正数、0 或者负数;浮点数可以包含小数点、也可以包含一个 “e”(大小写均可,在科学记数法中表示“10的幂”)、或者同时包含这两项。

  Boolean 类型:可能的 Boolean 值有 true 和 false。这是两个特殊值,不能用作 1 和 0。

  Undefined 数据类型:一个为 undefined 的值就是指在变量被创建后,但未给该变量赋值以前所具有的值。

  Null 数据类型:null 值就是没有任何值,什么也不表示。

  object类型:除了上面提到的各种常用类型外,对象也是JavaScript中的重要组成部分,这部分将在后面章节详细介绍。

  在 JavaScript 中变量用来存放脚本中的值,这样在需要用这个值的地方就可以用变量来代表,一个变量可以是一个数字,文本或其它一些东西。

   JavaScript是一种对数据类型变量要求不太严格的语言,所以不必声明每一个变量的类型,变量声明尽管不是必须的,但在使用变量之前先进行声明是一种好的习惯。可以使用 var 语句来进行变量声明。如:var men = true; // men 中存储的值为 Boolean 类型。

  变量命名:JavaScript 是一种区分大小写的语言,因此将一个变量命名为 computer 和将其命名为 Computer是不一样的。
  另外,变量名称的长度是任意的,但必须遵循以下规则:
   1.第一个字符必须是一个字母(大小写均可)、或一个下划线(_)或一个美元符 ($)。
   2.后续的字符可以是字母、数字、下划线或美元符。
   3.变量名称不能是保留字。

JavaScript所提供的语句分为以下几大类:
   1.变量声明,赋值语句:var。
   语法如下: var 变量名称 [=初始值]
   例:var computer = 32 //定义computer是一个变量,且有初值为32。

   2.函数定义语句:function,return。
   语法如下: function 函数名称 (函数所带的参数)
        {
          函数执行部分
         }

         return 表达式 //return语句指明将返回的值。
   例:function square ( x )
     {
       return x*x
      }

   3.条件和分支语句:if...else,switch。
     if...else语句完成了程序流程块中分支功能:如果其中的条件成立,则程序执行紧接着条件的语句或语句块;否则程序执行else中的语句或语句块。     语法如下: if (条件)
         {
            执行语句1
          }else{
            执行语句2
          }
     例:if (result == true)
        {
          response = “你答对了!”
         }else{
          response = “你错了!”
         }

   分支语句switch可以根据一个变量的不同取值采取不同的处理方法。
   语法如下: switch (expression)
        {
         case label1: 语句串1;
         case label2: 语句串2;
         case label3: 语句串3;
            ...
         default: 语句串3;
        }
   如果表达式取的值同程序中提供的任何一条语句都不匹配,将执行default 中的语句。

   4. 循环语句:for, for...in,while,break,continue。
     for语句的语法如下: for (初始化部分;条件部分;更新部分)
               {
                 执行部分...
                }
     只要循环的条件成立,循环体就被反复的执行。
     for...in语句与for语句有一点不同,它循环的范围是一个对象所有的属性或是一个数组的所有元素。

     for...in语句的语法如下: for (变量 in 对象或数组)
                 {
                   语句...
                  }

     while语句所控制的循环不断的测试条件,如果条件始终成立,则一直循环,直到条件不再成立。
     语法如下: while (条件)
           {
             执行语句...
            }

     break语句结束当前的各种循环,并执行循环的下一条语句。

     continue语句结束当前的循环,并马上开始下一个循环。

   5.对象操作语句:with,this,new。
    with语句的语法如下:
             with (对象名称){
                      执行语句
                     }
    作用是这样的:如果你想使用某个对象的许多属性或方法时,只要在with语句的()中写出这个对象的名称,然后在下面的执行语句中直接写这个对象的属性名或方法名就可以了。

    new语句是一种对象构造器,可以用new语句来定义一个新对象。
     语法是这样的:新对象名称= new 真正的对象名
     譬如说,我们可以这样定义一个新的日期对象: var curr= new Date(),然后,变量curr就具有了Date对象的属性。

    this运算符总是指向当前的对象。

   6.注释语句://,/*...*/。
    //这是单行注释
    /*这可以多行注释.... */

在JavaScript中是基于对象的编程,而不是完全的面向对象的编程。
   
   那麽什麽是对象呢?如果你学过一些VB的编程,对这个名词一定不会陌生。通俗的说,对象是变量的集合体,对象提供对于数据的一致的组织手段,描述了一类事物的共同属性。

   在JavaScript中,可以使用以下几种对象:
    1.由浏览器根据web页面的内容自动提供的对象。
    2.JavaScript的内置对象,如Date,Math等。
    3.服务器上的固有对象。
    4.用户自定义的对象。

   JavaScript中的对象是由属性和方法两个基本的元素的构成的。对象的属性是指对象的背景色,长度,名称等。对象的方法是指对属性所进行的操作,就是一个对象自己所属的函数,如对对象取整,使对象获得焦点,使对象获得个随机数等等一系列操作。

   举个例子来说,将汽车看成是一个对象,汽车的颜色,大小,品牌等叫做属性,而发动,刹车,拐弯等就叫做方法。

   可以采用这样的方法来访问对象的属性:对象名称.属性名称,例:mycomputer.year=1996,mycomputer.owner = “me”。

   可以采用这样的方法,将对象的方法同函数联系起来:对象.方法名字=函数名字或对象.属性.方法名,例:this.display=display,document.writeln(“this is method”)。

   多看或多写一些程序,就会理解对象的方法和属性的含义了!各个对象的各种属性和方法,可点击参考!

事件是浏览器响应用户交互操作的一种机制,JavaScript的事件处理机制可以改变浏览器响应用户操作的方式,这样就开发出具有交互性,并易于使用的网页。

  浏览器为了响应某个事件而进行的处理过程,叫做事件处理。

  事件定义了用户与页面交互时产生的各种操作,例如单击超级连接或按钮时,就产生一个单击(click)操作事件。浏览器在程序运行的大部分时间都等待交互事件的发生,并在事件发生时,自动调用事件处理函数,完成事件处理过程。

  事件不仅可以在用户交互过程中产生,而且浏览器自己的一些动作也可以产生事件,例:当载入一个页面时,就会发生load事件,卸载一个页面时,就会发生unload事件等。

  归纳起来,必需使用的事件有三大类:
   1.引起页面之间跳转的事件,主要是超连接事件。
   2.事件浏览器自己引起的事件。
   3.事件在表单内部同界面对象的交互。

  各种JavaScript的事件可点这里参考。
  

javascript事件查询综合
javascript事件查询综合
click() 对象.click() 使对象被点击。
closed 对象.closed 对象窗口是否已关闭true/false
clearTimeout(对象) 清除已设置的setTimeout对象
clearInterval(对象) 清除已设置的setInterval对象
confirm("提示信息") 弹出确认框,确定返回true取消返回false
cursor:样式 更改鼠标样式 hand crosshair text wait help default auto e/s/w/n-resize
event.clientX 返回最后一次点击鼠标X坐标值;
event.clientY 返回最后一次点击鼠标Y坐标值;
event.offsetX 返回当前鼠标悬停X坐标值
event.offsetY 返回当前鼠标悬停Y坐标值
document.write(document.lastModified) 网页最后一次更新时间
document.ondblclick=x 当双击鼠标产生事件
document.onmousedown=x 单击鼠标键产生事件
document.body.scrollTop; 返回和设置当前竖向滚动条的坐标值,须与函数配合,
document.body.scrollLeft; 返回和设置当前横向滚动务的坐标值,须与函数配合,
document.title document.title="message"; 当前窗口的标题栏文字
document.bgcolor document.bgcolor="颜色值"; 改变窗口背景颜色
document.Fgcolor document.Fgcolor="颜色值"; 改变正文颜色
document.linkcolor document.linkcolor="颜色值"; 改变超联接颜色
document.alinkcolor document.alinkcolor="颜色值"; 改变正点击联接的颜色
document.VlinkColor document.VlinkColor="颜色值"; 改变已访问联接的颜色
document.forms.length 返回当前页form表单数
document.anchors.length 返回当前页锚的数量
document.links.length 返回当前页联接的数量
document.onmousedown=x 单击鼠标触发事件
document.ondblclick=x 双击鼠标触发事件
defaultStatus window.status=defaultStatus; 将状态栏设置默认显示
function function xx(){...} 定义函数
isNumeric 判断是否是数字
innerHTML xx=对象.innerHTML 输入某对象标签中的html源代码
innerText divid.innerText=xx 将以div定位以id命名的对象值设为XX
location.reload(); 使本页刷新,target可等于一个刷新的网页
Math.random() 随机涵数,只能是0到1之间的数,如果要得到其它数,可以为*10,再取整
Math.floor(number) 将对象number转为整数,舍取所有小数
Math.min(1,2) 返回1,2哪个小
Math.max(1,2) 返回1,2哪个大
navigator.appName 返回当前浏览器名称
navigator.appVersion 返回当前浏览器版本号
navigator.appCodeName 返回当前浏览器代码名字
navigator.userAgent 返回当前浏览器用户代标志
onsubmit onsubmit="return(xx())" 使用函数返回值
opener opener.document.对象 控制原打开窗体对象
prompt xx=window.prompt("提示信息","预定值"); 输入语句
parent parent.框架名.对象 控制框架页面
return return false 返回值
random 随机参数(0至1之间)
reset() form.reset(); 使form表单内的数据重置
split("") string.split("") 将string对象字符以逗号隔开
submit() form对象.submit() 使form对象提交数据
String对象的 charAt(x)对象 反回指定对象的第多少位的字母
lastIndexOf("string") 从右到左询找指定字符,没有返回-1
indexOf("string") 从左到右询找指定字符,没有返回-1
LowerCase() 将对象全部转为小写
UpperCase() 将对象全部转为大写
substring(0,5) string.substring(x,x) 返回对象中从0到5的字符
setTimeout("function",time) 设置一个超时对象
setInterval("function",time) 设置一个超时对象
toLocaleString() x.toLocaleString() 从x时间对象中获取时间,以字符串型式存在
typeof(变量名) 检查变量的类型,值有:String,Boolean,Object,Function,Underfined
window.event.button==1/2/3 鼠标键左键等于1右键等于2两个键一起按为3
window.screen.availWidth 返回当前屏幕宽度(空白空间)
window.screen.availHeight 返回当前屏幕高度(空白空间)
window.screen.width 返回当前屏幕宽度(分辨率值)
window.screen.height 返回当前屏幕高度(分辨率值)
window.document.body.offsetHeight; 返回当前网页高度
window.document.body.offsetWidth; 返回当前网页宽度
window.resizeTo(0,0) 将窗口设置宽高
window.moveTo(0,0) 将窗口移到某位置
window.focus() 使当前窗口获得焦点
window.scroll(x,y) 窗口滚动条坐标,y控制上下移动,须与函数配合
window.open() window.open("地址","名称","属性")
属性:toolbar(工具栏),location(地址栏),directions,status(状态栏),
menubar(菜单栏),scrollbar(滚动条),resizable(改变大小), width(宽),height(高),fullscreen(全 屏),scrollbars(全屏时无滚动条无参 数,channelmode(宽屏),left(打开窗口x坐标),top(打开窗口y坐标)
window.location = 'view-source:' + window.location.href 应用事件查看网页源代码;
a=new Date(); //创建a为一个新的时期对象
y=a.getYear(); //y的值为从对象a中获取年份值 两位数年份
y1=a.getFullYear(); //获取全年份数 四位数年份
m=a.getMonth(); //获取月份值
d=a.getDate(); //获取日期值
d1=a.getDay(); //获取当前星期值
h=a.getHours(); //获取当前小时数
m1=a.getMinutes(); //获取当前分钟数
s=a.getSeconds(); //获取当前秒钟数
对象.style.fontSize="文字大小";
单位:mm/cm/in英寸/pc帕/pt点/px象素/em文字高
1in=1.25cm
1pc=12pt
1pt=1.2px(800*600分辩率下)
文本字体属性:
fontSize大小
family字体
color颜色
fontStyle风格,取值为normal一般,italic斜体,oblique斜体且加粗
fontWeight加粗,取值为100到900不等,900最粗,light,normal,bold
letterSpacing间距,更改文字间距离,取值为,1pt,10px,1cm
textDecoration:文字修饰;取值,none不修饰,underline下划线,overline上划线
background:文字背景颜色,
backgroundImage:背景图片,取值为图片的插入路径
点击网页正文函数调用触发器:
1.onClick 当对象被点击
2.onLoad 当网页打开,只能书写在body中
3.onUnload 当网页关闭或离开时,只能书写在body中
4.onmouseover 当鼠标悬于其上时
5.onmouseout 当鼠标离开对象时
6.onmouseup 当鼠标松开
7.onmousedown 当鼠标按下键
8.onFocus 当对象获取焦点时
9.onSelect 当对象的文本被选中时
10.onChange 当对象的内容被改变
11.onBlur 当对象失去焦点
onsubmit=return(ss())表单调用时返回的值
直线 border-bottom:1x solid black
虚线 border-bottom:1x dotted black
点划线 border-bottom:2x dashed black
双线 border-bottom:5x double black
槽状 border-bottom:1x groove black
脊状 border-bottom:1x ridge black
1.边缘高光glow(color=颜色,strength=亮光大小)
 


JavaScript基础知识
JavaScript就这么回事1:基础知识

有些时候你精通一门语言,但是会发现你其实整天在和其它语言打交道,也许你以为这些微不足道,不至于影响你的开发进度,但恰恰是这些你不重视的东西会浪费你很多时间,我一直以为我早在几年前就已经精通JavaScript了,直到目前,我才越来越觉得JavaScript 远比我想象的复杂和强大,我开始崇拜它,就像崇拜所有OOP语言一样~
趁着节日的空隙,把有关JavaScript的方法和技巧整理下,让每个在为JavaScript而烦恼的人明白,JavaScript就这么回事!并希望JavaScript还可以成为你的朋友,让你豁然开朗,在项目中更好的应用~
适合阅读范围:对JavaScript一无所知~离精通只差一步之遥的人
基础知识:HTML

 

1 创建脚本块
1: <script language=”JavaScript”>
2: JavaScript code goes here
3: </script>


2 隐藏脚本代码
1: <script language=”JavaScript”>
2: <!--
3: document.write(“Hello”);
4: // -->
5: </script>

在不支持JavaScript的浏览器中将不执行相关代码

3 浏览器不支持的时候显示
1: <noscript>
2: Hello to the non-JavaScript browser.
3: </noscript>


4 链接外部脚本文件
1: <script language=”JavaScript” src=”filename.js”></script>


5 注释脚本
1: // This is a comment
2: document.write(“Hello”); // This is a comment
3: /*
4: All of this
5: is a comment
6: */


6 输出到浏览器
1: document.write(“<strong>Hello</strong>”);


7 定义变量
1: var myVariable = “some value”;


8 字符串相加
1: var myString = “String1” + “String2”;


9 字符串搜索
1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: var therePlace = myVariable.search(“there”);
5: document.write(therePlace);
6: // -->
7: </script>


10 字符串替换
1: thisVar.replace(“Monday”,”Friday”);


11 格式化字串
1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: document.write(myVariable.big() + “<br>”);
5: document.write(myVariable.blink() + “<br>”);
6: document.write(myVariable.bold() + “<br>”);
7: document.write(myVariable.fixed() + “<br>”);
8: document.write(myVariable.fontcolor(“red”) + “<br>”);
9: document.write(myVariable.fontsize(“18pt”) + “<br>”);
10: document.write(myVariable.italics() + “<br>”);
11: document.write(myVariable.small() + “<br>”);
12: document.write(myVariable.strike() + “<br>”);
13: document.write(myVariable.sub() + “<br>”);
14: document.write(myVariable.sup() + “<br>”);
15: document.write(myVariable.toLowerCase() + “<br>”);
16: document.write(myVariable.toUpperCase() + “<br>”);
17:
18: var firstString = “My String”;
19: var finalString = firstString.bold().toLowerCase().fontcolor(“red”);
20: // -->
21: </script>


12 创建数组
1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “First Entry”;
5: myArray[1] = “Second Entry”;
6: myArray[2] = “Third Entry”;
7: myArray[3] = “Fourth Entry”;
8: myArray[4] = “Fifth Entry”;
9: var anotherArray = new Array(“First Entry”,”Second Entry”,”Third Entry”,”Fourth Entry”,”Fifth Entry”);
10: // -->
11: </script>


13 数组排序
1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “z”;
5: myArray[1] = “c”;
6: myArray[2] = “d”;
7: myArray[3] = “a”;
8: myArray[4] = “q”;
9: document.write(myArray.sort());
10: // -->
11: </script>


14 分割字符串
1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “a,b,c,d”;
4: var stringArray = myVariable.split(“,”);
5: document.write(stringArray[0]);
6: document.write(stringArray[1]);
7: document.write(stringArray[2]);
8: document.write(stringArray[3]);
9: // -->
10: </script>


15 弹出警告信息
1: <script language=”JavaScript”>
2: <!--
3: window.alert(“Hello”);
4: // -->
5: </script>


16 弹出确认框
1: <script language=”JavaScript”>
2: <!--
3: var result = window.confirm(“Click OK to continue”);
4: // -->
5: </script>


17 定义函数
1: <script language=”JavaScript”>
2: <!--
3: function multiple(number1,number2) {
4: var result = number1 * number2;
5: return result;
6: }
7: // -->
8: </script>


18 调用JS函数
1: <a href=”#” onClick=”functionName()”>Link text</a>
2: <a href=”javascript:functionName()”>Link text</a>


19 在页面加载完成后执行函数
1: <body onLoad=”functionName();”>
2: Body of the page
3: </body>


20 条件判断
1: <script>
2: <!--
3: var userChoice = window.confirm(“Choose OK or Cancel”);
4: var result = (userChoice == true) ? “OK” : “Cancel”;
5: document.write(result);
6: // -->
7: </script>


21 指定次数循环
1: <script>
2: <!--
3: var myArray = new Array(3);
4: myArray[0] = “Item 0”;
5: myArray[1] = “Item 1”;
6: myArray[2] = “Item 2”;
7: for (i = 0; i < myArray.length; i++) {
8: document.write(myArray + “<br>”);
9: }
10: // -->
11: </script>


22 设定将来执行
1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: window.setTimeout(“hello()”,5000);
7: // -->
8: </script>


23 定时执行函数
1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: window.setTimeout(“hello()”,5000);
6: }
7: window.setTimeout(“hello()”,5000);
8: // -->
9: </script>


24 取消定时执行
1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: var myTimeout = window.setTimeout(“hello()”,5000);
7: window.clearTimeout(myTimeout);
8: // -->
9: </script>


25 在页面卸载时候执行函数
1: <body onUnload=”functionName();”>
2: Body of the page
3: </body>

itext5关于页眉和页脚的设置

iText5中并没有之前版本HeaderFooter对象设置页眉和页脚,可以利用PdfPageEventHelper来完成页眉页脚的设置工作。PdfPageEventHelper中包含以下事件处理器。...
  • younkerjqb
  • younkerjqb
  • 2013年11月04日 15:48
  • 2095

基于easyui框架中input 类型的checkbox拼接成字符串存入数据库和读取选中---善良公社项目

整个实现功能接触了:eaui架构中页面如何加载数据、如何从json数据中拿到某个字段值的内容、把json数据存入list、通过小的for循环来实现数据的对比,实现功能主要来源于静下心来多多的思考,这方...
  • lishehe
  • lishehe
  • 2013年12月10日 19:20
  • 14543

NLTK文本分割器是如何工作的

本文翻译自: http://text-processing.com/demo/tokenize/ Tokenization 是把文本分割成tokens的方式。tokens可以是段落,句子,或者单独...
  • huyoo
  • huyoo
  • 2013年09月30日 13:59
  • 6408

数据比赛资料(杂合)

机器学习资料 spark ml 算法原理剖析以及具体的源码实现分析 https://github.com/endymecy/spark-ml-source-analysis ...
  • touristcwl
  • touristcwl
  • 2017年06月09日 23:10
  • 505

apache与tomcat通过mod_jk模块整合

apache和tomcat总体有两种连接方式 第一种:通过http_connector或ajp_connector协议,把请求代理到tomcat 第二种:通过连接mod_jk模块 这次重点记录下...
  • nange_nice
  • nange_nice
  • 2018年01月14日 11:56
  • 115

springMVC如何利用json向前端传递一个集合

今天写了个js代码,需要遍历一个集合,但是程序执行到遍历的代码时就停止运行了,一度认为是js代码写错了,怎么改都不行,很是郁闷 springmvc代码: List nvrs = came...
  • zlt_1222
  • zlt_1222
  • 2018年01月14日 10:51
  • 35

Python—列表、元组、字典、集合

前言 列表(list)、元组(tuple)、字典(dict)、集合(set) 是Python的四种基本数据类型。 列表(list) 列表(list)是Python内置的一种数据类型。li...
  • Youth0_0
  • Youth0_0
  • 2018年01月14日 07:23
  • 36

Azure 设计模式之资源整合

资源整合模式将多个任务或操作合并到一个计算单元中以提高计算资源利用率,并降低在云托管应用程序中的计算成本和管理开销。问题背景云应用程序通常用于实现各种操作。在某些解决方案中,遵循关注点分离的设计原则是...
  • csharp25
  • csharp25
  • 2018年01月10日 23:50
  • 37

程序员书单合辑分享

《设计模式之禅(完整高清版)》 链接:http://pan.baidu.com/s/1bo7noMb 密码:5kve  《重构_改善既有代码的设计》 链接:http://pan.baidu.co...
  • weikuhei9479
  • weikuhei9479
  • 2018年01月10日 19:08
  • 72

JDK源码学习——集合

写在之前,也已经毕业半年了,还没有看过什么源码,java开发的工作做了半年,感觉有必要看看源码了,从JDK的源码自己感兴趣用的最多,面试最可能问到的地方看起吧,顺便巩固下自己的知识。 java中在最...
  • qq_27790011
  • qq_27790011
  • 2018年01月10日 18:24
  • 20
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:雜合
举报原因:
原因补充:

(最多只允许输入30个字)