陈宝刚---享受生活,追逐梦想!
理想是心中的火焰,有追求的人才是幸福的人!
posts - 458,comments - 45,trackbacks - 0

为了说明问题,这里举一个例子。系统平台是Windows 2000+SQL Server 2000+IIS 5.0+ASP 3,报表采用的是Excel,要求按照给定的报表格式生成图书销售统计的报表,并能够打印。

 功能实现
为了说明问题,这里举一个例子。系统平台是Windows 2000+SQL Server 2000+IIS 5.0+ASP 3,报表采用的是Excel,要求按照给定的报表格式生成图书销售统计的报表,并能够打印。
1. 前言
报表打印通常是管理信息系统中的一个重要模块,而Excel凭借它功能强大、应用灵活、通用性强等的优势在报表打印中获得了广泛的应用。
最初的管理信息系统基本上是采用客户机/服务器(C/S)模式开发的,但随着WWW的广泛应用,目前的管理信息系统已经逐渐开始从C/S模式向浏览器/服务器(B/S)模式转变。B/S模式具有传统C/S模式所不及的很多特点,如更加开放、与软硬件无关、应用扩充和系统维护升级方便等等,目前已成为企业网上首选的计算模式,原先在C/S下的很多软件都开始移植到B/S模式下。由于B/S模式的特殊性,在C/S下相对较易实现的Excel报表打印功能在B/S下却成为一个难点。本文根据在实际的项目中总结的经验,以ASP为例,给出了一个较好的通用方法。
2.1 Excel报表模板的制作
首先根据给定的报表格式,制作一个Excel模板(就是要打印的报表的表格),当然其中需要从数据库中动态统计生成的数据留着空白。这个报表先在Excel中画好,然后保存为模板,存放在起来,这里为\test\book1.xlt。
2.2 Excel报表的生成与打印
这里采用了Excel的Application组件,该组件在安装Excel时安装到系统中。我们的操作也都是针对该组件。
(1) 建立Excel.Application对象
set objExcel=CreateObject("Excel.Application")
(2) 打开Excel模板
objExcel.Workbooks.Open(server.mappath("\test")&"\book1.xlt") '打开Excel模板
objExcel.Sheets(1).select '选中工作页
set sheetActive=objExcel.ActiveWorkbook.ActiveSheet 
(3) Excel的常规添加操作
例如sheetActive.range("g4").value=date() ‘这里添加的是时间,当然也可以是你指定的任何数据
(4) Excel中添加数据库中的纪录
这里假设已有一个数据集adoRset,存放由Sql操作生成的统计数据。
num=7 ‘从Excel的第七行开始
do until adoRset.EOF ‘循环直至数据集中的数据写完
strRange="d"&num&":f"&num ‘设定要填写内容的单元区域
sheetActive.range(strRange).font.size=10 ‘设定字体大小
sheetActive.range(strRange).WrapText=false ‘设定文字回卷
sheetActive.range(strRange).ShrinkToFit=true ‘设定是否自动适应表格单元大小
sheetActive.range(strRange).value=array(adoRset("bookid"),adoRset("bookname"),adoRset("author")) ‘把数据集中的数据填写到相应的单元中
num=num+1
adoRset.MoveNext
loop
(5) Excel临时报表文件的保存及处理
实际运行中应该注意每次一个用户进行报表打印时都采用一个临时的Excel文件,而不是硬性规定文件名,因为如果用固定的文件名的话,只有第一次生成是成功的,后面的操作都会因为已存在同名文件而导致失败。所以我们需要每次都产生一个临时的而且不重复的文件名,这里可以采用自定义的getTemporaryFile()函数由来生成,然后存放在变量filename中,用变量filepos表示这些临时文件的路径。
此外如果这些临时文件不处理的话久而久之会成为文件垃圾,因此在每个用户提交Excel报表打印请求时要先删除临时目录下所有原先产生的临时打印文件。
临时文件的处理主要代码如下:
function getTemporaryFile(myFileSystem) 
dim tempFile,dotPos
tempFile=myFileSystem.getTempName
dotPos=instr(1,tempFile,".")
getTemporaryFile=mid(tempFile,1,dotPos)&"xls"
end function 
set myFs=createObject("scripting.FileSystemObject")
filePos=server.mappath("\test") & "\tmp\" '要存放打印临时文件的临时目录
fileName=getTemporaryFile(myFs) '取得一个临时文件名
myFs.DeleteFile filePos&"*.xls" '删除该目录下所有原先产生的临时打印文件
set myFs=nothing
Excel临时文件的保存代码为:
objExcel.ActiveWorkbook.saveas filePos&filename 
(6) 退出Excel应用
objExcel.quit
set objExcel=Nothing
(7) Excel报表的打印
前面的步骤已经生成了Excel报表,下一步进行打印,采用的策略可以有两种:
方案一:提供上面生成的Excel报表临时文件链接给用户,用户可以直接点击在浏览器中打开Excel报表并通过浏览器的打印功能进行打印,也可以点击右键然后另存到本地后再作打印等相关处理。
方案二:生成Excel报表后直接在客户端加载到浏览器,当然在没有完全加载时应该提示“正在加载,请等待”等字样。
2.3 系统配置与注意事项
虽然以上代码很简单,但实际应用不当经常会出现错误,所以下面要讲到的系统配置和注意事项非常关键。
(1) 千万要保证以上代码输入的正确性,否则一旦运行错误,Excel对象会滞留内存,难以消除,导致下一次调用时速度狂慢,并产生内存不可读写的Windows错误。这时的解决方法就是注销当前用户,如果还不行,就只能Reset了。
(2) 一定要设置好负责打印功能的asp文件的权限。方法是:在IIS管理中,选择该asp文件,右键然后选“属性”/“文件安全性”/"匿名访问和验证控制“,在这里IIS默认是匿名访问,应该选择验证访问(这里基本验证和集成Windows验证两种方式均可,但前者不够安全),这一点无比重要,否则应用当中会出错的。
(3) 有的时候报表分为多页,而且我们希望每一页有相同的表头,要求表头每页都自动打印,可以在Excel模板中进行设置。方法如下:选择菜单"文件"/"页面设置"/"工作表",然后在"顶端标题行"输入你表头的行数(如:表头为1-3行即填入:$1:$3)。 
3.总结
以上我们给出了一个采用ASP写的在B/S模式下实现EXCEL报表的生成与打印的例子,在实际当中已经得到了良好的应用。事实也证明,这个例子的代码虽然不难写,但一定要注意系统的配置,这也是无数次失败后得出的经验。

-
posted @ 2012-03-31 16:56 追梦人RUBY 阅读(21) 评论(0) 编辑

MS SQL SERVER 存储过程事务的实现方式

 

目前找到两种实现方式:

  1, 使用事务的存储过程使用特殊命名, 如UP_ProductAdd_Tran, 内部只需一对事务语句即可管理所有牵涉到业务的其他过程; 其他未使用此种方式命名的过程, 内部不能使用事务相关语句, 只需输出成功失败. 这种方式的好处是容易理解, 你只需要专心业务上的代码, 意外的时候返回错误, 在最外层直接回滚即可...缺点是你可能会产生很多_Tran命名的存储过程, 不好维护.

 

UP_TestProcedure_Tran
1
2  CREATE PROCEDURE [dbo].[UP_TestProcedure_Tran]
3 @ResultMessage nvarchar(255) output -- 输出信息
4   -- 其他参数
5  
6 AS
7 SET NOCOUNT OFF
8 ---------------------------------------------------------------------------
9   declare @CurrentError int;
10 set @ResultMessage = 'OK';
11
12 -- 事务控制开始
13   begin Tran
14 ---------------------------------------------------------------------------
15   exec @CurrentError = [UP_TestProcedure]
16 @ResultMessage output -- 输出信息
17   -- 其他参数
18   ;
19
20 if(@CurrentError <> 0)
21 begin
22 set @CurrentError = 10;
23 set @ResultMessage = '----------';
24 goto TranLabel;
25 end
26
27 ---------------------------------------------------------------------------
28   -- 事务控制结束(提交或回滚)
29   TranLabel:
30 if(@CurrentError <> 0 and @@TRANCOUNT > 0)
31 begin
32 RollBack Tran;
33 end
34 if(@CurrentError = 0 and @@TRANCOUNT > 0)
35 begin
36 commit Tran;
37 end
38
39 return @CurrentError;
40
41  

 

 

 

  2, 使用嵌套方式, 实现稍微麻烦, 接受一个事务计数变量, 以维护与调用者的同步, 完成时根据计数决定提交还是回滚, 代码如下:

 

UP_TestTransaction
1 CREATE PROCEDURE [dbo].[UP_TestTransaction]
2 @LocalTranCount int output, -- 输出信息
3   @ResultMessage nvarchar(255) output -- 输出信息
4   -- 其他字段
5   -- 其他字段
6  AS
7 -- declare @LocalTranCount int;
8 -- set @LocalTranCount = 0;
9 -- 将 @LocalTranCount 定义为输入输出参数
10 -- 将 @LocalTranCount 定义为输入输出参数
11 -- 当该存储过程被其他存储过程调用时
12 -- 传入当前的事务计数
13
14 declare @ErrorCode int;
15 set @ErrorCode = 0;
16
17 begin Transaction
18 set @LocalTranCount = @LocalTranCount + 1;
19
20 begin Transaction
21 set @LocalTranCount = @LocalTranCount + 1;
22 insert into [tbCar] (
23 CarCode,
24 CarHongKongCode,
25 NormalDriver,
26 NormalDriverTel,
27 BelongDepartmentId,
28 BelongDepartment,
29 CreateByUserId,
30 CreateByUser
31 ) values (
32 '------',
33 '5555555555',
34 '6666666666',
35 '77777777',
36 0,
37 'uuuuuuu',
38 0,
39 'bbbbbbb'
40 )
41
42 begin
43 set @ErrorCode = 10;
44 set @ResultMessage = '---------';
45 goto ErrorLabel;
46 end
47
48 begin Transaction
49 set @LocalTranCount = @LocalTranCount + 1;
50 insert into [tbCar] (
51 CarCode,
52 CarHongKongCode,
53 NormalDriver,
54 NormalDriverTel,
55 BelongDepartmentId,
56 BelongDepartment,
57 CreateByUserId,
58 CreateByUser
59 ) values (
60 '--4353---',
61 '5555555555',
62 '6666666666',
63 '77777777',
64 0,
65 'uuuuuuu',
66 0,
67 'bbbbbbb'
68 )
69
70 begin
71 set @ErrorCode = 20;
72 set @ResultMessage = '---------';
73 goto ErrorLabel;
74 end
75 commit Transaction
76 commit Transaction
77
78
79 ErrorLabel:
80 IF(@@TranCount = @LocalTranCount)
81 RollBack Transaction;
82 Else
83 Commit Transaction;
84
85 return @ErrorCode;

 

 

参考资料:

http://www.cnblogs.com/montaque/archive/2005/03/12/117410.html 第一页评论

 

虽然只有几个字, 但是写的时候还是感觉到文字不行..好像说不清楚 ~!@#$%^&*

posted @ 2012-03-18 20:30 追梦人RUBY 阅读(12) 评论(0) 编辑

1.ASP调用存储过程

首先在SQL里建立一个数据库叫it,怎么建我就不说了,这个简单,一看就知道了。然后在库里建个表,写几个数据记录,如下:

ASP调用存储过程  - jinhui_email@126 - 帝S-Bingyu

ASP调用存储过程  - jinhui_email@126 - 帝S-Bingyu

打开查询分析器:

ASP调用存储过程  - jinhui_email@126 - 帝S-Bingyu

在里边写下如下语句点击绿色按钮执行它:

ASP调用存储过程  - jinhui_email@126 - 帝S-Bingyu

你到数据库的存储过程里面看,已经多了一个名为upGetUserName的存储过程了表明已经成功的建立了存储过程,如果没有,试着刷新下。

ASP调用存储过程  - jinhui_email@126 - 帝S-Bingyu

下面用ASP来调用它:

CONN文件(连接数据库)如下:

<%

set db=server.createobject("adodb.connection")

db.Open ("driver={SQL Server};server=192.168.18.254;uid=sa;pwd=;database=it;")

%>

192.168.18.254为SQL SERVER服务器的IP地址,uid pwd it 分别为连接数据库的用户和密码及所要连的数据库

新建一个index.asp文件,内容如下:

<!--#include file="conn.asp" -->

<%

set rs=server.createobject("adodb.recordset")

sql = "exec upGetUserName"

rs.open sql,db,3,2

response.write rs.recordcount&"<br>"

while not rs.eof

    response.write rs("uname")&"<br>"

    rs.movenext

wend

response.End

%>

在浏览器中执行这个页面如果显示如下:

ASP调用存储过程  - jinhui_email@126 - 帝S-Bingyu

那么恭喜你,成功了!

上面是不带参数的存储过程调用,但我们在使用中一定会有参数的,下面就来介绍一个有参数的。

还是上边的例子,我们把原来的存储过程改成这样:

CREATE PROC upGetUserName

@intUserId        NVARCHAR(50),

@intUserpass        NVARCHAR(50)    

AS

BEGIN

        SELECT uname FROM users WHERE uId=@intUserId and pass=@intUserpass

END

GO

可以把原来的存储过程删除,然后把这个写在查询分析器里来执行,也可以直接在原来的存储过程里改。

@intUserId NVARCHAR(50),

@intUserpass NVARCHAR(50)

是要传送进来的参数,@是必须的,因为有两个,所以之间用“,”来分隔

index文件改成如下:

<!--#include file="conn.asp" -->

<%

set rs=server.createobject("adodb.recordset")

sql = "exec upGetUserName 'snake','snake'"

rs.open sql,db,3,2

response.write rs.recordcount&"<br>"

while not rs.eof

    response.write rs("uname")&"<br>"

    rs.movenext

wend

response.End

%>

注意:sql = "exec upGetUserName 'snake','snake'"

两个snake不是一个意思,一个是uid,一个是pass,存储过程返回的是uid="snake"并且pass="snake"的记录

数据库里只有一条这样的记录,所以会显示:

ASP调用存储过程  - jinhui_email@126 - 帝S-Bingyu

ASP存储过程使用大全

1,调用没有参数的存储过程

<%

set conn=server.CreateObject("adodb.connection")

set cmd=server.CreateObject("adodb.command")

strconn="dsn=pubs;uid=sa;pwd"

conn.Open strconn

set cmd.ActiveConnection=conn

cmd.CommandText="{call nono}"

'set rs=cmc.exe 或者cmd.execute

set rs=cmd.Execute()

%>

2,一个输入的参数的存储过程

<%

set conn=server.CreateObject("adodb.connection")

set cmd=server.CreateObject("adodb.command")

strconn="dsn=pubs;uid=sa;pwd"

conn.Open strconn

set cmd.ActiveConnection=conn

cmd.CommandText="{call oneinput(?)}"

cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger ,adParamInput )

cmd("@aaa")=100

cmd.Execute()

%>

3,一个输入参数和一个输出的参数

<%

set conn=server.CreateObject("adodb.connection")

set cmd=server.CreateObject("adodb.command")

strconn="dsn=pubs;uid=sa;pwd"

conn.Open strconn

set cmd.ActiveConnection=conn

cmd.CommandText = "{call oneinout(?,?)}"

cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger,adParamInput)

cmd("@aaa")=10

cmd.Parameters.Append cmd.CreateParameter("@bbb",adInteger,adParamOutput)

cmd.Execute()

bbb=cmd("@bbb")

%>

4,一个输入参数,一个输出参数,和一个返回值

<%

set conn=server.CreateObject("adodb.connection")

set cmd=server.CreateObject("adodb.command")

strconn="dsn=pubs;uid=sa;pwd"

conn.Open strconn

set cmd.ActiveConnection=conn

cmd.CommandText="{?=call onereturn(?,?)}"

cmd.Parameters.Append cmd.CreateParameter("@return_value",adInteger,adParamReturnValue )

cmd.Parameters.Append cmd.CreateParameter("@aaa",adInteger,adParamInput )

cmd("@aaa")=10

cmd.Parameters.Append cmd.CreateParameter("@bbb",adInteger,adParamOutput)

cmd.Execute()

bbb=cmd("@bbb")

rrr=cmd("@return_value")

%>

如何在ASP中调用SQL存储过程

<%set connection1 = Server.CreateObject("ADODB.Connection")

connection1.open ... '联接

set command1=Server.CreateObject("ADODB.command")

set command1.activeconnection=connection1

command1.commandtype=4

command1.commandtext="sp_1" 'SP 名

command1.parameters(1)=... '参数值

command1.parameters(2)=...

set recordset1=command1.execute()

%>

ASP调用存储过程的技巧

1、最简单的如下

Dim objConn

Set objConn = Server.CreateObject("ADOBD.Connection")

objConn.Open Application("Connection_String")

'Call the stored procedure to increment a counter on the page

objConn.Execute "exec sp_AddHit"

没有参数,没有返回,没有错误处理,就是这个了

2、带参数的一种调用

objConn.Execute "exec sp_AddHit 'http://www.aspalliance.com', 1"

请注意分割参数,该方法也不返回记录

3、返回记录的

Dim objConn

Dim objRs

Set objConn = Server.CreateObject("ADOBD.Connection")

Set objRs = Server.CreateObject("ADOBD.Recordset")

objConn.Open Application("Connection_String")

'Call the stored procedure to increment a counter on the page

objRs.Open objConn, "exec sp_ListArticles '1/15/2001'"

'Loop through recordset and display each article

4、……

Dim objConn

Dim objCmd

'Instantiate objects

Set objConn = Server.CreateObject("ADODB.Connection")

set objCmd = Server.CreateObject("ADODB.Command")

conn.Open Application("ConnectionString")

With objCmd

.ActiveConnection = conn 'You can also just specify a connection string here

.CommandText = "sp_InsertArticle"

.CommandType = adCmdStoredProc 'Requires the adovbs.inc file or typelib meta tag

'Add Input Parameters

.Parameters.Append .CreateParameter("@columnist_id", adDouble, adParamInput, , columnist_id)

.Parameters.Append .CreateParameter("@url", adVarChar, adParamInput, 255, url)

.Parameters.Append .CreateParameter("@title", adVarChar, adParamInput, 99, url)

.Parameters.Append .CreateParameter("@description", adLongVarChar, _

adParamInput, 2147483647, description)

'Add Output Parameters

.Parameters.Append .CreateParameter("@link_id", adInteger, adParamOutput, , 0)

'Execute the function

'If not returning a recordset, use the adExecuteNoRecords parameter option

.Execute, , adExecuteNoRecords

link_id = .Parameters("@link_id")

End With

5、存储过程的代码

Create PROCEDURE dbo.sp_InsertArticle

(

@columnist_id int,

@url varchar(255),

@title varchar(99),

@description text

@link_id int OUTPUT

)

AS

BEGIN

INSERT INTO dbo.t_link (columnist_id,url,title,description)

VALUES (@columnist_id,@url,@title,@description)

SELECT @link_id = @@IDENTITY

END

ASP调用带参数存储过程的几种方式

最近有很多的朋友问到调用存储过程的问题,这里简单介绍几种ASP调用带参数存储过程的方法。

1 这也是最简单的方法,两个输入参数,无返回值:

set connection = server.createobject("adodb.connection")

connection.open someDSN

Connection.Execute "procname varvalue1, varvalue2"

''将所有对象清为nothing,释放资源

connection.close

set connection = nothing

2 如果要返回 Recordset 集:

set connection = server.createobject("adodb.connection")

connection.open someDSN

set rs = server.createobject("adodb.recordset")

rs.Open "Exec procname varvalue1, varvalue2",connection

''将所有对象清为nothing,释放资源

rs.close

connection.close

set rs = nothing

set connection = nothing

3 以上两种方法都不能有返回值,(Recordset除外),如果要得到返回值,需要用Command的方法。

首先说明,返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那样;另一种是可以返回多个值,存

储这些值的变量名称需要在调用参数中先行指定。

这个例子要处理多种参数,输入参数,输出参数,返回记录集以及一个直接返回值(够全了吧?)

存储过程如下:

use pubs

GO

-- 建立存储过程

create procedure sp_PubsTest

-- 定义三个参数变量,注意第三个,特别标记是用于输出

@au_lname varchar (20),

@intID int,

@intIDOut int OUTPUT

AS

SELECT @intIDOut = @intID + 1

SELECT *

FROM authors

WHERE au_lname LIKE @au_lname + ''%''

--直接返回一个值

RETURN @intID + 2

调用该存储过程的asp程序如下:

<%@ Language=VBScript %>

<%

Dim CmdSP

Dim adoRS

Dim adCmdSPStoredProc

Dim adParamReturnValue

Dim adParaminput

Dim adParamOutput

Dim adInteger

Dim iVal

Dim oVal

Dim adoField

Dim adVarChar

‘这些值在 VB 中是预定义常量,可以直接调用,但在 VBScript 中没有预定义

adCmdSPStoredProc = 4

adParamReturnValue = 4

adParaminput = 1

adParamOutput = 2

adInteger = 3

adVarChar = 200

iVal = 5

oVal = 3

''建一个command对象

set CmdSP = Server.CreateObject("ADODB.Command")

''定义command 对象调用名称

CmdSP.CommandText = "sp_PubsTest"

''设置command调用类型是存储过程 (adCmdSPStoredProc = 4)

CmdSP.CommandType = adCmdSPStoredProc

''往command 对象中加参数

''定义存储过程有直接返回值,并且是个整数,省缺值是4

CmdSP.Parameters.Append CmdSP.CreateParameter("RETURN_VALUE", adInteger, adParamReturnValue, 4)

''定义一个字符型输入参数

CmdSP.Parameters.Append CmdSP.CreateParameter("@au_lname", adVarChar, adParaminput, 20, "M")

''定义一个整型输入参数

CmdSP.Parameters.Append CmdSP.CreateParameter("@intID", adInteger, adParamInput, , iVal)

''定义一个整型输出参数

CmdSP.Parameters.Append CmdSP.CreateParameter("@intIDOut", adInteger, adParamOutput, oVal)

''运行存储过程,并得到返回记录集

Set adoRS = CmdSP.Execute

''把每个记录打印出来,其中的字段是虚拟的,可以不用管

While Not adoRS.EOF

for each adoField in adoRS.Fields

Response.Write adoField.Name & "=" & adoField.Value & "<br>" & vbCRLF

Next

Response.Write "<br>"

adoRS.MoveNext

Wend

''打印两个输出值:

Response.Write "<p>@intIDOut = “ & CmdSP.Parameters("@intIDOut").Value & "</p>"

Response.Write "<p>Return value = " & CmdSP.Parameters("RETURN_VALUE").Value & "</p>"

''大扫除

Set adoRS = nothing

Set CmdSP.ActiveConnection = nothing

Set CmdSP = nothing

%>

此外还有其他方式,稍微偏门一些,以后慢慢再说,本文参考了多篇文章,这里不一一列出。

在Asp中使用存储过程

为了提高Asp程序的效率,有时需要在Asp中使用使用Sql Server的存储技术,下面简单作一个介绍。

存储过程的建立

这里只简单介绍如何在Sql Server的企业管理器中如何建立存储过程:

(1)打开企业管理器Enterprise manager

(2)选择服务器组(SQL Server Group)、服务器、数据库(Database)以及相就的数据库,鼠标右击对应数据库下的Stored Procdures项,在弹出的菜单中选择New Stored Procedure,在Stored Procedures Properties中输入建立存储过程的语句。下面是一个例子:

CREATE PROCEDURE proctest @mycola Char(10),@mycolb Char(10),@mycolc text AS

Insert into chatdata (mycola,mycolb,mycolc) values(@mycola,@mycolb,@mycolc)

在Sql Server的文档中它的语法为:

CREATE PROC[EDURE] procedure_name [;number] [

{@parameter data_type} [VARYING] [= default] [OUTPUT] ]

[,...n] [WITH { RECOMPILE | ENCRYPTION

| RECOMPILE, ENCRYPTION } ] [FOR REPLICATION] AS

sql_statement [...n]

如果你对Sql语法不熟悉,可以使用Check Syntax来检查语法。在上例中,表示建立存储过程名为mycola,带3个参数的存储过过程,其中第一个参数mycola数据类型为char,宽度10;第2个参数数据类型为char,宽度为10,第3个参数数据类型为text,在这里使用的是Sql Server的数据类型。

存储过程建立后,下面就是如何在Asp程序中调用该存储过程:在Asp中调用存储过程 为了提高Asp程序的效率,有时需要在Asp中使用使用Sql Server的存储技术,下面简单作一个,在上面的增加参数的语句p.Append cm.CreateParameter("@mycolc",201,1,250)中,格式为:

p.Append cm.CreateParameter("参数名称",类型,方向,大小)

参许参数值的类型的意义如下:

名称值 整数值 功能

adDBTimeStamp 135 日期时间数据类型

adDecimal 14 十进制整数值

adDouble 5 双精度小数值

adError 10 系统错误信息

AdGUID 72 全域性唯一识别字(Globally unique identifier)

adDispath 9 COM/OLE自动对象(Automation Object)

adInteger 3 4字节有符号整数

adIUnknown 13 COM/OLE对象

adLongVarBinary 205 大型2字节值

adLongVarChar 201 大型字符串值

adLongVarWChar 203 大型未编码字符串

adNumeric 131 十进制整数值

adSingle 4 单精度浮点小数

adSmallInt 2 2字节有符号整数

adTinyInt 16 1字节有符号整数

adUnsignedBigInt 21 8字节无符号整数

adUnsignedInt 19 4字节无符号整数

adUnsignedSmallInt 18 2字节无符号整数

adUnsignedTinyInt 17 1字节无符号整数

adUserDefined 132 用户自定义数据类型

adVariant 12 OLE对象

adVarBinary 204 双字节字符变量值

adVarChar 200 字符变量值

advarchar 202 未编码字符串变量值

adWchar 130 未编码字符串

方向值的意义如下:

名称值 整数值 功能

adParamInput 1 允许数据输入至该参数当中

adParamOutput 2 允许数据输出至该参数当中

adParamInputOutput 3 允许数据输入、输出至该参数当中

adparamReturnValue 4 允许从一子程序中返回数据至该参数当中

更多详细资源请参考Sql Server的文档和IIS的文档资源。

posted @ 2012-03-18 19:36 追梦人RUBY 阅读(212) 评论(0) 编辑
这段时间看了关于在SQL server 中通过日志和时间点来恢复数据。也看了一些网上的例子,看如何通过日志来恢复数据。

    前提条件:

        数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项     

      如果是简单模式: 类似下面的语句操作数据就不会记录到日志中:  select * into t from [表名] 

      这时为保证数据的完整要将数据库的恢复模式改成“完整” 

    测试环境:    

       1,建立数据库和测试表         

create database zp

create table [zping.com](
id 
int,
name 
varchar(20)
)

   插入测试数据:   

insert into [zping.com](id,name)
values(1,'zping.com1')
insert into [zping.com](id,name)
values(2,'zping.com2')
insert into [zping.com](id,name)
values(3,'zping.com3')
insert into [zping.com](id,name)
values(4,'zping.com4')

  备份数据库,可以通过sql server的可视化操作,下面是生成的代码:

BACKUP DATABASE [zp] TO  DISK = N'C:\k.bak' WITH NOFORMAT, NOINIT,  
NAME 
= N'zp-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

   查看数据: 

  

  注意:这时我们做一个完整备份

 这时可能一不小心删除了一些数据。我们模拟一下:(假定删除了1,2的数据) 

delete from [zping.com] where (id=1 or id =2)

   注意:要记住大体的删除时间

 

  这时发现删除错误了,怎么把数据找回来啊。方法有两个:

       1,通过Log Explorer 查找进行恢复数据(我网站有此工具)

       2,另一种方法通过恢复日志(指定时间点恢复)来恢复数据。

 

    说明:第一个方法可以在线操作。

            第二个方法必须停止数据库或者再另一个数据库恢复(前提是必须有一个完全备份和日志备份)

  

   这里我们来讨论第二中方法指定时间点恢复:

      1,这时对数据库事务日志做备份(注意,如果没做个数据库完整备份,是不能做事务日志备份的

 

     这时新建一个数据库zp(将以前的数据库改名),恢复数据库

 

   这时我们看到,有两个还原的数据库备份,因为我对zp数据库备份了两次,两次的备份的数据文件都一样。这里我们选择最近时间的备份  

 

  默认在数据库的设置如下:是追加到备份集里,所以会有两个备份,如下图:

 

 

   同时,在”选项“里设置”不回滚“事务, 

   注意:通过事务日志还原数据库,必须选择"不回滚"事务

   确定后:出现下面情况:

 

  这时发现,数据库一直是”正在还原“,这时还原数据库事务日志,

   1,“常规”里选择时间,(刚删除的时间)

   2,“选项”里将恢复状态设置为”回滚未提交“事务

   

 

  确定后,查询数据库,发现数据回来了。

 

  总结

   1, 这是一般大型网站数据安全的一个办法,因为数据库比较大(可能有几百G)数据,做一次完整备份时间很长,而且影响数据库服务器的性能, 为保证数据安全,大多采用完整备份+事务日志备份来保证数据安全。例如:一天做一次或者2天做一次完整备份,几个小时内做一次日志备份。(当然可以用写一 个job来实现)

   2,如SQL server 2005里的镜像就是采用的这种事务日志同步的方法保证数据的同步。

   3,如果恢复的日志数据出现”LSN“太早和太晚说明了事务日志间的不连续。这时要注意备份的时间和顺序。

 

posted @ 2012-03-09 20:42 追梦人RUBY 阅读(8) 评论(0) 编辑

软件技术及相关问题的变化是发明创新、公司产品运作、社会市场需求消费、人才资金循环、政策法律等等整体运行中的一个小部分,其发展过程将受诸多因素的影响,但其自身也是有一定规律的。作为行业中具体干活的人,面对这个技术日新月异的行业,琢磨一下行业未来 30 年的某些事情。

  30 年后的事情不用考虑了,就算想清楚也没用了。

  30 年内的软件技术及相关问题分为变化不大的和变化可能比较大的。变化不大的学会了用熟了会终身收益,变化大的要及时把握参与深度。

  一、变化不大的

  1. Intel x86 的指令集

  原因很简单,如果这些指令集发生重大变化,那这行业开发、积累的软件都不能运行了,变化成本太高。

  即使从32位发展到64位、128位,指令集的兼容是可以预见的。

  2. 操作系统 - 启动过程

  系统加电复位、硬件自检、操作系统引导、内存管理、进程管理、硬件中断处理、操作系统其它部分引导、用户 Shell 引导等这一套流程应该不会有大的变化。

  3. 操作系统 - 内存管理

  i386 的三层内存管理模式现在还看不出有多大的变化趋势。操作系统的内存管理模式、API也不会有大变化。

  4. 操作系统 - 进程(线程)及其调度

  只要操作系统内程序的运行是通过时钟中断或其它软硬件中断进行调度,那么进程是操作系统调度的基本单位。如从某一天开始“独立的二进制组件”成为操作系统的基本调度单位,那可能更多的是进程控制块的变化。“独立的二进制组件”的加载本身很可能就是进程。

  5. 操作系统 - 文件系统 API

  文件系统可能会不断变化,但文件系统的 API 应该不会有多大变化。

  6. 数据库 - SQL 语言

  关系数据库的理论与产品技术已经非常成熟,对维护到现在已经保存的大量数据而言,SQL 语言是很难被替换的,XML 可能将会与 SQL 合作而不是替换。即使对象数据库理论及产品成熟了,SQL 肯定将被兼容。

  7. 网络浏览的协议与格式 - HTTP、HTML、Javascript

  就算大家对 HTML 再不满意,其修改、进步的步伐也不会很快,太多的信息内容保存成这种格式了,变化的成本太高。

  HTTP 是与 HTML 相伴的,变化不会太大。Javascript 更是如此。

  8. 电子邮件的协议与格式 - POP3、SMTP、MIME

  POP3、SMTP、MIME 也已成大规模,变化的成本很高。

  9. 网络协议 - TCP/IP 族

  IPv4 到 IPv6 是可以看到的,但 TCP/IP 的基本结构及 API 应该不会有多大变化。变化的成本太高。

  10. 微软的Windows - Windows

  除非连续发生重大经营失误,否则微软是不会简单倒下去的,关于这个主要不是技术的问题,不多说。简单认为 Windows 会存在很长的时间。

  Windows(产品) 中的 Windows(窗口技术)是精华,已经很成熟,其相关的 API,包括 GDI、消息机制、Common Controls等不会有太大变化。就算以后以组件的形式出现,那也只是 API 的另外一种形式。

  11. 微软的Windows - DirectX

  只要老百姓还在用 Windows,那么 DirectX 作为游戏的开发平台会长期的保持下去。

  12. 开源组织与 IBM 的 Linux - Shell、XWindow

  开源组织现在看不出任何的前景衰落,IBM 已经发展了百年,他们联合推动的 Linux 再活 30 年应该没问题。其基本的 Shell 与 XWindow 结构不会有太大变化。

  13. OOP 语法与思想

  编程语言是编写逻辑、调用 API、解决问题的工具。其中的 OOP 语法现在方兴未艾,引导了编译器、虚拟机、API 都向其转变。若干年后,即使编程语言又发展革命了,OOP 很可能将作为其基础。

  14. 算法

  可以说是数学的一部分,包括纯数学算法与应用业务逻辑或应用算法。解决问题的算法的生命力是永远的,独立于系统、编程语言。即使我们研究不出来新算法,但掌握某些算法是应该的,这是掌握基本软件开发知识后的长远竞争力之所在。

  二、变化比较大且影响比较大的

  1. 产品外观、用户操作界面与交互方式

  产品外观、界面与交互方式的变化永无止境。像微软这样的公司在这方面投入巨大精力。实际上这是给老百姓看的,不是给开发人员的,但在很大程度上会影响开发人员的产品外观设计、界面设计及交互设计。

  2. 编程语言、编译器及其支持库、虚拟机

  具体的编程语言与编译工具的选择使用是程序员、开发部门自己的内部事务,一般与系统API、产品市场需求、开发结果等无关。影响编程语言与编译工具的选择使用的因素非常多,变化性很大。就算一个编程语言或其相关的编译工具的生命周期很长,但也很难保证被一个开发团队长期固定使用。过度沉迷进而局限于某个编译工具的风险很大,但不钻研到一定深度很难做出来好东西。

  3. 开发管理模式

  不同的产品、项目,不同的应用平台,不同的编程序语言,需要针对性的开发管理模式。即使使用相同的 OOP 语法的编程语言,针对不同的产品或编译工具其开发管理也是不同的。开发管理其实是组织开发人员利用编程语言写出结果的过程,当然应该不断地进行调整。有一些粗线条的管理理论只能进行指导,真正的实践是另一回事儿。

  4. 开发技术的应用需求

  随着软件应用平台厂商、开发工具厂商的不断的产品升级、市场推广活动,以及社会消费热点不断的变化,市场客户对开发技术的需求不断地进行调整。

posted @ 2012-02-13 05:15 追梦人RUBY 阅读(30) 评论(0) 编辑
摘要: //校验是否为空function IsNotEmpty(con,desc,flag){ var org = deleteSpace(con.value);if (org == ""){ alert(desc + "不能为空!"); if (flag == "1") { con.focus(); } return false;} else {return true;}}//校验是否为正确的日期格式function IsDate(sdate,desc){//判断日期型是否满足格式yyyy-mm-dd(10位) if (sdate.valu阅读全文
posted @ 2012-02-13 05:14 追梦人RUBY 阅读(26) 评论(0) 编辑

马哲包括5大部分即唯物论,辩证法,认识论,历史唯物论,资本主义本质论。

其中辩证法又包括:

1.两大特征:(1)普遍联系(2)永恒发展。

2.三大规律:(1)对立统一规律(2)量变质变规律(3)否定之否定规律。

3.五对范畴(1)原因和结果(2)必然性和偶然性(3)本质和现象(4)可能和现实(5)形式和内容。

4.五个方法:(1)归纳和演绎(2)分析和综合(3)具体和抽象(4)逻辑和历史的统一(5)辩证思维的方法

posted @ 2012-02-05 21:23 追梦人RUBY 阅读(15) 评论(0) 编辑
摘要: ****************************************************************************************************** 游标的使用方法 ********************************************* *************************************** 整理BY--苏贵阳 2010年7月28日 *********************************************************************************.阅读全文
posted @ 2011-12-30 12:30 追梦人RUBY 阅读(19) 评论(0) 编辑
摘要: 有时候我们想通过一个值知道这个值来自数据库的哪个表以及哪个字段,在网上搜了一下,找到一个比较好的方法,通过一个存储过程实现的。只需要传入一个想要查找的值,即可查询出这个值所在的表和字段名。前提是要将这个存储过程放在所查询的数据库。CodeCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->CREATEPROCEDURE[dbo].[SP_FindValueInDB](@valueVARCHAR(1024))ASBEGIN--SETNOCOUNTO阅读全文
posted @ 2011-11-24 21:08 追梦人RUBY 阅读(10) 评论(0) 编辑
摘要: C#中DataGridView多層表頭的制作(1)先看效果:1.首先要調整表頭的高度,記得在DataGrid中是沒法調整表頭高度,但DataGridView是可以的.設定ColumnHeadsHeightSizeMode為EnableResizing或DisableResizing.再設定ColumnHeadersHeight2.要繪製自已的表頭,必須要得到表頭的寬(由開始列,結束列決定)和高(由總層次,第幾層決定),我用一個類對它做了封裝 :publicclassHeaderCell{privateintstartColIndex;privateintendColIndex;privatei阅读全文
posted @ 2011-11-14 10:12 追梦人RUBY 阅读(22) 评论(0) 编辑
仅列出标题  下一页