学习笔记
===========================================================
用C#获取系统内存
===========================================================
using System;
using System.Management; //此命名空间需要在
//“解决方案资源管理里右键点击”引用“,添加引用,在弹出的
//对话框中找到System.Management

namespace ConsoleApplication1
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("正在计算系统内存容量,请稍候.....");
            Console.WriteLine("实际内存容量为:"+GetPhisicalMemory().ToString());
            Console.ReadLine();
        }
        private static int GetPhisicalMemory()
        {    
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(); //用于查询一些如系统信息的管理对象
            searcher.Query = new SelectQuery("Win32_PhysicalMemory","",new string[]{"Capacity"});//设置查询条件
            ManagementObjectCollection collection = searcher.Get(); //获取内存容量
            ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator();
            
            int capacity = 0;
            while(em.MoveNext())
            {
                ManagementBaseObject baseObj = em.Current;
                if(baseObj.Properties["Capacity"].Value != null)
                {
                    try
                    {
                        capacity += int.Parse(baseObj.Properties["Capacity"].Value.ToString());
                    }
                    catch
                    {
                        Console.WriteLine("有错误发生!","错误信息");
                        return 0;
                    }
                }
            }
            return capacity;
        }    
    }
}

Blueis 发表于:2005.04.01 01:30 ::分类: ( C#&ASP.NET ) ::阅读:(23099次) :: 评论 (4)
===========================================================
.NET Framework 1.1中请求被拒绝的解决办法
===========================================================

 http://support.microsoft.com/default.aspx?scid=kb;zh-cn;819267

概要

本文讨论 .NET Framework 1.1 中影响 Web 服务器上的 HTTP GET 方法和 HTTP POST 方法的变更。本文还针对这一新功能提供了解决方法。

更多信息

连接 .NET 的 Web 服务支持 HTTP GET、HTTP POST 和 SOAP 协议。在 .NET Framework 1.0 中,默认情况下所有这三种协议都会被启用。但在 .NET Framework 1.1 中,默认情况下 HTTP GET 和 HTTP POST 同时被禁用。这是出于安全方面的考虑。

当 Web 服务升级到 .NET Framework 1.1 后,应用程序使用 HTTP GET 或 HTTP POST 调用 Web 服务时会失败。这些应用程序会收到以下一条错误信息
 
System.Net.WebException
 
指出无法识别请求格式。

请注意,基于 HTML 的测试窗体使用 HTTP POST,因此,基于 HTML 的测试窗体在 .NET Framework 1.1 中不适用。除非该窗体在下面提到的本地主机上,否则情况都是如此。

.NET Framework 1.1 定义了一个名为 HttpPostLocalhost 的新协议。默认情况下,这个新协议处于启用状态。该协议允许从与使用 HTTP POST 请求的 Web 服务位于同一计算机上的应用程序调用该服务。允许的前提条件是:POST URL 使用 http://localhost,而不是 http://hostname。这使得 Web 服务开发人员可以使用基于 HTML 的测试窗体,从 Web 服务所在的同一计算机调用该 Web 服务。

当您尝试从远程计算机访问 Web 服务时,不会显示“调用”按钮。并且,您会收到以下错误信息:
The test form is only available for requests from the local machine
 

替代方法

通过编辑 Web 服务所在的 vroot 的 Web.config 文件,可以启用 HTTP GET 和 HTTP POST。以下配置同时启用了 HTTP GET 和 HTTP POST:
<configuration>
    <system.web>
    <webServices>
        <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
        </protocols>
    </webServices>
    </system.web>
</configuration>
或者,可以通过编辑 Machine.config 中的 <protocols> 节为计算机上的所有 Web 服务启用这些协议。下面的示例启用了 HTTP GET、HTTP POST 及 SOAP,此外还从本地主机启用了 HTTP POST:
<protocols>
<add name="HttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
<add name="HttpPostLocalhost"/>
      <!-- Documentation enables the documentation/test pages -->
<add name="Documentation"/>
</protocols>
 
 

Blueis 发表于:2005.03.30 17:28 ::分类: ( C#&ASP.NET ) ::阅读:(2810次) :: 评论 (0)
===========================================================
Excel导出
===========================================================
   //绑定需要输出的表
   DataTable dt = (DataTable)this.Session["TempTest"] ;
   this.dg_save.DataSource = dt ;
   this.dg_save.DataBind() ;
   //---------------------------------------------------------
   HttpContext.Current.Response.Charset ="";
   HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8 ;
   HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=result.xls");  
//   HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.GetEncoding("GB2312");
   HttpContext.Current.Response.ContentType ="application/ms-excel";//image/JPEG;text/HTML;image/GIF;vnd.ms-excel/msword
   //关闭控件的视图状态
   this.dg_save.Page.EnableViewState =false;  
   //初始化writer
   System.IO.StringWriter  tw = new System.IO.StringWriter() ;
   System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
   this.dg_save.RenderControl(hw);
   //输出
   HttpContext.Current.Response.Write(tw.ToString());
   HttpContext.Current.Response.End();
Blueis 发表于:2005.03.25 17:01 ::分类: ( C#&ASP.NET ) ::阅读:(1651次) :: 评论 (4)
===========================================================
打包并自动安装SQL数据库
===========================================================

选择自 landlordh 的 Blog

应一位网友的需求,并修正了MVP李洪根".NET平台下WEB应用程序的部署(安装数据库和自动配置)"中的osql用法错误,已测试通过。

一).创建部署项目
1. 在“文件”菜单上指向“添加项目”,然后选择“新建项目”。
2. 在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。在“名称”框中键入 setup1。
3. 单击“确定”关闭对话框。
4. 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。
5. 在“属性”窗口中,选择 ProductName 属性,并键入 信息管理系统 。
 
二).将 主程序 项目的输出添加到部署项目中
1. 在“文件系统编辑器”中,选择“应用程序文件夹”。在“操作”菜单上,指向“添加”,然后选择“项目输出”。
2. 在“添加项目输出组”对话框中,选择“项目”下拉列表中的“你的程序”。
3. 单击“确定”关闭对话框。
4. 从列表中选择“主输出”和“内容文件”组,然后单击“确定”。
 
三).创建安装程序类
1. 在“文件”菜单上指向“新建”,然后选择“项目”。
2. 在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic 项目”,然后选择“模板”窗格中的“类库”。在“名称”框中键入 installDB。
3. 单击“打开”关闭对话框。
4. 从“项目”菜单中选择“添加新项”。
5. 在“添加新项”对话框中选择“安装程序类”。在“名称”框中键入 installDB。
6. 单击“确定”关闭对话框。
7. 详细代码附后。
 
四).创建自定义安装对话框
1. 在解决方案资源管理器中选择“setup1”项目。在“视图”菜单上指向“编辑器”,然后选择“用户界面”。
2. 在用户界面编辑器中,选择“安装”下的“启动”节点。在“操作”菜单上,选择“添加对话框”。
3. 在“添加对话框”对话框中,选择“许可协议”对话框,然后单击“确定”关闭对话框。
4. 在“添加对话框”对话框中,选择“文本框 (A)”对话框,然后单击“确定”关闭对话框。
5. 在“操作”菜单上,选择“上移”。重复此步骤,直到“文本框 (A)”对话框位于“安装文件夹”节点之上。
6. 在“属性”窗口中,选择 BannerText 属性并键入:安装数据库.
7. 选择 BodyText 属性并键入:安装程序将在目标机器上安装数据库
8. 选择 Edit1Label 属性并键入:数据库名称:
9. 选择 Edit1Property 属性并键入 CUSTOMTEXTA1
10. 选择 Edit1Value 属性并键入:dbservers
11. 选择 Edit2Label 属性并键入:服务器名:
12. 选择 Edit2Property 属性并键入 CUSTOMTEXTA2
13. 选择 Edit2Value 属性并键入:(local)
14. 选择 Edit3Label 属性并键入:用户名:
15. 选择 Edit3Value 属性并键入:sa
16. 选择 Edit3Property 属性并键入 CUSTOMTEXTA3
17. 选择 Edit4Label 属性并键入:密码:
18. 选择 Edit4Property 属性并键入 CUSTOMTEXTA4
19. 选择 Edit2Visible、Edit3Visible 和 Edit4Visible 属性,并将它们设置为 true
 
五).创建自定义操作
1. 在解决方案资源管理器中选择“setup1”项目。在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。
2. 在自定义操作编辑器中选择“安装”节点。在“操作”菜单上,选择“添加自定义操作”。
3. 在“选择项目中的项”对话框中,双击“应用程序文件夹”。
4. 选择“主输出来自 installDB(活动)”项,然后单击“确定”关闭对话框。
5. 在“属性”窗口中,选择 CustomActionData 属性并键入“/dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]"”。
 
附:/targetdir="[TARGETDIR]"是安装后的目标路径,为了在installDB类中获得安装后的路径,我们设置此参数。
 
六).添加文件
1. 将SQL Server备份成文件DB.dat添加到“setup1”项目(在企业管理器中右击数据库->所有工作->备份数据库,备份成一个文件,取名为DB.dat)
2. 将安装文件LisenceFile.rtf添加到“setup1”项目
3. 在用户界面编辑器中,选择许可协议,设置LisenceFile属性为LisenceFile.rtf文件
4.一般会自动将依赖项添加到“检测到的依赖项”,如果没有,那么我们要手动将其加入步骤5)
         Crystal_Managed2003.msm     (如果有水晶报表)
         dotnetfxredist_x86.msm      (.net一定是必须的)
          ...                         (如果有引用其他的dll)
5.如果使用了水晶报表,手动加入要包含的文件:项目-->添加-->合并模块(添加你的程序文件) (包括dotNetFramework和MDAC27),位于:C:Program FilesCommon FilesMerge Modules 下,*为必要的
具体功能如下:
       (托管组件 MSM 处理所有托管组件的分发,其中包括 Windows 窗体查看器、Web 窗体查看器和所有 Crystal Decisions 命名空间)
       * Crystal_Managed2003.msm
          Crystal_Managed2003_chs.msm
       (对于使报表运行所需的所有其他文件,由数据库访问 MSM 处理其分发。其中包括数据库、导出和图表驱动程序。)
        * Crystal_Database_access2003.msm
           Crystal_Database_access2003_chs.msm
        (KeyCode MSM 处理 Crystal Decisions 密钥号码的安装,注意是添加合并模块,否则没有“MergeMouduleProperties”属性)
        * Crystal_regwiz2003.msm
        (如果报表文件使用了 ADO.NET 的 dataset 数据集对象,那么 VC_User_CRT71_RTL_X86_---.msm 和 VC_User_STL71_RTL_X86_---.msm 模块也必须包含在安装工程中。而且这两个模块的文件安装属性的"Module Retargetable Folder"项必须修改成为系统目录)
           VC_User_CRT71_RTL_X86_---.msm
           VC_User_STL71_RTL_X86_---.msm
        (很多人经常出现查询错误,不妨加上这个)
5.打开解决方案-->右键点击Crystal_regwiz2003.msm的属性,在“MergeMouduleProperties”里的“License Key”填入:AAP5GKS0000GDE100DS(这个是你生成Crystal Report是用到的注册号的密码!)


 七).打包時加入卸载功能:
方法一:
1.在打包項目中添加文件msiexec.exe(一般可在c:windowssystem32下找到)
2.在文件系統視圖中選擇應用程序文件夾,在msiexec.exe上按右鍵,選擇創建快捷方式,重命名快捷方式為"卸载".
3.更改此快捷方式的Arguments 为"/x {產品id}",產品id的值為打包項目的ProductCode屬性值.
方法二:(推荐)
1.先生成安装包,记下ProductCode(选择解决方案资源管理器根目录如setup1,再查看属性标签,不是右键中的属性),下面要用到
2.用VS.net建立一个新的控制台程序uninst.exe文件
'power by: landlordh
'for 2000,xp,2003
Module uninstall
    Sub Main()
        Dim myProcess As Process = New Process
        If System.Environment.OSVersion.ToString.IndexOf("NT 5") Then
            myProcess.Start("msiexec", "/X{2B65D4A9-C146-4808-AB4B-321FB0779559}")  '改为自己的ProductCode
        End If
        myProcess.Close()
    End Sub
End Module
3.将控制台程序BIN目录的exe文件加入到打包程序文件中,在程序组创建uninst.exe的快捷方式


附:
installdb.vb类,要添加引用 system.configuration.install.dll :

Imports System.ComponentModel
Imports System.Configuration.Install

<RunInstaller(True)> Public Class Installer1
    Inherits System.Configuration.Install.Installer

#Region " 组件设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是组件设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    'Installer 重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    '组件设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意: 以下过程是组件设计器所必需的
    '可以使用组件设计器来修改此过程。
    '不要使用代码编辑器来修改它。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container
    End Sub

#End Region


    Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        MyBase.Install(stateSaver)
        If Not InstallDB() Then
            '失败,反安装
            Me.Uninstall(stateSaver)
            Exit Sub
        End If
        DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
    End Sub

    Public Overrides Sub Uninstall(ByVal stateSaver As System.Collections.IDictionary)
        '执行反安装
        MyBase.Uninstall(stateSaver)
        DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
    End Sub

    Private Sub DeleteFile(ByVal paths As String)
        '删除指定的文件
        Try
            Dim delFile As New System.IO.FileInfo(paths)
            If delFile.Exists Then
                delFile.Delete()
            End If
        Catch ex As Exception
        End Try
    End Sub

    Private Sub CreateSql(ByVal paths As String)
        Dim File As System.IO.StreamWriter
        Dim db As String = String.Format("{0}", Me.Context.Parameters.Item("dbname"))
        Dim path As String = String.Format("{0}", Me.Context.Parameters.Item("targetdir"))
        Try
            Dim s As New System.Text.StringBuilder
            s.Append("use master" & vbCrLf)
            s.Append("" & vbCrLf)
            s.Append("if not exists (select * from sysdatabases where name='" & db & "')" & vbCrLf)
            s.Append(" BEGIN" & vbCrLf)
            s.Append("         create database " & db & vbCrLf)
            s.Append(" END" & vbCrLf)
            s.Append("" & vbCrLf)
            s.Append("if exists (select * from sysdevices where name='DBdisk')" & vbCrLf)
            s.Append(" BEGIN" & vbCrLf)
            s.Append("       EXEC sp_dropdevice 'DBdisk'" & vbCrLf)
            s.Append(" END" & vbCrLf)
            s.Append("Else" & vbCrLf)
            s.Append(" BEGIN" & vbCrLf)
            s.Append("       EXEC sp_addumpdevice 'disk','DBdisk', '" & path & "DB.dat'" & vbCrLf)
            s.Append(" END" & vbCrLf)
            s.Append("" & vbCrLf)
            s.Append("restore database " & db & vbCrLf)
            s.Append("from disk='" & path & "DB.dat'" & vbCrLf)
            s.Append("with replace")
            File = New System.IO.StreamWriter(paths)
            File.Write(s.ToString)
        Catch ex As Exception
        Finally
            File.Close()
        End Try
    End Sub

    Private Function InstallDB() As Boolean
        '安装数据库,调用自动批处理。
        Try
            '创建临时脚本
            CreateSql(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
            '调用osql执行脚本
            Dim sqlProcess As New System.Diagnostics.Process
            sqlProcess.StartInfo.FileName = "osql.exe"
            sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -S {2} -i {3}Mydb2000tp.sql", Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"), Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("targetdir"))
            sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
            sqlProcess.Start()
            sqlProcess.WaitForExit()  '等待执行
            sqlProcess.Close()
            '删除脚本文件
            DeleteFile(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

End Class

作者Blog:http://blog.csdn.net/landlordh/


Blueis 发表于:2005.03.25 16:57 ::分类: ( 初始分类 ) ::阅读:(1684次) :: 评论 (2)
===========================================================
无刷新取得远程数据
===========================================================
 

刷新技术经历了大致几个阶段:

一、在HTML文件头里增加一个键,使该页面在设定的时间后跳转到指定的页面(包括自身);

例如:

<meta http-equiv="refresh" content="30">

二、使用框架然后在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。


Blueis 发表于:2005.03.24 11:44 ::分类: ( C#&ASP.NET ) ::阅读:(58081次) :: 评论 (0)
===========================================================
向后台发送消息
===========================================================

//htm,aspx

 xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
   xmlHttpReq.open('POST',xmlurl,false);
   xmlHttpReq.send(sxml);
  
   if (xmlHttpReq.status != 200)
   {
    var sText = xmlHttpReq.statusText;
    alert(sText);
   }
   else
   {
    var sText = xmlHttpReq.responseText;   
   }

//aspx.cs

byte[] byts = new byte[Request.InputStream.Length];
   Request.InputStream.Read(byts,0,byts.Length);
   
   string req = System.Text.Encoding.Default.GetString(byts);
   req=Server.UrlDecode(req);

   trace(req);


...
...
...

output="<root><req text='" + output+ "' errcode='" + errcode + "'>" +purview  + "</req></root>";
   Response.Write(output);
   Response.End();


Blueis 发表于:2005.03.24 10:04 ::分类: ( C#&ASP.NET ) ::阅读:(1054次) :: 评论 (0)
===========================================================
[ASP.NET] Session 详解
===========================================================

     阅读本文章之前的准备
    阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。
  
    懂得ASP/ASP.NET编程
    了解ASP/ASP.NET的Session模型
    了解ASP.NET Web应用程序模型
    了解ASP.NET Web应用程序配置文件Web.config的作用、意义及使用方法
    了解Internet Information Services(以下简称IIS)的基本使用方法
    了解如何在Microsoft SQL Server中创建一个数据库。
  Session模型简介
    Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。
  
    这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,SessionID还有很多其他的作用,我们会在后面提及到。
  
    除了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或ASP.NET的程序与来说,最有用的还是可以通过访问ASP/ASP.NET的内置Session对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能访问到每个的页面中加入:
  
  <%
  If Session("PageViewed") = ""Then
   Session("PageViewed") = 1
  Else
   Session("PageViewed") = Session("PageViewed") + 1
  End If
  %>
    通过以下这句话可以让用户得知自己浏览了几个页面:
  
  
  <%
  Response.Write("You have viewed " & Session("PageViewed") & " pages")
  %>
  
    可能有些有些读者会问:这个看似像是数组的Session(“..”)是哪里来的?需要我定义吗?实际上,这个Session对象是具有ASP解释能力的的WWW服务器的内建对象。也就是说ASP的系统中已经给你定义好了这个对象,你只需要使用就行了。其中Session(“..”)中的..就好像变量名称,Session(“..”)=$$中的$$就是变量的值了。你只需要写上句话,在这个用户的每个页面中都可以访问..变量中的值了。
  
    其实ASP一共内建了7个对象,有Session、Application、Cookie、Response、Request、Server等。在其他的服务器端脚本语言如JSP、PHP等中也有其类似的对象,只是叫法或者使用方法上不太一样。
  
  ASP Session的功能的缺陷
    目前ASP的开发人员都正在使用Session这一强大的功能,但是在他们使用的过程中却发现了ASP Session有以下缺陷:
  
    进程依赖性:ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。
    Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?
  Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
  鉴于ASP Session的以上缺陷,微软的设计者们在设计开发 ASP.NET Session时进行了相应的改进,完全克服了以上缺陷,使得ASP.NET Session成为了一个更加强大的功能。
  
  Web.config文件简介
    有的ASP.NET程序员说:Web.config文件?我从来没有听说过啊,可是我写的程序不是也能很正常的运转吗?是的,你说得没错,没有Web.config文件程序是可以正常运行的。但是,如果你做了一个大型的网站,需要对整个网站做一些整体配置,例如整个网站的页面使用何种语言编写的、网站的安全认证模式、Session信息存储方式等,这时你就需要使用Web.config文件了。虽然Web.config文件中的某些选项是可以通过IIS配置的,但是如果在Web.config中也有相应的设置就会覆盖掉IIS中的配置。而且,Web.config文件的最大的便利之处就是可以在ASP.NET页面中通过调用System.web名字空间访问Web.config中的设置。
  
    Web.config有两种,分别是服务器配置文件和Web应用程序配置文件,他们都名为Web.config。在这个配置文件中会保存当前IIS服务器中网页的使用哪种语言编写的、应用程序安全认证模式、Session信息存储方式的一系列信息。这些信息是使用XML语法保存的,如果想对其编辑,使用文本编辑器就行了。
  
    其中服务器配置文件会对IIS服务器下所有的站点中的所有应用程序起作用。在.NET Framework 1.0中,服务器的Web.config文件是存在:WinNTMicrosoft.NETFrameworkv1.0.3705中的。
  
    而Web应用程序配置文件Web.config则保存在各个Web应用程序中。例如:当前网站的根目录Inetpubwwwroot,而当前的Web应用程序为MyApplication,则Web应用程序根目录就应为:InetpubwwwrootMyApplication。如果你的网站有且只有一个Web应用程序,一般说来应用程序的根目录就是Inetpubwwwroot。如果想添加一个Web应用程序,在IIS中添加一个具有应用程序起始点的虚拟目录就行了。这个目录下的文件及目录将被视为一个Web应用程序。但是,这样通过IIS添加Web应用程序是不会为你生成Web.config文件的。如果想创建一个带有Web.config文件的Web应用程序,需要使用Visual Studio.NET,新建一个Web应用程序项目。
  
    Web应用程序的配置文件Web.config是可选的,可有可无。如果没有,每个Web应用程序会使用服务器的Web.config配置文件。如果有,则会覆盖服务器Web.config配置文件中相应的值。
  
    在ASP.NET中,Web.config修改保存后会自动立刻成效,不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。
  
  Web.config文件中的Session配置信息
    打开某个应用程序的配置文件Web.config后,我们会发现以下这段:
  
  <sessionState
    mode="InProc"
    stateConnectionString="tcpip=127.0.0.1:42424"
    sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
    cookieless="false"
    timeout="20"
  />
    这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的:
  
  <sessionState mode="Off|InProc|StateServer|SQLServer"
   cookieless="true|false"
   timeout="number of minutes"
   stateConnectionString="tcpip=server:port"
   sqlConnectionString="sql connection string"
   stateNetworkTimeout="number of seconds"
  />
  
  
  必须有的属性是
  
  属性 选项 描述
  mode 设置将Session信息存储到哪里
   Off 设置为不使用Session功能
   InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。
   StateServer 设置为将Session存储在独立的状态服务中。
   SQLServer 设置将Session存储在SQL Server中。
  
  可选的属性是:
  
  属性 选项 描述
  cookieless 设置客户端的Session信息存储到哪里
   ture 使用Cookieless模式
   false 使用Cookie模式,这是默认值。
  timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟
  stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。
  sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。
  stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。
  
  ASP.NET中客户端Session状态的存储
    在我们上面的Session模型简介中,大家可以发现Session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器端。在ASP中,客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie,那末他也就无法享受Session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在ASP.NET中客户端的Session信息存储方式分为:Cookie和Cookieless两种。
  
    ASP.NET中,默认状态下,在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下:
  
    找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:
  
  <sessionState
    mode="InProc"
    stateConnectionString="tcpip=127.0.0.1:42424"
    sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
    cookieless="false"
    timeout="20"
  />
  
    这段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。关闭当前的IE,打开一个新IE,重新访问刚才的Web应用程序,就会看到类似下面的样子:
  
  
    其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的Session ID。注意,这段信息是由IIS自动加上的,不会影响以前正常的连接。
  
  ASP.NET中服务器端Session状态的存储
  准备工作
  
    为了您能更好的体验到实验现象,您可以建立一个叫做SessionState.aspx的页面,然后把以下这些代码添加到<body></body>中。
  
  
  <scriptrunat="server">
  Sub Session_Add(sender As Object, e As EventArgs)
    Session("MySession") = text1.Value
    span1.InnerHtml = "Session data updated! <P>Your session contains: <font color=red>" &
             Session("MySession").ToString() & "</font>"
  End Sub
  
  Sub CheckSession(sender As Object, eAs EventArgs)
    If (Session("MySession")Is Nothing) Then
      span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
    Else
      span1.InnerHtml = "Your session contains: <font color=red>" &
               Session("MySession").ToString() & "</font>"
  End If
  End Sub
  </script>
  <formrunat="server"id="Form2">
    <inputid="text1"type="text"runat="server"name="text1">
    <inputtype="submit"runat="server"OnServerClick="Session_Add"
        value="Add to Session State" id="Submit1"name="Submit1">
    <inputtype="submit"runat="server"OnServerClick="CheckSession"
        value="View Session State" id="Submit2"name="Submit2">
  </form>
  <hrsize="1">
  <fontsize="6"><spanid="span1"runat="server" /></font>
  
    这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了Session信息。
  
  将服务器Session信息存储在进程中
    让我们来回到Web.config文件的刚才那段段落中:
  
  <sessionState
    mode="InProc"
    stateConnectionString="tcpip=127.0.0.1:42424"
    sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
    cookieless="false"
    timeout="20"
  />
    当mode的值是InProc时,说明服务器正在使用这种模式。
  
    这种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。
  
    好了,现在让我们做个试验。打开刚才的SessionState.aspx页面,随便输入一些字符,使其存储在Session中。然后,让我们让IIS重起。注意,并不是使当前的站点停止再开始,而是在IIS中本机的机器名的节点上点击鼠标右键,选择重新启动IIS。(想当初使用NT4时,重新启动IIS必须要重新启动计算机才行,微软真是@#$%^&)返回到SessionState.aspx页面中,检查刚才的Session信息,发现信息已经丢失了。
  
  将服务器Session信息存储在进程外
    首先,让我们来打开管理工具->服务,找到名为:ASP.NET State Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。
  
    然后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。
  
    实际上,这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString="tcpip=192.168.0.2:42424"。当然,不要忘记在192.168.0.2的计算机中装上.NET Framework,并且启动ASP.NET State Services服务。
  
  将服务器Session信息存储在SQL Server中
    首先,还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:
  
  [system drive]winntMicrosoft.NETFramework[version]
    然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。
  
    接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:
  
  sqlConnectionString="data source=localhost; Integrated Security=SSPI;"
    其中data source是指SQL Server服务器的IP地址,如果SQL Server与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的SQL Server验证方式更好的安全性。当然,如果SQL Server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。
  
    同样,让我们做个试验。向SessionState.aspx中添加Session信息,这时发现Session信息已经存在SQL Server中了,即使你重起计算机,刚才的Session信息也不会丢失。现在,你已经完全看见了Session信息到底是什么样子的了,而且又是存储在SQL Server中的,能干什么就看你的发挥了,哈哈。
  
  总结
    通过这篇文章,你可以看到在Session的管理和维护上,ASP.NET比ASP有了很大的进步,我们可以更加随意的挑选适合的方法了。对于企业级的应用来说,这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下,新一代的电子商务平台将会搭建的更好!
  
    同时,大家也会发现,在这个整个技术中包括了操作系统、Web服务及数据库多种技术的整合。我相信,也许Windows没有Unix稳定,IIS没有Apache稳定,SQL Server也没有Oracle强大,但是,谁可以将他们如此完美的联动到一起呢?所以说,虽然微软每一方面都不是太强,但是如果把微软的东西都整合到一起,谁敢说他不强大呢?微软就是微软! 
  

作者: heallven   www.ASPCool.com 时间:2004-8-28 21:49:50  


Blueis 发表于:2005.03.23 19:23 ::分类: ( C#&ASP.NET ) ::阅读:(107860次) :: 评论 (11)
===========================================================
Win2003创建WEB应用程序出现错误的解决办法
===========================================================

在创建WEB应用程序的时候报错:
此项目的默认Web访问模式设置为文件共享,但是无法从路径“d:inetputwwwrootWebApplication1”打开“Http://localhost/WebApplication1”处的项目文件夹。返回的错误是:
无法创建WEB项目“WebApplication1”。文件路径“d:inetputwwwrootWebApplication1”与URL“Http://localhost/WebApplication1”不符,这两者需要映射到相同的服务器。HTTP错误404:Not Found


解决:

可参考 http://dev.csdn.net/article/29/29627.shtm

或者

1。打开IIS管理器。

2。右键点击"Default Web Site"并选择Properties.

3。 点击"Http Header".

4。 点击"MIME Types".

5。 点击“New”。

6。 在Extension中,输入".tmp". (不需要引号)

7。 在MIME Type中,输入 "Temp". (不需要引号)

还有一种解决方法,您可以使用下面的命令行:

%systemdrive%inetpubadminscriptsadsutil.vbs set w3svc/1/root/MimeMap .tmp,temp

在创建Web Application时,VS.Net需要在创建路径下创建后缀名为.tmp的临时文件。
当VS.Net创建好项目之后,就会以HTTP的方式向Web文件夹寻求项目文件,同时也寻求临时文件。由于windows2003在某些安装步骤下的IIS没有把.tmp文件设置为MIME类型,所以IIS向VS.Net返回了未知文件类型的错误,即找不到文件。所以VS.Net认为你的IIS路径设置不对。


Blueis 发表于:2005.03.23 01:31 ::分类: ( C#&ASP.NET ) ::阅读:(1029次) :: 评论 (0)
===========================================================
在.NET中杀死Word,Excel等进程
===========================================================
private void KillProcess(string processName)
{
System.Diagnostics.Process myproc= new System.Diagnostics.Process();
//得到所有打开的进程
    try{
    foreach (Process thisproc in Process.GetProcessesByName(processName)) {
       if(!thisproc.CloseMainWindow()){
 thisproc.Kill();
 }
        }
      }
    catch(Exception Exc)
    {
        msg.Text+= "杀死" + processName + "失败!";
    }
}
Blueis 发表于:2005.03.23 01:30 ::分类: ( C#&ASP.NET ) ::阅读:(1354次) :: 评论 (0)
===========================================================
Windows 窗体 DataGrid 控件添加表和列
===========================================================

通过创建 DataGridTableStyle 对象,并将它们添加到 GridTableStylesCollection 对象(通过 DataGrid 控件的 TableStyles 属性访问),可以表和列的形式在 Windows 窗体 DataGrid 控件中显示数据。每个表样式显示在 DataGridTableStyle 对象的 MappingName 属性中指定的任意数据表的内容。默认情况下,未指定列样式的表样式将显示该数据表中的所有列。通过将 DataGridColumnStyle 对象添加到 GridColumnStylesCollection 对象(通过各 DataGridTableStyle 对象的 GridColumnStyles 属性访问),可以限制所显示的表中的列。

在设计器中向 DataGrid 控件添加表

为在表中显示数据,必须首先将 DataGrid 控件绑定到数据集。有关更多信息,请参阅将 Windows 窗体 DataGrid 控件绑定到数据源。
在“属性”窗口中选择 DataGrid 控件的 TableStyles 属性,然后单击该属性旁边的省略号按钮 (),即可显示 DataGridTableStyle 集合编辑器。
在集合编辑器中,单击“添加”按钮以插入表样式。
单击“确定”关闭集合编辑器,然后单击 TableStyles 属性旁边的省略号按钮将其重新打开。
在重新打开集合编辑器后,绑定到该控件的所有数据表都会显示在该表样式的 MappingName 属性的下拉列表中。

在集合编辑器的“成员”框中,单击该表样式。
在集合编辑器的“属性”框中,选择要显示的表的 MappingName 值。
在设计器中向 DataGrid 控件添加列

在 DataGridTableStyle 集合编辑器的“成员”框中,选择适当的表样式。在集合编辑器的“属性”框中,选择 GridColumnStyles 集合,然后单击该属性旁边的省略号按钮()以显示 DataGridColumnStyle 集合编辑器。
在集合编辑器中,单击“添加”按钮以插入列样式或单击“添加”按钮旁边的向下箭头以指定列类型。下拉框将允许您选择“DataGridTextBoxColumn”或“DataGridBoolColumn”类型。
单击“确定”以关闭 DataGridColumnStyle 集合编辑器,然后单击 GridColumnStyles 属性旁边的省略号按钮将其重新打开。
在重新打开集合编辑器后,绑定数据表中的所有数据列都会显示在该列样式的 MappingName 属性的下拉列表中。

在集合编辑器的“成员”框中,单击该列样式。
在集合编辑器的“属性”框中,选择要显示的列的 MappingName 值。
以编程方式向 DataGrid 添加表和列

警告 当以编程方式指定列样式时,在向 GridTableStylesCollection 对象添加 DataGridTableStyle 对象之前,请务必先创建 DataGridColumnStyle 对象并将其添加到 GridColumnStylesCollection 对象中。当将空的 DataGridTableStyle 对象添加到集合时,会自动生成 DataGridColumnStyle 对象。因此,如果试图向 GridColumnStylesCollection 对象添加具有重复的 MappingName 值的新 DataGridColumnStyle 对象,则会引发异常。
为在表中显示数据,必须首先将 DataGrid 控件绑定到数据集。有关更多信息,请参阅将 Windows 窗体 DataGrid 控件绑定到数据源。
声明新的表样式并设置其映射名称。
'Visual Basic
Dim ts1 as New DataGridTableStyle()
ts1.MappingName = "Customers"

// C#
DataGridTableStyle ts1 = new DataGridTableStyle();
ts1.MappingName = "Customers";
声明新的列样式并设置其映射名称及其他属性。
'Visual Basic
Dim myDataCol As New DataGridBoolColumn()
myDataCol.HeaderText = "My New Column"
myDataCol.MappingName = "Current"

// C#
DataGridBoolColumn myDataCol = new DataGridBoolColumn();
myDataCol.HeaderText = "My New Column";
myDataCol.MappingName = "Current";
调用 GridColumnStylesCollection 对象的 Add 方法以将该列添加到表样式中
'Visual Basic
ts1.GridColumnStyles.Add(myDataCol)

// C#
ts1.GridColumnStyles.Add(myDataCol);
调用 GridTableStylesCollection 对象的 Add 方法以将表样式添加到数据网格中。
'Visual Basic
DataGrid1.TableStyles.Add(ts1)

// C#
dataGrid1.TableStyles.Add(ts1);


Blueis 发表于:2005.03.22 12:23 ::分类: ( C#&ASP.NET ) ::阅读:(2165次) :: 评论 (2)
===========================================================
访问基于 SQL 的数据
===========================================================

应用程序一般需要对 SQL 数据库执行一个或多个选择、插入、更新或删除查询。下表显示上述每个查询的示例。

查询  示例 
简单选择  SELECT * from Employees WHERE FirstName = 'Bradley'; 
联接选择  SELECT * from Employees E, Managers M WHERE E.FirstName = M.FirstName; 
插入  INSERT into Employees VALUES ('123-45-6789','Bradley','Millington','Program Manager'); 
更新  UPDATE Employees SET Title = 'Development Lead' WHERE FirstName = 'Bradley'; 
删除  DELETE from Employees WHERE Productivity < 10; 

为了使页能够访问执行 SQL 数据访问所需的类,必须将 System.Data 和 System.Data.SqlClient 命名空间导入到页中。


<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

若要对 SQL 数据库执行选择查询,请创建与数据库的 SqlConnection,传递连接字符串,然后构造包含查询语句的 SqlDataAdapter 对象。若要用查询结果填充 DataSet 对象,请调用命令的 Fill 方法。


C#
*********************************************
SqlConnection myConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes");
SqlDataAdapter myCommand = new SqlDataAdapter("select * from Authors", myConnection);

DataSet ds = new DataSet();
myCommand.Fill(ds, "Authors");
*******************************************

VB
*******************************************
Dim myConnection As New SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes")
Dim myCommand As New SqlDataAdapter("select * from Authors", myConnection)

Dim ds As New DataSet()
myCommand.Fill(ds, "Authors")
*******************************************

JScript
*******************************************
var myConnection:SqlConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes");
var myCommand:SqlDataAdapter = new SqlDataAdapter("select * from Authors", myConnection);

var ds:DataSet = new DataSet();
myCommand.Fill(ds, "Authors");
*******************************************

正如本节前面所提到的,使用数据集的好处是它为您提供了断开连接的数据库视图。可以在应用程序中操作数据集,然后在以后协调更改和实际的数据库。对于长期运行的应用程序,这通常是最好的方法。对于 Web 应用程序,通常对每个请求执行短操作(一般只是显示数据)。通常不需要在一系列请求间保持 DataSet 对象。对于这类情况,可以使用 SqlDataReader。

SqlDataReader 对从 SQL 数据库检索的数据提供仅向前的只读指针。若要使用 SqlDataReader,请声明 SqlCommand 而不是 SqlDataAdapter。SqlCommand 公开返回 SqlDataReader 的 ExecuteReader 方法。还请注意,当使用 SqlCommand 时,必须显式打开和关闭 SqlConnection。调用 ExecuteReader 后,SqlDataReader 可以绑定到 ASP.NET 服务器控件,正如将在下一节看到的。

C#
*******************************************
SqlConnection myConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes");
SqlCommand myCommand = new SqlCommand("select * from Authors", myConnection);

myConnection.Open();


SqlDataReader dr = myCommand.ExecuteReader();

...

myConnection.Close();
*******************************************

VB
*******************************************
Dim myConnection As SqlConnection = New SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes")
Dim myCommand As SqlCommand = New SqlCommand("select * from Authors", myConnection)

myConnection.Open()


Dim dr As SqlDataReader = myCommand.ExecuteReader()

...

myConnection.Close()
*******************************************

JScript
*******************************************
var myConnection:SqlConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes");
var myCommand:SqlCommand = new SqlCommand("select * from Authors", myConnection);

myConnection.Open();

var dr : SqlDataReader;
dr = myCommand.ExecuteReader();

...

myConnection.Close();
*******************************************

当执行不要求返回数据的命令(如插入、更新和删除)时,也使用 SqlCommand。该命令通过调用 ExecuteNonQuery 方法发出,而该方法返回受影响的行数。注意当使用 SqlCommand 时,必须显式打开连接;SqlDataAdapter 自动为您处理如何打开连接。


C#
*******************************************
SqlConnection myConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes");
SqlCommand myCommand = new SqlCommand(
                   "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'",
                    myConnection);

myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
*******************************************

VB
*******************************************
Dim myConnection As New SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes")
Dim myCommand As New SqlCommand( _
                   "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'",  _
                    myConnection)

myCommand.Connection.Open()
myCommand.ExecuteNonQuery()
myCommand.Connection.Close()
*******************************************

JScript
*******************************************
var myConnection:SqlConnection = new SqlConnection("server=(local)NetSDK;database=pubs;Trusted_Connection=yes");
var myCommand:SqlCommand = new SqlCommand(
                   "UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'",
                    myConnection);

myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
*******************************************
 
重要说明:始终记住在页完成执行之前关闭与数据模型的连接。如果不关闭连接,则可能会在等待页实例被垃圾回收处理期间不经意地超过连接限制。


Blueis 发表于:2005.03.22 12:17 ::分类: ( 初始分类 ) ::阅读:(409次) :: 评论 (0)
===========================================================
取数据库列表
===========================================================
string str[]
for int i = 1 to OleDbDataAdapter1.TableMappings.count
str = OleDbDataAdapter1.TableMappings.Item(i).DataSetTable()
next
Blueis 发表于:2005.03.22 12:06 ::分类: ( 初始分类 ) ::阅读:(520次) :: 评论 (0)
===========================================================
正则表达式
===========================================================

  多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。
  
  此外,regexp类还能够完成一些其他的功能,例如从右至左的结合模式和表达式的编辑等。
  
  在这篇文章中,我将简要地介绍System.Text.RegularExpression中的类和方法、一些字符串匹配和替换的例子以及组结构的详细情况,最后,还会介绍一些你可能会用到的常见的表达式。
  
应该掌握的基础知识

  规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中,我们将假定你已经掌握了规则表达式的用法,尤其是Perl 5中表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集,因此,从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和.NET架构的基本知识。
  
  如果你没有规则表达式方面的知识,我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里·弗雷德尔编写的《掌握表达式》一书,对于希望深刻理解表达式的读者,我们强烈建议阅读这本书。
  
RegularExpression组合体

  regexp规则类包含在System.Text.RegularExpressions.dll文件中,在对应用软件进行编译时你必须引用这个文件,例如:

csc r:System.Text.RegularExpressions.dll foo.cs

命令将创建foo.exe文件,它就引用了System.Text.RegularExpressions文件。
  
名字空间简介

  在名字空间中仅仅包含着6个类和一个定义,它们是:
  
  Capture: 包含一次匹配的结果;
  CaptureCollection: Capture的序列;
  Group: 一次组记录的结果,由Capture继承而来;
  Match: 一次表达式的匹配结果,由Group继承而来;
  MatchCollection: Match的一个序列;
  MatchEvaluator: 执行替换操作时使用的代理;
  Regex: 编译后的表达式的实例。

  Regex类中还包含一些静态的方法:

  Escape: 对字符串中的regex中的转义符进行转义;
  IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值;
  Match: 返回Match的实例;
  Matches: 返回一系列的Match的方法;
  Replace: 用替换字符串替换匹配的表达式;
  Split: 返回一系列由表达式决定的字符串;
  Unescape:不对字符串中的转义字符转义。
  
简单匹配

  我们首先从使用Regex、Match类的简单表达式开始学习。
  
Match m = Regex.Match("abracadabra", "(a|b|r)+");
  
我们现在有了一个可以用于测试的Match类的实例,例如:if (m.Success)...
如果想使用匹配的字符串,可以把它转换成一个字符串:
  
Console.WriteLine("Match="+m.ToString());
  
这个例子可以得到如下的输出: Match=abra。这就是匹配的字符串了。
  
字符串的替换

  简单字符串的替换非常直观。例如下面的语句:
  
string s = Regex.Replace("abracadabra", "abra", "zzzz");
  
它返回字符串zzzzcadzzzz,所有匹配的字符串都被替换成了zzzzz。

  现在我们来看一个比较复杂的字符串替换的例子:
  
string s = Regex.Replace(" abra ", @"^s*(.*?)s*$", "$1");
  
这个语句返回字符串abra,其前导和后缀的空格都去掉了。
  
  上面的模式对于删除任意字符串中的前导和后续空格都非常有用。在C#中,我们还经常使用字母字符串,在一个字母字符串中,编译程序不把字符“ ” 作为转义字符处理。在使用字符“”指定转义字符时,@"..."是非常有用的。另外值得一提的是$1在字符串替换方面的使用,它表明替换字符串只能包含被替换的字符串。
  
匹配引擎的细节

  现在,我们通过一个组结构来理解一个稍微复杂的例子。看下面的例子:
  
string text = "abracadabra1abracadabra2abracadabra3";
  
    string pat = @"
  
      ( # 第一个组的开始
  
       abra # 匹配字符串abra
  
       ( # 第二个组的开始
  
       cad # 匹配字符串cad
  
       )? # 第二个组结束(可选)
  
      ) # 第一个组结束
  
      + # 匹配一次或多次
  
      ";
  
    //利用x修饰符忽略注释
  
    Regex r = new Regex(pat, "x");
  
    //获得组号码的清单
  
    int[] gnums = r.GetGroupNumbers();
  
    //首次匹配
  
    Match m = r.Match(text);
  
    while (m.Success)
  
     {
  
    //从组1开始
  
     for (int i = 1; i < gnums.Length; i++)
  
      {
  
      Group g = m.Group(gnums[i]);
  
    //获得这次匹配的组
  
      Console.WriteLine("Group"+gnums[i]+"=["+g.ToString()+"]");
  
    //计算这个组的起始位置和长度
  
      CaptureCollection cc = g.Captures;
  
      for (int j = 0; j < cc.Count; j++)
  
       {
  
       Capture c = cc[j];
  
       Console.WriteLine(" Capture" + j + "=["+c.ToString()
  
         + "] Index=" + c.Index + " Length=" + c.Length);
  
       }
  
      }
  
    //下一个匹配
  
     m = m.NextMatch();
  
     }
  
 这个例子的输出如下所示:
     
    Group1=[abra]
  
        Capture0=[abracad] Index=0 Length=7
  
        Capture1=[abra] Index=7 Length=4
  
    Group2=[cad]
  
        Capture0=[cad] Index=4 Length=3
  
    Group1=[abra]
  
        Capture0=[abracad] Index=12 Length=7
  
        Capture1=[abra] Index=19 Length=4
  
    Group2=[cad]
  
        Capture0=[cad] Index=16 Length=3
  
    Group1=[abra]
  
        Capture0=[abracad] Index=24 Length=7
  
        Capture1=[abra] Index=31 Length=4
  
    Group2=[cad]
  
        Capture0=[cad] Index=28 Length=3

  我们首先从考查字符串pat开始,pat中包含有表达式。第一个capture是从第一个圆括号开始的,然后表达式将匹配到一个abra。第二个capture组从第二个圆括号开始,但第一个capture组还没有结束,这意味着第一个组匹配的结果是abracad ,而第二个组的匹配结果仅仅是cad。因此如果通过使用?符号而使cad成为一项可选的匹配,匹配的结果就可能是abra或abracad。然后,第一个组就会结束,通过指定+符号要求表达式进行多次匹配。
  
  现在我们来看看匹配过程中发生的情况。首先,通过调用Regex的constructor方法建立表达式的一个实例,并在其中指定各种选项。在这个例子中,由于在表达式中有注释,因此选用了x选项,另外还使用了一些空格。打开x选项,表达式将会忽略注释和其中没有转义的空格。
  
  然后,取得表达式中定义的组的编号的清单。你当然可以显性地使用这些编号,在这里使用的是编程的方法。如果使用了命名的组,作为一种建立快速索引的途径这种方法也十分有效。
  
  接下来是完成第一次匹配。通过一个循环测试当前的匹配是否成功,接下来是从group 1开始重复对组清单执行这一操作。在这个例子中没有使用group 0的原因是group 0是一个完全匹配的字符串,如果要通过收集全部匹配的字符串作为一个单一的字符串,就会用到group 0了。
  
  我们跟踪每个group中的CaptureCollection。通常情况下每次匹配、每个group中只能有一个capture,但本例中的Group1则有两个capture:Capture0和Capture1。如果你仅需要Group1的ToString,就会只得到abra,当然它也会与abracad匹配。组中ToString的值就是其CaptureCollection中最后一个Capture的值,这正是我们所需要的。如果你希望整个过程在匹配abra后结束,就应该从表达式中删除+符号,让regex引擎知道我们只需要对表达式进行匹配。
  
基于过程和基于表达式方法的比较

  一般情况下,使用规则表达式的用户可以分为以下二大类:第一类用户尽量不使用规则表达式,而是使用过程来执行一些需要重复的操作;第二类用户则充分利用规则表达式处理引擎的功能和威力,而尽可能少地使用过程。
  
  对于我们大多数用户而言,最好的方案莫过于二者兼而用之了。我希望这篇文章能够说明.NET语言中regexp类的作用以及它在性能和复杂性之间的优、劣点。
  
基于过程的模式

  我们在编程中经常需要用到的一个功能是对字符串中的一部分进行匹配或其他一些对字符串处理,下面是一个对字符串中的单词进行匹配的例子:

string text = "the quick red fox jumped over the lazy brown dog.";
  
    System.Console.WriteLine("text=[" + text + "]");
  
    string result = "";
  
    string pattern = @"w+|W+";
  
    foreach (Match m in Regex.Matches(text, pattern))
  
     {
  
    // 取得匹配的字符串
  
     string x = m.ToString();
  
    // 如果第一个字符是小写
  
     if (char.IsLower(x[0]))
  
    // 变成大写
  
      x = char.ToUpper(x[0]) + x.Substring(1, x.Length-1);
  
    // 收集所有的字符
  
     result += x;
  
     }
  
    System.Console.WriteLine("result=[" + result + "]");
  
   正象上面的例子所示,我们使用了C#语言中的foreach语句处理每个匹配的字符,并完成相应的处理,在这个例子中,新创建了一个result字符串。这个例子的输出所下所示:
  
  text=[the quick red fox jumped over the lazy brown dog.]
  
  result=[The Quick Red Fox Jumped Over The Lazy Brown Dog.]
  
基于表达式的模式

  完成上例中的功能的另一条途径是通过一个MatchEvaluator,新的代码如下所示:
  
static string CapText(Match m)
  
      {
  
    //取得匹配的字符串
  
      string x = m.ToString();
  
    // 如果第一个字符是小写
  
      if (char.IsLower(x[0]))
  
    // 转换为大写
  
       return char.ToUpper(x[0]) + x.Substring(1, x.Length-1);
  
      return x;
  
      }
  
      
  
     static void Main()
  
      {
  
      string text = "the quick red fox jumped over the
  
       lazy brown dog.";
  
      System.Console.WriteLine("text=[" + text + "]");
  
      string pattern = @"w+";
  
      string result = Regex.Replace(text, pattern,
  
     new MatchEvaluator(Test.CapText));
  
      System.Console.WriteLine("result=[" + result + "]");
  
      }
  
  同时需要注意的是,由于仅仅需要对单词进行修改而无需对非单词进行修改,这个模式显得非常简单。
解读 C# 中的正则表达式
作者:刘彦青  时间:2004-1-15  文档类型:翻译  来自:蓝色理想
浏览统计 year:5897 | Quarter:572 | Month:572 | Week:30 | today:8

 第 1 页 解读 C# 中的正则表达式
 第 2 页 常用表达式

 
 
 
常用表达式
  为了能够更好地理解如何在C#环境中使用规则表达式,我写出一些对你来说可能有用的规则表达式,这些表达式在其他的环境中都被使用过,希望能够对你有所帮助。
  
罗马数字

string p1 = "^m*(d?c{0,3}|c[dm])" + "(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$";
  
    string t1 = "vii";
  
    Match m1 = Regex.Match(t1, p1);
  
交换前二个单词

string t2 = "the quick brown fox";
  
    string p2 = @"(S+)(s+)(S+)";
  
    Regex x2 = new Regex(p2);
  
    string r2 = x2.Replace(t2, "$3$2$1", 1);
  
关健字=值

string t3 = "myval = 3";
  
    string p3 = @"(w+)s*=s*(.*)s*$";
  
    Match m3 = Regex.Match(t3, p3);
  
实现每行80个字符

string t4 = "********************"
  
     + "******************************"
  
     + "******************************";
  
    string p4 = ".{80,}";
  
    Match m4 = Regex.Match(t4, p4);
  
月/日/年 小时:分:秒的时间格式

string t5 = "01/01/01 16:10:01";
  
    string p5 = @"(d+)/(d+)/(d+) (d+):(d+):(d+)";
  
    Match m5 = Regex.Match(t5, p5);
  
改变目录(仅适用于Windows平台)

string t6 = @"C:Documents and Settingsuser1Desktop";
  
  string r6 = Regex.Replace(t6,@"user1", @"user2");
  
扩展16位转义符

string t7 = "%41"; // capital A
  
    string p7 = "%([0-9A-Fa-f][0-9A-Fa-f])";
  
    string r7 = Regex.Replace(t7, p7, HexConvert);
  
删除C语言中的注释(有待完善)

string t8 = @"
  
    /*
  
     * 传统风格的注释
  
     */
  
    ";
  
    string p8 = @"
  
     /* # 匹配注释开始的定界符
  
     .*? # 匹配注释
  
     */ # 匹配注释结束定界符
  
    ";
  
    string r8 = Regex.Replace(t8, p8, "", "xs");
  
删除字符串中开始和结束处的空格

string t9a = " leading";
  
    string p9a = @"^s+";
  
    string r9a = Regex.Replace(t9a, p9a, "");
  
    string t9b = "trailing ";
  
    string p9b = @"s+$";
  
    string r9b = Regex.Replace(t9b, p9b, "");
  
在字符后添加字符n,使之成为真正的新行

string t10 = @"ntestn";
  
    string r10 = Regex.Replace(t10, @" ", "n");
  
转换IP地址

string t11 = "55.54.53.52";
  
    string p11 = "^" +
  
     @"([01]?dd|2[0-4]d|25[0-5])." +
  
     @"([01]?dd|2[0-4]d|25[0-5])." +
  
     @"([01]?dd|2[0-4]d|25[0-5])." +
  
     @"([01]?dd|2[0-4]d|25[0-5])" +
  
     "$";
  
    Match m11 = Regex.Match(t11, p11);
  
删除文件名包含的路径

string t12 = @"c:file.txt";
  
    string p12 = @"^.*";
  
    string r12 = Regex.Replace(t12, p12, "");
  
联接多行字符串中的行

string t13 = @"this is
  
    a split line";
  
    string p13 = @"s*r?ns*";
  
    string r13 = Regex.Replace(t13, p13, " ");
  
提取字符串中的所有数字

string t14 = @"
  
    test 1
  
    test 2.3
  
    test 47
  
    ";
  
    string p14 = @"(d+.?d*|.d+)";
  
    MatchCollection mc14 = Regex.Matches(t14, p14);
  
找出所有的大写字母

string t15 = "This IS a Test OF ALL Caps";
  
    string p15 = @"(b[^Wa-z0-9_]+b)";
  
    MatchCollection mc15 = Regex.Matches(t15, p15);
  
找出小写的单词

string t16 = "This is A Test of lowercase";
  
    string p16 = @"(b[^WA-Z0-9_]+b)";
  
    MatchCollection mc16 = Regex.Matches(t16, p16);
  
找出第一个字母为大写的单词

string t17 = "This is A Test of Initial Caps";
  
    string p17 = @"(b[^Wa-z0-9_][^WA-Z0-9_]*b)";
  
    MatchCollection mc17 = Regex.Matches(t17, p17);
  
找出简单的HTML语言中的链接


string t18 = @"
  
    <html>
  
    <a href=""first.htm"">first tag text</a>
  
    <a href=""next.htm"">next tag text</a>
  
    </html>
  
    ";
  
    string p18 = @"<A[^>]*?HREFs*=s*[""']?" + @"([^'"" >]+?)[ '""]?>";
  
    MatchCollection mc18 = Regex.Matches(t18, p18, "si");
 

作者:刘彦青


Blueis 发表于:2005.03.22 12:06 ::分类: ( C#&ASP.NET ) ::阅读:(3065次) :: 评论 (0)
===========================================================
网络安全技术
===========================================================

  网络管理包括五个功能:配置管理,故障管理,性能管理,计费管理和安全管理。
  代理位于被管理的设备内部,它把来自管理者的命令或信息请求转换为本设备特有的指令,完成管理者的指示,或返回它所在设备的信息。
  管理者和代理之间的信息交换可以分为两种:从管理者到代理的管理操作;从代理到管理者的事件通知。
  配置管理的目标是掌握和控制网络和系统的配置信息以及网络各设备的状态和连接管理。现代网络设备由硬件和设备驱动组成。
  配置管理最主要的作用是可以增强网络管理者对网络配置的控制,它是通过对设备的配置数据提供快速的访问来实现的。
  故障就是出现大量或严重错误需要修复的异常情况。故障管理是对计算机网络中的问题或故障进行定位的过程。
  故障管理最主要的作用是通过提供网络管理者快速的检查问题并启动恢复过程的工具,使网络的可靠性得到增强。故障标签就是一个监视网络问题的前端进程。
  性能管理的目标是衡量和呈现网络特性的各个方面,使网络的性能维持在一个可以接受的水平上。
  性能管理包括监视和调整两大功能。
  记费管理的目标是跟踪个人和团体用户对网络资源的使用情况,对其收取合理的费用。
  记费管理的主要作用是网络管理者能测量和报告基于个人或团体用户的记费信息,分配资源并计算用户通过网络传输数据的费用,然后给用户开出帐单。
  安全管理的目标是按照一定的方法控制对网络的访问,以保证网络不被侵害,并保证重要的信息不被未授权用户访问。
  安全管理是对网络资源以及重要信息访问进行约束和控制。
  在网络管理模型中,网络管理者和代理之间需要交换大量的管理信息,这一过程必须遵循统一的通信规范,我们把这个通信规范称为网络管理协议。
  网络管理协议是高层网络应用协议,它建立在具体物理网络及其基础通信协议基础上,为网络管理平台服务。
  目前使用的标准网络管理协议包括:简单网络管理协议SNMP,公共管理信息服务/协议CMIS/CMIP,和局域网个人管理协议LMMP等。
  SNMP采用轮循监控方式。代理/管理站模式。
  管理节点一般是面向工程应用的工作站级计算机,拥有很强的处理能力。代理节点可以是网络上任何类型的节点。SNMP是一个应用层协议 ,在TCP/IP网络中,它应用传输层和网络层的服务向其对等层传输信息。
  CMIP的优点是安全性高,功能强大,不仅可用于传输管理数据,还可以执行一定的任务。

  信息安全包括5个基本要素:机密性,完整性,可用性,可控性与可审查性。
  3 D1级。D1级计算机系统标准规定对用户没有验证。例如DOS。WINDOS3。X及WINDOW 95(不在工作组方式中)。Apple的System7。X。
  4 C1级提供自主式安全保护,它通过将用户和数据分离,满足自主需求。
  C1级又称为选择安全保护系统,它描述了一种典型的用在Unix系统上的安全级别。
  C1级要求硬件有一定的安全级别,用户在使用前必须登陆到系统。
  C1级的防护的不足之处在与用户直接访问操作系统的根。
  9 C2级提供比C1级系统更细微的自主式访问控制。为处理敏感信息所需要的最底安全级别。C2级别还包含有受控访问环境,该  环境具有进一步限制用户执行一些命令或访问某些文件的权限,而且还加入了身份验证级别。例如UNIX系统。XENIX。Novell 3。0或更高版本。WINDOWS NT。
  10 B1级称为标记安全防护,B1级支持多级安全。标记是指网上的一个对象在安全保护计划中是可识别且受保护的。B1级是第一种需要大量访问控制支持的级别。安全级别存在保密,绝密级别。
  11 B2又称为结构化保护,他要求计算机系统中的所有对象都要加上标签,而且给设备分配安全级别。B2级系统的关键安全硬件/软件部件必须建立在一个形式的安全方法模式上。
  12 B3级又叫安全域,要求用户工作站或终端通过可信任途径连接到网络系统。而且这一级采用硬件来保护安全系统的存储区。
  B3级系统的关键安全部件必须理解所有客体到主体的访问,必须是防窜扰的,而且必须足够小以便分析与测试。
  30 A1 最高安全级别,表明系统提供了最全面的安全,又叫做验证设计。所有来自构成系统的部件来源必须有安全保证,以此保证系统的完善和安全,安全措施还必须担保在销售过程中,系统部件不受伤害。

  网络安全从本质上讲就是网络上的信息安全。凡是涉及到网络信息的保密性,完整性,可用性,真实性和可控性的相关技术和理论都是网络安全的研究领域。
  安全策约是在一个特定的环境里,为保证提供一定级别的安全保护所必须遵守的规则。安全策约模型包括了建立安全环境的三个重要组成部分:威严的法律,先进的技术和严格的管理。
  网络安全是网络系统的硬件,软件以及系统中的数据受到保护,不会由于偶然或恶意的原因而遭到破坏,更改,泄露,系统能连续,可靠和正常的运行,网络服务不中断。
  保证安全性的所有机制包括以下两部分:
  1 对被传送的信息进行与安全相关的转换。
  2 两个主体共享不希望对手得知的保密信息。
  安全威胁是某个人,物,事或概念对某个资源的机密性,完整性,可用性或合法性所造成的危害。某种攻击就是某种威胁的具体实现。
  安全威胁分为故意的和偶然的两类。故意威胁又可以分为被动和主动两类。
  中断是系统资源遭到破坏或变的不能使用。这是对可用性的攻击。
  截取是未授权的实体得到了资源的访问权。这是对保密性的攻击。
  修改是未授权的实体不仅得到了访问权,而且还篡改了资源。这是对完整性的攻击。
  捏造是未授权的实体向系统中插入伪造的对象。这是对真实性的攻击。
  被动攻击的特点是偷听或监视传送。其目的是获得正在传送的信息。被动攻击有:泄露信息内容和通信量分析等。
  主动攻击涉及修改数据流或创建错误的数据流,它包括假冒,重放,修改信息和拒绝服务等。
  假冒是一个实体假装成另一个实体。假冒攻击通常包括一种其他形式的主动攻击。 重放涉及被动捕获数据单元以及后来的重新发送,以产生未经授权的效果。
  修改消息意味着改变了真实消息的部分内容,或将消息延迟或重新排序,导致未授权的操作。
  拒绝服务的禁止对通信工具的正常使用或管理。这种攻击拥有特定的目标。另一种拒绝服务的形式是整个网络的中断,这可以通 过使网络失效而实现,或通过消息过载使网络性能降低。
  防止主动攻击的做法是对攻击进行检测,并从它引起的中断或延迟中恢复过来。
  从网络高层协议角度看,攻击方法可以概括为:服务攻击与非服务攻击。
  服务攻击是针对某种特定网络服务的攻击。
  非服务攻击不针对某项具体应用服务,而是基于网络层等低层协议进行的。
  非服务攻击利用协议或操作系统实现协议时的漏洞来达到攻击的目的,是一种更有效的攻击手段。
  网络安全的基本目标是实现信息的机密性,完整性,可用性和合法性。
  主要的可实现威胁:
  3 渗入威胁:假冒,旁路控制,授权侵犯。
  4 植入威胁:特洛伊木马,陷门。
  病毒是能够通过修改其他程序而感染它们的一种程序,修改后的程序里面包含了病毒程序的一个副本,这样它们就能继续感染其他程序。
  网络反病毒技术包括预防病毒,检测病毒和消毒三种技术。
  1 预防病毒技术。
  它通过自身长驻系统内存,优先获得系统的控制权,监视和判断系统中是或有病毒存在,进而阻止计算机病毒进入计算机系统对系统进行破坏。这类技术有:加密可执行程序,引导区保护,系统监控与读写控制。
  2.检测病毒技术。
  通过对计算机病毒的特征来进行判断的技术。如自身效验,关键字,文件长度的变化等。
  3.消毒技术。
  通过对计算机病毒的分析,开发出具有删除病毒程序并恢复原元件的软件。
  网络反病毒技术的具体实现方法包括对网络服务器中的文件进行频繁地扫描和检测,在工作站上用防病毒芯片和对网络目录以及文件设置访问权限等。
  网络信息系统安全管理三个原则:
  1 多人负责原则。
  2 任期有限原则。
  3 职责分离原则。

保密学是研究密码系统或通信安全的科学,它包含两个分支:密码学和密码分析学。
  需要隐藏的消息叫做明文。明文被变换成另一种隐藏形式被称为密文。这种变换叫做加密。加密的逆过程叫组解密。对明文进行加密所采用的一组规则称为加密算法。对密文解密时采用的一组规则称为解密算法。加密算法和解密算法通常是在一组密钥控制下进行的,加密算法所采用的密钥成为加密密钥,解密算法所使用的密钥叫做解密密钥。
  密码系统通常从3个独立的方面进行分类:
  1 按将明文转化为密文的操作类型分为:置换密码和易位密码。
  所有加密算法都是建立在两个通用原则之上:置换和易位。
  2 按明文的处理方法可分为:分组密码(块密码)和序列密码(流密码)。
  3 按密钥的使用个数分为:对称密码体制和非对称密码体制。
  如果发送方使用的加密密钥和接受方使用的解密密钥相同,或从其中一个密钥易于的出另一个密钥,这样的系统叫做对称的,但密钥或常规加密系统。如果发送放使用的加密密钥和接受方使用的解密密钥不相同,从其中一个密钥难以推出另一个密钥,这样的系统就叫做不对称的,双密钥或公钥加密系统。
  分组密码的加密方式是首先将明文序列以固定长度进行分组,每一组明文用相同的密钥和加密函数进行运算。
  分组密码设计的核心上构造既具有可逆性又有很强的线性的算法。
  序列密码的加密过程是将报文,话音,图象,数据等原始信息转化成明文数据序列,然后将它同密钥序列进行异或运算。生成密文序列发送给接受者。
  数据加密技术可以分为3类:对称型加密,不对称型加密和不可逆加密。
  对称加密使用单个密钥对数据进行加密或解密。
  不对称加密算法也称为公开加密算法,其特点是有两个密钥,只有两者搭配使用才能完成加密和解密的全过程。
  不对称加密的另一用法称为“数字签名”,既数据源使用其私有密钥对数据的效验和或其他与数据内容有关的变量进行加密,而数据接受方则用相应的公用密钥解读“数字签名”,并将解读结果用于对数据完整性的检验。
  不可逆加密算法的特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有同样输入的输入数据经过同样的不可逆算法才能得到同样的加密数据。
  加密技术应用于网络安全通常有两种形式,既面向网络和面向应用程序服务。
  面向网络服务的加密技术通常工作在网络层或传输层,使用经过加密的数据包传送,认证网络路由及其其他网络协议所需的信息,从而保证网络的连通性和可用性不受侵害。
  面向网络应用程序服务的加密技术使用则是目前较为流行的加密技术的使用方法。
  从通信网络的传输方面,数据加密技术可以分为3类:链路加密方式,节点到节点方式和端到端方式。
  链路加密方式是一般网络通信安全主要采用的方式。
  节点到节点加密方式是为了解决在节点中数据是明文的缺点,在中间节点里装有加,解密的保护装置,由这个装置来完成一个密钥向另一个密钥的变换。
  在端到端机密方式中,由发送方加密的数据在没有到达最终目的节点之前是不被解密的。
  试图发现明文或密钥的过程叫做密码分析。
  算法实际进行的置换和转换由保密密钥决定。
  密文由保密密钥和明文决定。
  对称加密有两个安全要求:
  1 需要强大的加密算法。
  2 发送方和接受方必须用安全的方式来获得保密密钥的副本。
  常规机密的安全性取决于密钥的保密性,而不是算法的保密性。
  IDEA算法被认为是当今最好最安全的分组密码算法。
  公开密钥加密又叫做非对称加密。
  公钥密码体制有两个基本的模型,一种是加密模型,一种是认证模型。
  通常公钥加密时候使用一个密钥,在解密时使用不同但相关的密钥。
  常规加密使用的密钥叫做保密密钥。公钥加密使用的密钥对叫做公钥或私钥。
  RSA体制被认为是现在理论上最为成熟完善的一种公钥密码体制。
  密钥的生存周期是指授权使用该密钥的周期。
  在实际中,存储密钥最安全的方法就是将其放在物理上安全的地方。
  密钥登记包括将产生的密钥与特定的应用绑定在一起。
  密钥管理的重要内容就是解决密钥的分发问题。
  密钥销毁包括清除一个密钥的所有踪迹。
  密钥分发技术是将密钥发送到数据交换的两方,而其他人无法看到的地方。
  数字证书是一条数字签名的消息,它通常用与证明某个实体的公钥的有效性。数字证书是一个数字结构,具有一种公共的格式,  它将某一个成员的识别符和一个公钥值绑定在一起。人们采用数字证书来分发公钥。
  序列号:由证书颁发者分配的本证书的唯一标示符。


认证是防止主动攻击的重要技术,它对于开放环境中的各种信息系统的安全有重要作用。
  认证是验证一个最终用户或设备的声明身份的过程。
  主要目的为:
  4 验证信息的发送者是真正的,而不是冒充的,这称为信源识别。
  5 验证信息的完整性,保证信息在传送过程中未被窜改,重放或延迟等。
  认证过程通常涉及加密和密钥交换。
  帐户名和口令认证方式是最常用的一种认证方式。
  授权是把访问权授予某一个用户,用户组或指定系统的过程。
  访问控制是限制系统中的信息只能流到网络中的授权个人或系统。
  有关认证使用的技术主要有:消息认证,身份认证和数字签名。
  消息认证的内容包括为:
  1 证实消息的信源和信宿。
  2 消息内容是或曾受到偶然或有意的篡改。
  3 消息的序号和时间性。
  消息认证的一般方法为:产生一个附件。
  身份认证大致分为3类:
  1 个人知道的某种事物。
  2 个人持证
  3 个人特征。
  口令或个人识别码机制是被广泛研究和使用的一种身份验证方法,也是最实用的认证系统所依赖的一种机制。
  为了使口令更加安全,可以通过加密口令或修改加密方法来提供更强健的方法,这就是一次性口令方案,常见的有S/KEY和令牌口令认证方案。
  持证为个人持有物。
  数字签名的两种格式:
  2 经过密码变换的被签名信息整体。
  3 附加在被签消息之后或某个特定位置上的一段签名图样。
  对与一个连接来说,维持认证的唯一办法是同时使用连接完整性服务。
  防火墙总体上分为包过滤,应用级网关和代理服务等几大类型。
  数据包过滤技术是在网络层对数据包进行选择。
  应用级网关是在网络应用层上建立协议过滤和转发功能。
  代理服务也称链路级网关或TCP通道,也有人将它归于应用级网关一类。
  防火墙是设置在不同网络或网络安全域之间的一系列不见的组合。它可以通过检测,限制,更改跨越防火墙的数据流,尽可能的对外部屏蔽网络内部的消息,结构和运行情况,以此来实现网络的安全保护。
  防火墙的设计目标是:
  1 进出内部网的通信量必须通过防火墙。
  2 只有那些在内部网安全策约中定义了的合法的通信量才能进出防火墙。
  3 防火墙自身应该防止渗透。
  防火墙能有效的防止外来的入侵,它在网络系统中的作用是:
  1 控制进出网络的信息流向和信息包。
  2 提供使用和流量的日志和审记。
  3 隐藏内部IP以及网络结构细节。
  4 提供虚拟专用网功能。
  通常有两种设计策约:允许所有服务除非被明确禁止;禁止所有服务除非被明确允许。
  防火墙实现站点安全策约的技术:
  3 服务控制。确定在围墙外面和里面可以访问的INTERNET服务类型。
  4 方向控制。启动特定的服务请求并允许它通过防火墙,这些操作具有方向性。
  5 用户控制。根据请求访问的用户来确定是或提供该服务。
  6 行为控制。控制如何使用某种特定的服务。
  影响防火墙系统设计,安装和使用的网络策约可以分为两级:
  高级的网络策约定义允许和禁止的服务以及如何使用服务。
  低级的网络策约描述了防火墙如何限制和过滤在高级策约中定义的服务。


Blueis 发表于:2005.03.22 12:04 ::分类: ( 初始分类 ) ::阅读:(446次) :: 评论 (0)
===========================================================
存储过程编写经验和优化措施(转载)
===========================================================

一、前言:在经过一段时间的存储过程开发之后,写下了一些开发时候的小结和经验与大家共享,希望对大家有益,主要是针对Sybase和SQL Server数据库,但其它数据库应该有一些共性。
二、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。

三、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。

四、 内容:

1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。

2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。

3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:

a) SQL的使用规范:

i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。

vii. 尽量使用“>=”,不要使用“>”。

viii. 注意一些or子句和union子句之间的替换

ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。

x. 注意存储过程中参数和数据类型的关系。

xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。

b) 索引的使用规范:

i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。

ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

iii. 避免对大表查询时进行table scan,必要时考虑新建索引。

iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。

v. 要注意索引的维护,周期性重建索引,重新编译存储过程。

c) tempdb的使用规范:

i. 尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。

ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。

iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。

iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。

 v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。

 vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。

d) 合理的算法使用:

根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。


Blueis 发表于:2005.03.22 12:02 ::分类: ( 初始分类 ) ::阅读:(424次) :: 评论 (0)
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
网站链接...