2005年05月30日

JDBC是Java DataBase Connectivity的缩写。Java提供的JDBC API提供了操作数据库的统一接口。使用JDBC需要以下结构:应用程序、驱动管理器、驱动器、数据源。利用JDBC实现访问数据库需要通过以下步骤:

1、通过驱动管理器获取连接接口;

2、获得Statement或其子类

3、限制statement参数

4、执行statement

5、查看返回的行数是否超出范围

6、关闭statement

7、执行其他statement

8、关闭驱动连接接口

1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar
Class.forName( "org.gjt.mm.mysql.Driver" );
cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd );

2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar
Class.forName( "org.postgresql.Driver" );
cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd );

3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip
Class.forName( "oracle.jdbc.driver.OracleDriver" );
cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );

4. Sybase(http://jtds.sourceforge.net)jconn2.jar
Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );
cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd );
//(Default-Username/Password: "dba"/"sql")

5. Microsoft SQLServer(http://jtds.sourceforge.net)
Class.forName( "net.sourceforge.jtds.jdbc.Driver" );
cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd );

6. Microsoft SQLServer(http://www.microsoft.com)
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd );

7. ODBC
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd );

8.DB2
Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");
String url="jdbc:db2://192.9.200.108:6789/SAMPLE"
cn = DriverManager.getConnection( url, sUsr, sPwd );

public: 包内包外任何对象都访问;

protected: 仅包内以及子类可以访问;

private: 仅此类本身可以访问;

缺省: 仅此包内可以访问。

2005年05月19日

初级方法—-处理onmousedown\onmousemove,onmousedown

在窗体上放一个panel(Panel1),panel1上放一个panel(Panel2).

主要代码如下:

var
  Form1: TForm1;
  startdrag:boolean;
  xstart:integer;
  ystart:integer;

implementation

{$R *.dfm}

procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
//开始拖放
startdrag:=true;
xstart:=x;  //记录鼠标在控件(panel2)中的位置
ystart:=y;

end;

procedure TForm1.Panel2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
//停止拖放
startdrag:=false;
end;

procedure TForm1.Panel2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if startdrag then
begin
  panel2.left:=panel2.Left+x-xstart;    //执行move时,控件初始位置+(x – xstart),使控件位置同步
  panel2.Top:=panel2.Top+y-ystart;
end;
end;

end.

2005年05月10日
  首先需要安装微软的MS Agent组件,包括两个运行核心组件、语音组件、角色文件等。

  相关组件详细信息可以到:

http://msdn.microsoft.com/workshop/c-frame.htm#/workshop/imedia/agent/default.asp

  到Download链接下载(另外还有角色编辑器下载)。

  安装完成后,在Delphi中导入ActiveX组件Microsoft Agent Control 2.0。

  安装完组件后即可以在程序中使用了:

以下为由Agent组件和一些基本组件组合的调用Agent例程:

窗体代码:

object Form1: TForm1
  Left = 200
  Top = 108
  Width = 413
  Height = 359
  Caption = 'Microsoft Agent Test Drive'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = True
  Position = poScreenCenter
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object Bevel1: TBevel
    Left = 256
    Top = 160
    Width = 137
    Height = 145
  end
  object Agent1: TAgent
    Left = 264
    Top = 168
    Width = 32
    Height = 32
    OnDblClick = Agent1DblClick
    OnDragComplete = Agent1DragComplete
    OnShow = Agent1HideShow
    OnHide = Agent1HideShow
    OnBookmark = Agent1Bookmark
    ControlData = {000300004F0300004F030000}
  end
  object grpAnimation: TGroupBox
    Left = 8
    Top = 8
    Width = 217
    Height = 81
    Caption = 'Animation'
    TabOrder = 0
    object cbAnimations: TComboBox
      Left = 16
      Top = 20
      Width = 185
      Height = 21
      Style = csDropDownList
      ItemHeight = 13
      TabOrder = 0
    end
    object btnPlay: TButton
      Left = 22
      Top = 48
      Width = 75
      Height = 25
      Caption = '&Play'
      TabOrder = 1
      OnClick = btnPlayClick
    end
    object btnStopLast: TButton
      Left = 120
      Top = 48
      Width = 75
      Height = 25
      Caption = 'Stop &Last'
      TabOrder = 2
      OnClick = btnStopLastClick
    end
  end
  object grpMovement: TGroupBox
    Left = 8
    Top = 96
    Width = 217
    Height = 97
    Caption = 'Movement'
    TabOrder = 1
    object Label2: TLabel
      Left = 16
      Top = 24
      Width = 10
      Height = 13
      Caption = '&X:'
      FocusControl = XPos
    end
    object Label3: TLabel
      Left = 72
      Top = 24
      Width = 10
      Height = 13
      Caption = '&Y:'
      FocusControl = YPos
    end
    object Label4: TLabel
      Left = 128
      Top = 24
      Width = 34
      Height = 13
      Caption = 'Spee&d:'
      FocusControl = Speed
    end
    object XPos: TEdit
      Left = 32
      Top = 20
      Width = 33
      Height = 21
      TabOrder = 0
      Text = '500'
    end
    object YPos: TEdit
      Left = 88
      Top = 20
      Width = 33
      Height = 21
      TabOrder = 1
      Text = '200'
    end
    object btnMove: TButton
      Left = 24
      Top = 60
      Width = 75
      Height = 25
      Caption = '&Move'
      TabOrder = 3
      OnClick = btnMoveClick
    end
    object btnGesture: TButton
      Left = 120
      Top = 60
      Width = 75
      Height = 25
      Caption = '&Gesture'
      TabOrder = 4
      OnClick = btnGestureClick
    end
    object Speed: TEdit
      Left = 168
      Top = 20
      Width = 33
      Height = 21
      TabOrder = 2
      Text = '1000'
    end
  end
  object grpSpeech: TGroupBox
    Left = 8
    Top = 200
    Width = 217
    Height = 105
    Caption = 'Speech'
    TabOrder = 2
    object Memo1: TMemo
      Left = 16
      Top = 16
      Width = 185
      Height = 41
      Lines.Strings = (
        'This is a test phrase\Mrk=5\ with a '
        '\Emp\bookmark in it.')
      TabOrder = 0
    end
    object btnSpeak: TButton
      Left = 64
      Top = 72
      Width = 75
      Height = 25
      Caption = '&Speak!'
      TabOrder = 1
      OnClick = btnSpeakClick
    end
  end
  object grpSpecial: TGroupBox
    Left = 256
    Top = 8
    Width = 137
    Height = 129
    Caption = 'Special'
    TabOrder = 3
    object btnHide: TButton
      Left = 30
      Top = 24
      Width = 75
      Height = 25
      Caption = '&Hide'
      TabOrder = 0
      OnClick = btnHideClick
    end
    object btnShow: TButton
      Left = 30
      Top = 56
      Width = 75
      Height = 25
      Caption = 'Sho&w'
      TabOrder = 1
      OnClick = btnShowClick
    end
    object btnStopAll: TButton
      Left = 30
      Top = 88
      Width = 75
      Height = 25
      Caption = 'Stop &All'
      TabOrder = 2
      OnClick = btnStopAllClick
    end
  end
  object StatusBar1: TStatusBar
    Left = 0
    Top = 313
    Width = 405
    Height = 19
    Panels = <>
    SimplePanel = True
  end
end

程序代码:

unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ExtCtrls, StdCtrls, OleCtrls, ActiveX, AgentObjects_TLB;

const
  WM_SHOWAGENT = WM_USER + 1;

 //角色名称

  AGENT = 'Merlin';

  //此处为指定Agent组件安装完成后,角色文件的位置

  AGENTPATH = 'C:\Windows\MSAgent\Chars\Merlin.acs';

  RequestCompleted = 0;
  RequestFailed = 1;
  RequestPending = 2;
  RequestInterrupted = 3;
  RequestInProgress = 4;

  NeverShown = 0;
  UserHidSpeech = 1;
  UserShowed = 2;
  ProgramHid = 3;
  ProgramShowed = 4;
  OtherProgramHid = 5;
  OtherProgramShowed = 6;
  UserHidMenu = 7;

  LeftButton = 1;
  RightButton = 2;
  MiddleButton = 4;

type
  TForm1 = class(TForm)
    Agent1: TAgent;
    grpAnimation: TGroupBox;
    cbAnimations: TComboBox;
    btnPlay: TButton;
    btnStopLast: TButton;
    grpMovement: TGroupBox;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    XPos: TEdit;
    YPos: TEdit;
    btnMove: TButton;
    btnGesture: TButton;
    Speed: TEdit;
    grpSpeech: TGroupBox;
    Memo1: TMemo;
    btnSpeak: TButton;
    grpSpecial: TGroupBox;
    btnHide: TButton;
    btnShow: TButton;
    btnStopAll: TButton;
    Bevel1: TBevel;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnPlayClick(Sender: TObject);
    procedure btnStopLastClick(Sender: TObject);
    procedure btnSpeakClick(Sender: TObject);
    procedure btnMoveClick(Sender: TObject);
    procedure btnGestureClick(Sender: TObject);
    procedure btnHideClick(Sender: TObject);
    procedure btnShowClick(Sender: TObject);
    procedure btnStopAllClick(Sender: TObject);
    procedure Agent1Bookmark(Sender: TObject; BookmarkID: Integer);
    procedure Agent1DblClick(Sender: TObject;
      const CharacterID: WideString; Button, Shift, x, y: Smallint);
    procedure Agent1DragComplete(Sender: TObject;
      const CharacterID: WideString; Button, Shift, x, y: Smallint);
    procedure Agent1HideShow(Sender: TObject; const CharacterID: WideString;
      Cause: Smallint);
  private
    { Private declarations }
    Character: IAgentCtlCharacterEx;
    FRequest: IAgentCtlRequest;
    procedure WaitFor(Request: IAgentCtlRequest);
    procedure WMShowAgent(var Message: TMessage); message WM_SHOWAGENT;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WaitFor(Request: IAgentCtlRequest);
var
  Status: LongInt;
begin
  repeat
    Application.ProcessMessages;
    Status := Request.Get_Status;
  until (Status <> RequestPending) and (Status <> RequestInProgress);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Animations: IAgentCtlAnimationNames;
  Enum: IEnumVariant;
  V: OleVariant;
  Fetched: Cardinal;
begin
  Character := nil;
  FRequest := nil;

  Agent1.Connected := True;

  Agent1.Characters.Load(AGENT, AGENTPATH);
  Character := Agent1.Characters.Character(AGENT);

  Animations := Character.AnimationNames;
  Enum := Animations.Enum as IEnumVariant;
  while Enum.Next(1, V, Fetched) = S_OK do
    cbAnimations.Items.Add(V);

  cbAnimations.ItemIndex := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  Request: IAgentCtlRequest;
begin
  if Character <> nil then begin
    Character.StopAll('');

    Request := Character.Hide(False);
    WaitFor(Request);

    Agent1.Characters.Unload(AGENT);
  end;

  Agent1.Connected := False;
end;

procedure TForm1.WMShowAgent(var Message: TMessage);
var
  pt: TPoint;
begin
  pt.x := Bevel1.Left;
  pt.y := Bevel1.Top;
  pt := ClientToScreen(pt);
  Character.MoveTo(pt.x, pt.y, 0);

  Character.Show(False);
  Character.Play('Announce');
  Character.Speak('Hello.  I am an agent.', '');
  Character.Play('RestPose');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_SHOWAGENT, 0, 0);
end;

// Animation

procedure TForm1.btnPlayClick(Sender: TObject);
var
  Status: LongInt;
begin
  // If we're already playing something, stop it
  if FRequest <> nil then begin
    Status := FRequest.Get_Status;
    if (Status = 2) or (Status = 4) then
      Character.Stop(FRequest);
  end;

  FRequest := Character.Play(cbAnimations.Text);
end;

procedure TForm1.btnStopLastClick(Sender: TObject);
begin
  if FRequest <> nil then
    Character.Stop(FRequest);
end;

// Speech

procedure TForm1.btnSpeakClick(Sender: TObject);
begin
  Character.Speak(Memo1.Text, '');
end;

// Movement

procedure TForm1.btnMoveClick(Sender: TObject);
begin
  Character.MoveTo(StrToInt(XPos.Text), StrToInt(YPos.Text), StrToInt(Speed.Text));
end;

procedure TForm1.btnGestureClick(Sender: TObject);
begin
  Character.GestureAt(StrToInt(XPos.Text), StrToInt(YPos.Text));
end;

// Special

procedure TForm1.btnHideClick(Sender: TObject);
begin
  Character.Hide(False);
end;

procedure TForm1.btnShowClick(Sender: TObject);
begin
  Character.Show(False);
end;

procedure TForm1.btnStopAllClick(Sender: TObject);
begin
  Character.StopAll('');
end;

// Event handlers

procedure TForm1.Agent1Bookmark(Sender: TObject; BookmarkID: Integer);
begin
  StatusBar1.SimpleText := 'Triggered bookmark ' + IntToStr(BookmarkID);
end;

procedure TForm1.Agent1DblClick(Sender: TObject;
  const CharacterID: WideString; Button, Shift, x, y: Smallint);
begin
  if Button = LeftButton then
    StatusBar1.SimpleText := 'The user double-clicked on ' + CharacterID;
end;

procedure TForm1.Agent1DragComplete(Sender: TObject;
  const CharacterID: WideString; Button, Shift, x, y: Smallint);
begin
  StatusBar1.SimpleText := Format('The user moved %s to %d, %d', [CharacterID, x, y]);
end;

procedure TForm1.Agent1HideShow(Sender: TObject; const CharacterID: WideString;
  Cause: Smallint);
begin
  case Cause of
    NeverShown:
      StatusBar1.SimpleText := 'Nobody ever showed ' + CharacterID;
    UserHidSpeech:
      StatusBar1.SimpleText := 'The user hid ' + CharacterID + ' via spoken command';
    UserShowed:
      StatusBar1.SimpleText := 'The user showed ' + CharacterID;
    ProgramHid:
      StatusBar1.SimpleText := 'The program hid ' + CharacterID;
    ProgramShowed:
      StatusBar1.SimpleText := 'The program showed ' + CharacterID;
    OtherProgramHid:
      StatusBar1.SimpleText := 'Another program hid ' + CharacterID;
    OtherProgramShowed:
      StatusBar1.SimpleText := 'Another program showed ' + CharacterID;
    UserHidMenu:
      StatusBar1.SimpleText := 'The user hid ' + CharacterID + ' via menu';
    else
      StatusBar1.SimpleText := 'Unknown show/hide status for ' + CharacterID;
  end;
end;

end.

  另外,在Microsoft Office\Office目录下的角色文件也可以调用。直接修改角色对象路径和文件名称就可以了。剩下的就是你的程序结构设计了,不多说。

  好了!
2005年04月29日

8中基本数据类型:

byte 1字节;short 2字节;char 2字节;int 4字节;long 8字节;float 4字节;double 8字节;boolean。

2005年04月20日

这是因为匿名用户的权限不够,无法访问IIS的临时空间。简单的办法是将匿名用户设置为已知的高权限用户(记得设置密码)。

另外如果网页提示的错误不够明白,在IE的Internet选项里设置高级里将“显示友好http错误信息”去掉。

如果显示不允许路径里使用"..",应该在IIS里设置“启用父路径”。

2005年01月24日
“http 500内部服务器错误”的解决方法
IIS500错误,是因为微软的一个BUG所造成的。下面是解决办法:

主要是由于IWAM账号(在我的计算机即是IWAM_MYSERVER账号)的密码错误造成了HTTP 500内部错误。 

在详细分析HTTP500内部错误产生的原因之前,先对IWAM账号进行一下简要的介绍:IWAM账号是安装IIS5时系统自动建立的一个内置账号,主要用于启动进程之外的应用程序的Internet信息服务。IWAM账号的名字会根据每台计算机NETBIOS名字的不同而有所不同,通用的格式是IWAM_MACHINE,即由“IWAM”前缀、连接线“_”加上计算机的NETBIOS名字组成。我的计算机的NETBIOS名字是MYSERVER,因此我的计算机上IWAM账号的名字就是IWAM_MYSERVER,这一点与IIS匿名账号ISUR_MACHINE的命名方式非常相似。 

IWAM账号建立后被Active Directory、IIS metabase数据库和COM+应用程序三方共同使用,账号密码被三方分别保存,并由操作系统负责这三方保存的IWAM密码的同步工作。按常理说,由操作系统负责的工作我们大可放心,不必担心出错,但不知是BUG还是其它什么原因,系统的对IWAM账号的密码同步工作有时会失败,使三方IWAM账号所用密码不统一。当IIS或COM+应用程序使用错误IWAM的密码登录系统,启动IIS Out-Of-Process Pooled Applications时,系统会因密码错误而拒绝这一请求,导致IIS Out-Of-Process Pooled Applications启动失败,也就是我们在ID10004错误事件中看到的“不能运行服务器{3D14228D-FBE1-11D0-995D-00C04FD919C1} ”(这里{3D14228D-FBE1-11D0-995D-00C04FD919C1} 是IIS Out-Of-Process Pooled Applications的KEY),不能转入IIS5应用程序,HTTP 500内部错误就这样产生了。 


三.解决办法 


知道了导致HTTP 500内部错误的原因,解决起来就比较简单了,那就是人工同步IWAM账号在Active Directory、IIS metabase数据库和COM+应用程序中的密码。 

具体操作分三步,均需要以管理员身份登录计算机以提供足够的操作权限(IWAM账号以IWAM_MYSERVER为例)。 


(一)更改Active Directory中IWAM_MYSERVER账号的密码 

因IWAM账号的密码由系统控制,随机产生,我们并不知道是什么,为完成下面两步的密码同步工作,我们必须将IWAM账号的密码设置为一个我们知道的值。 

1、选择“开始”->“程序”->“管理工具”->"Active Directory用户和计算机",启动“Active Directory用户和计算机”管理单元。 

2、单击“user”,选中右面的“IWAM_MYSERVER”,右击选择“重设密码(T)…”,在跳出的重设密码对方框中给IWAM_MYSERVER设置新的密码,这儿我们设置成“Aboutnt2001”(没有引号的),确定,等待密码修改成功。 


(二)同步IIS metabase中IWAM_MYSERVER账号的密码 

可能因为这项改动太敏感和重要,微软并没有为我们修改IIS metabase中IWAM_MYSERVER账号密码提供一个显式的用户接口,只随IIS5提供了一个管理脚本adsutil.vbs,这个脚本位于C:\inetpub\adminscripts子目录下(位置可能会因你安装IIS5时设置的不同而有所变动)。 

adsutil.vbs脚本功能强大,参数非常多且用法复杂,这里只提供使用这个脚本修改IWAM_MYSERVER账号密码的方法: 

adsutil SET w3svc/WAMUserPass Password 

"Password"参数就是要设置的IWAM账号的新的密码。因此我们将IIS metabase中IWAM_MYSERVER账号的密码修改为“Aboutnt2001”的命令就是: 

c:\Inetpub\AdminScripts>adsutil SET w3svc/WAMUserPass "Aboutnt2001" 

修改成功后,系统会有如下提示: 

WAMUserPass: (String) "Aboutnt2001" 


(三)同步COM+应用程序所用的IWAM_MYSERVER的密码 

同步COM+应用程序所用的IWAM_MYSERVER的密码,我们有两种方式可以选择:一种是使用组件服务MMC管理单元,另一种是使用IWAM账号同步脚本synciwam.vbs。 


1、使用组件服务MMC管理单元 

(1)启动组件服务管理单元:选择“开始”->“运行”->“MMC”,启动管理控制台,打开“添加/删除管理单元”对话框,将“组件服务”管理单元添加上。 

(2)找到“组件服务”->“计算机”->“我的电脑”->“COM+应用程序”->“Out-Of-Process Pooled Applications”,右击“Out-Of-Process Pooled Applications”->“属性”。 

(3)切换到“Out-Of-Process Pooled Applications”属性对话框的“标志”选项卡。“此应用程序在下列账户下运行”选择中“此用户”会被选中,用户名是“IWAM_MYSERVER”。这些都是缺省的,不必改动。在下面的“密码”和“确认密码”文本框内输入正确的密码“Aboutnt2001”,确定退出。 

(4)系统如果提示“应用程序被一个以上的外部产品创建。你确定要被这些产品支持吗?”时确定即可。 

(5)如果我们在IIS中将其它一些Web的“应用程序保护”设置为“高(独立的)”,那么这个WEB所使用的COM+应用程序的IWAM账号密码也需要同步。重复(1)-(4)步,同步其它相应Out of process application的IWAM账号密码。 


2、使用IWAM账号同步脚本synciwam.vbs 

实际上微软已经发现IWAM账号在密码同步方面存在问题,因此在IIS5的管理脚本中单独为IWAM账号密码同步编写了一个脚本synciwam.vbs,这个脚本位于C:\inetpub\adminscripts子目录下(位置可能会因你安装IIS5时设置的不同而有所变动)。 

synciwam.vbs脚本用法比较简单: 

cscript synciwam.vbs [-v|-h] 

“-v”参数表示详细显示脚本执行的整个过程(建议使用),“-h”参数用于显示简单的帮助信息。 


我们要同步IWAM_MYSERVER账号在COM+应用程序中的密码,只需要执行“cscript synciwam.vbs -v”即可,如下: 

cscript c:\inetpub\adminscripts\synciwam.vbs -v 

Microsoft (R) Windows Script Host Version 5.6 

版权所有(C) Microsoft Corporation 1996-2000。保留所有权利。 


WamUserName:IWAM_MYSERVER 

WamUserPass:Aboutnt2001 

IIS Applications Defined: 

Name, AppIsolated, Package ID 

w3svc, 0, {3D14228C-FBE1-11d0-995D-00C04FD919C1} 

Root, 2, 

IISHelp, 2, 

IISAdmin, 2, 

IISSamples, 2, 

MSADC, 2, 

ROOT, 2, 

IISAdmin, 2, 

IISHelp, 2, 

Root, 2, 

Root, 2, 


Out of process applications defined: 

Count: 1 

{3D14228D-FBE1-11d0-995D-00C04FD919C1} 


Updating Applications: 

Name: IIS Out-Of-Process Pooled Applications Key: {3D14228D-FBE1-11D0-995D-00C04FD919C1} 


从上面脚本的执行情况可以看出,使用synciwam.vbs脚本要比使用组件服务的方法更全面和快捷。它首先从IIS的metabase数据库找到IWAM账号"IWAM_MYSERVER"并取出对应的密码“Aboutnt2001”,然后查找所有已定义的IIS Applications和Out of process applications,并逐一同步每一个Out of process applications应用程序的IWAM账号密码。 

使用synciwam.vbs脚本时,要注意一个问题,那就是在你运行synciwam.vbs之前,必须保证IIS metabase数据库与Active Directory中的IWAM密码已经一致。因为synciwam.vbs脚本是从IIS metabase数据库而不是从Active Directory取得IWAM账号的密码,如果IIS metabase中的密码不正确,那synciwam.vbs取得的密码也会不正确,同步操作执行到“Updating Applications”系统就会报80110414错误,即“找不到应用程序{3D14228D-FBE1-11D0-995D-00C04FD919C1}”。 


好了,到现在为止,IWAM账号在Active Directory、IIS metabase数据库和COM+应用程序三处的密码已经同步成功,你的ASP程序又可以运行了! 

2005年01月13日

jsp语法

批注:

<!–  coment [ <%= expression %> ](会显示在客户端) –>

<%– comment(不编译,不会显示在客户端)  –%>

Quoting和Escape规则:

‘ 改为 \’

" 改为 \"

\ 改为 \\

<% 改为 &lt;%

%> 改为 %\>

Directives Elements:

格式 <%@  directive attribute1="value1" [attribute2="value2"] %>

指令有:page,include和taglib.

page指令的属性:

language="scriptingLanguage" 缺省为Java

extends="className"

import="imortlist"

session="true | false

2005年01月12日

MySQL的数据类型和建库策略
——————————————————————————–
2001年10月16日来源:天极网处处

 

无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。

 

一、 数字类型

数字类型按照我的分类方法分为三类:整数类、小数类和数字类。我所谓的”数字类”,就是指DECIMAL和NUMERIC,它们是同一种类型。它严格的说不是一种数字类型,因为他们实际上是将数字以字符串形式保存的;他的值的每一位(包括小数点)占一个字节的存储空间,因此这种类型耗费空间比较大。但是它的一个突出的优点是小数的位数固定,在运算中不会”失真”,所以比较适合用于”价格”、”金额”这样对精度要求不高但准确度要求非常高的字段。

小数类,即浮点数类型,根据精度的不同,有FLOAT(单精度)和DOUBLE(双精度)两种。它们的优势是精确度,FLOAT可以表示绝对值非常小、小到约 1.17E-38 (0.000…0117,小数点后面有37个零)的小数,而DOUBLE更是可以表示绝对值小到约 2.22E-308 (0.000…0222,小数点后面有307个零)的小数。FLOAT类型和DOUBLE类型占用存储空间分别是4字节和8字节。如果需要用到小数的字段,精度要求不高的,当然用FLOAT了!可是说句实在话,我们”民用”的数据,哪有要求精度那么高的呢?这两种类型至今我没有用过–我还没有遇到适合于使用它们的事例。

用的最多的,最值得精打细算的,是整数类型。从只占一个字节存储空间的TINYINT到占8个字节的BIGINT,挑选一个”够用”并且占用存储空间最小的类型是设计数据库时应该考虑的。TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT占用存储空间分别为1字节、2字节、3字节、4字节和8字节,就无符号的整数而言,这些类型能表示的最大整数分别为255、65535、16777215、4294967295和18446744073709551615。如果用来保存用户的年龄(举例来说,数据库中保存年龄是不可取的),用TINYINT就够了;九城的《纵横》里,各项技能值,用SMALLINT也够了;如果要用作一个肯定不会超过16000000行的表的AUTO_INCREMENT的IDENTIFY字段,当然用 MEDIUMINT 不用 INT ,试想,每行节约一个字节,16000000行可以节约10兆多呢!

二、 日期时间类型

日期和时间类型比较简单,无非是 DATE、TIME、DATETIME、TIMESTAMP和YEAR等几个类型。只对日期敏感,而对时间没有要求的字段,就用DATE而不用DATETIME是不用说的了;单独使用时间的情况也时有发生–使用TIME;但最多用到的还是用DATETIME。在日期时间类型上没有什么文章可做,这里就不再详述。

三、 字符(串)类型

不要以为字符类型就是 CHAR !CHAR和VARCHAR的区别在于CHAR是固定长度,只要你定义一个字段是CHAR(10),那么不论你存储的数据是否达到了10个字节,它都要占去10个字节的空间;而VARVHAR则是可变长度的,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的,VARCHAR 类型的实际长度是它的值的(实际长度+1)。为什么”+1″呢?这一个字节用于保存实际使用了多大的长度呀!从这个”+1″中也应该看到,如果一个字段,它的可能值最长是10个字符,而多数情况下也就是用到了10个字符时,用VARCHAR就不合算了:因为在多数情况下,实际占用空间是11个字节,比用CHAR(10)还多占用一个字节!

举个例子,就是一个存储股票名称和代码的表,股票名称绝大部分是四个字的,即8个字节;股票代码,上海的是六位数字,深圳的是四位数字。这些都是固定长度的,股票名称当然要用 CHAR(8) ;股票代码虽然是不固定长度,但如果使用VARVHAR(6),一个深圳的股票代码实际占用空间是5个字节,而一个上海的股票代码要占用7个字节!考虑到上海的股票数目比深圳的多,那么用VARCHAR(6)就不如CHAR(6)合算了。

虽然一个CHAR或VARVHAR的最大长度可以到255,我认为大于20的CHAR是几乎用不到的–很少有大于20个字节长度的固定长度的东东吧?不是固定长度的就用VARCHAR!大于100的VARCHAR也是几乎用不到的–比这更大的用TEXT就好了。TINYTEXT,最大长度为255,占用空间也是(实际长度+1);TEXT,最大长度65535,占用空间是(实际长度+2);MEDIUMTEXT,最大长度16777215,占用空间是(实际长度+3);LONGTEXT,最大长度4294967295,占用空间是(实际长度+4)。为什么”+1″?”+2″?”+3″?”+4″?你要是还不知道就该打PP了。这些可以用在论坛啊、新闻啊,什么的,用来保存文章的正文。根据实际情况的不同,选择从小到大的不同类型。

四、 枚举和集合类型

枚举(ENUM)类型,最多可以定义65535种不同的字符串从中做出选择,只能并且必须选择其中一种,占用存储空间是一个或两个字节,由枚举值的数目决定;集合(SET)类型,最多可以有64个成员,可以选择其中的零个到不限定的多个,占用存储空间是一个到八个字节,由集合可能的成员数目决定。

举个例子来说,在SQLServer中,你可以节约到用一个Bit类型来表示性别(男/女),但MySQL没有Bit,用TINTINT?不,可以用ENUM(帅哥,美眉)!只有两种选择,所以只需一个字节–跟TINYINT一样大,但却可以直接用字符串帅哥和美眉来存取。真是太方便啦!

好了,MySQL的数据类型介绍得差不多,我的建库策略也随着介绍数据类型介绍给大家一些。但这只是其中一部分,篇幅有限,不能再细说;其他的,就靠各人在对数据类型理解的基础上,多多实践、多多讨论。