SqlServer存储过程及ASP中存储过程的调用

[color=Blue]存储过程的建立[/color]

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

(1)打开企业管理器Enterprise manager
(2)找到相应的服务器,展开要建立存储过程的数据库(Database),鼠标右击此数据库下的存储过程(Stored Procdures)项,在弹出的菜单中选择新建存储过程(New Stored Procedure),在弹出的存储过程属性(Stored Procedures Properties)选项框中输入建立存储过程的语句。下面是一个例子:
Create PROCEDURE procedureName
@mycola Char(10),@mycolb Char(10),@mycolc text
AS
  Insert into chatdata (mycola,mycolb,mycolc) values(@mycola,@mycolb,@mycolc)

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

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 ]

参数
procedure_name
新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。有关更多信息,请参见使用标识符。
要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。

;number
是可选的整数,用来对同名的过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。Drop PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。

@parameter
过程中的参数。在 Create PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。

使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。

data_type
参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。

说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。

VARYING
指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。

default
参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。

OUTPUT
表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。

n
表示最多可以指定 2.100 个参数的占位符。

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。
ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 Create PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。

说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。

FOR REPLICATION
指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。

AS
指定过程要执行的操作。

sql_statement
过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。

n
是表示此过程可以包含多条 Transact-SQL 语句的占位符。

[color=Blue]ASP中存储过程的调用方式集锦[/color]

[color=Red]以下说明都是在已经打开数据库连接conn的前提下[/color]

1,调用没有参数的存储过程
set cmd=server.CreateObject(“adodb.command”)
set cmd.ActiveConnection=conn
cmd.CommandText=”{call nono}”
'set rs=cmc.exe 或者cmd.execute
set rs=cmd.Execute()

2,带输入的参数的存储过程
set cmd=server.CreateObject(“adodb.command”)
set cmd.ActiveConnection=conn
cmd.CommandText=”{call oneinput(?)}”
cmd.Parameters.Append cmd.CreateParameter(“@aaa”,adInteger ,adParamInput )
cmd(“@aaa”)=100
cmd.Execute()

简单方法:
Conn.Execute “exec sp_AddHit 'http://www.aspalliance.com', 1”
请注意分割参数,该方法也不返回记录
有返回记录集:
rs.Open “Exec procname varValue1, varValue2”,conn

另一种返回记录集的方法:
set Cmd=Server.CreateObject(“ADODB.command”)
set Cmd.activeconnection=conn
Cmd.commandtype=4
Cmd.commandtext=”sp_1″ 'SP 名
Cmd.parameters(1)=… '参数值
Cmd.parameters(2)=…
set recordset1=Cmd.execute()

3,带输入参数和输出参数

要得到返回值,需要用Command的方法。
返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那样;另一种是可以返回多个值,存储这些值的变量名称需要在调用参数中先行指定。

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

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

调用方法:
'定义一些参数
iVal = 5
oVal = 3
set Cmd = Server.CreateObject(“ADODB.Command”)
set cmd.ActiveConnection=conn

'定义command 对象调用名称
Cmd.CommandText = “sp_PubsTest”

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

'往command 对象中加参数
'定义存储过程有直接返回值,并且是个整数,省缺值是4
Cmd.Parameters.Append Cmd.CreateParameter(“RETURN_VALUE”, adInteger, adParamReturnValue, 4)
'定义一个字符型输入参数
Cmd.Parameters.Append Cmd.CreateParameter(“@au_lname”, adVarChar, adParaminput, 20, “M”)
'定义一个整型输入参数
Cmd.Parameters.Append Cmd.CreateParameter(“@intID”, adInteger, adParamInput, iVal)
'定义一个整型输出参数
Cmd.Parameters.Append Cmd.CreateParameter(“@intIDOut”, adInteger, adParamOutput, oVal)

'运行存储过程,并得到返回记录集
Set adoRS = Cmd.Execute

'两个输出值
Response.Write “

@intIDOut = ” & Cmd.Parameters(“@intIDOut”).Value & “


Response.Write “

Return value = ” & Cmd.Parameters(“RETURN_VALUE”).Value & “

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”)

增加参数的语句格式为:

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 允许从一子程序中返回数据至该参数当中

此调用方法可以直接写整数值,也可以包含adovbs.inc(此文件中已经定义好相应常数)然后写名称

4,一个输入参数,一个输出参数,和一个返回值
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”)

[VBS]不同编码下的Asc值

  这几天在帮朋友做一个站,在处理字符串截取时,为了整齐,要判断汉字与英文,因为他们占用的宽度不一样。
  为了省事,直接用了以前积累的一个小函数来处理,结果,不起作用,后来测试了一下,才发现,原来是因为编码的原因,UTF-8下和GB2312下,Asc的值不一样,前者汉字好像都是0,后者则是大于255。
新代码如下:[code]function GetLeft(str,strlen)
Dim l,t,c,i
l=len(str)
t=0
For i=1 To l
c=Abs(Asc(Mid(str,i,1)))': Response.write c&”,”这个是我用来判断取到的值,才发现问题
If c=0 Then'汉字GB2312下是>255,UTF8下是0
t=t+2
Else
t=t+1
End If
If t>=strlen Then
GetLeft=left(str,i)&”…”
Exit for
Else
GetLeft=str
End If
Next
end function
[/code]
  奇怪的是,今天换了个服务器空间后,汉字取得的ASC值都是1了。又要改代码了。

特定域名下所有页面301转向到另一域名相应页面

  去年乘cn域名大推广,注册了好多个域名,其中www.lee.zj.cn也是绑定到此网站。据说,多域名同网站会被认为内容重复,不利于搜索引擎中的排名。比较好的做法是,指定一个主域名,其它域名都转向到此域名。
  前几天,为了增强本站的SEO,着手把另一个域名:www.lee.zj.cn下的所有页面301转向到www.biglee.cn下。
  由于本站目前只有一个博客,于是从博客上入手。
  思路很简单,获取当前浏览页面的域名,如果是需要转向的域名,再替换域名部分,做为新地址来301转向。
  代码如下:[code]<%
Dim toDomain,fromDomain,curDomain,q,p,url
toDomain=”www.biglee.cn”
fromDomain=”lee.zj.cn”
curDomain=Request.ServerVariables(“HTTP_HOST”)

if instr(curDomain,fromDomain)>0 then
q=Request.ServerVariables(“QUERY_STRING”)
p=Request.ServerVariables(“URL”)
url=”http://”&toDomain&p&”?furl=zj.cn”
if q<>”” then url=url&”&”&q

Response.Status=”301 Moved Permanently”
Response.AddHeader “Location”,url
Response.end()
End If
%>[/code]
  特意在url上加了个参数,是为了记录有多少个访问是从这个域名访问的。
  将此文件保存成asp文件,包含任一要跳转的ASP页面中即可。
  博客中,都有调用公用数据库连接文件conn.asp,我就在conn.asp中包含此文件,搞定。

缓存引起的Ajax中的onreadystatechange无值的问题

  前几天在帮别人改一个网站,要实现用Ajax去进行无刷新的点评功能。
  忙活了半天,终于把功能做出来了。最后一步就是做最终测试了。测试的时候,发现了一个奇怪的问题:在FireFox下没有任何问题,在Maxthon或者IE6下,首次打开页面,一切正常,刷新一下就不执行任何操作了。其中关键的代码如下(加了我的调试代码):[code]FCKXml.prototype.request = function( url , postString , fmethod , asyncFunctionPointer , funcParam )
{
var C = this.getTransport();
C.open( fmethod , url , true );
if(fmethod==”post”)
C.setRequestHeader( 'Content-Type' , 'application/x-www-form-urlencoded' );
C.send( postString );
alert(“start loading”);//用来检测是否执行到了这一步,每次都有,说明有执行到这
C.onreadystatechange = function ()
{alert(C.readyState)//显示状态值,以便清楚地知道状态有没有改变,IE下刷新后没反应
if( C.readyState == 4 )
{
if(asyncFunctionPointer)
{
if ( C.status==200 || C.status==304 )
{
asyncFunctionPointer( C );
}
}
}
}
}[/code]
  经过测试发现,原来是onreadystatechange状态无任何变化。但不知道是什么原因引起的。无奈之中跑到CSDN上提问,一个朋友的回答提醒了我,于是我去测试了下C.responseText发现刷新后是直接有值了。这下我恍然大悟,看来是缓存惹的祸,直接从缓存里读取数据,没有向服务器提交查询的过程,当然就不会有状态的改变了。为了验证我的想法,我把用来处理查询并返回值的页面做了禁止缓存处理。再一调试,一切正常。
  问题是解决了,但不知道为什么在FF下不会直接读取缓存,难道FF已经针对Ajax做了处理?最近比较忙,此疑问待有时间后再来研究。也欢迎各位朋友提出看法。

CSS定位中Position的absolute及Relative等的研究

  用Div+CSS进行网站布局时,做一些浮动层等特殊特殊效果时要考虑到定位问题。这就要用到Positoin属性等。
  [b]Position[/b]属性有四个值: static、fixed、absolute和relative,后面两个在布局中的定位里是经常用到的,顾名思义,[b]absolute[/b]是指绝对定位,即将对象从文档流中拖出,使用left,right,top,bottom等属性进行绝对定位,而其层叠通过z-index属性定义。此时对象不具有边距,但仍有补白和边框。[b]ralative[/b]是指相对定位,就是依据left,right,top,bottom等属性在正常文档流中偏移位置。
  但是,怎么个绝对法,又怎么个相对法呢?以前我一直没有仔细去研究它,到具体应用时有时会有点迷糊,我相信很多朋友也会有这样的问题。今天我特意测试了一下,得出了以下结论:

[b]1、当Position属性值为Relative时[/b]
[color=Red]对象原来占有的位置保留,其后面的对象按原来文档流仍然保持原来的位置[/color]
Top的值表示对象相对原位置向下偏移的距离
bottom的值表示对象相对原位置向上偏移的距离
两者同时存在时,只有Top起作用。

left的值表示对象相对原位置向右偏移的距离
right的值表示对象相对原位置向左偏移的距离
两者同时存在时,只有left起作用。

[b]2、当Position属性值为absolute时[/b]
[color=Red]对象从文档流中抽取出来,原占有的位置被后面的对象顶替上来[/color]
Top的值表示对象上边框与浏览器窗口顶部的距离
bottom的值表示对象下边框与浏览器窗口底部的距离
[color=Blue]两者同时存在时,只有Top起作用;如果两者都未指定,则其顶端将与原文档流位置一致,即垂直保持位置不变。[/color]

left的值表示对象左边框与浏览器窗口左边的距离
right的值表示对象右边框与浏览器窗口右边的距离
[color=Blue]两者同时存在时,只有left起作用;如果两者都未指定,则其左边将与原文档流位置一致,即水平保持位置不变。[/color]

  [color=Red]在Position属性值为absolute的同时,如果有一级父对象(无论是父对象还是祖父对象,或者再高的辈分,一视同仁,^_^)的有Positoin属性时,则上述的相对浏览器窗口定位将会变成相对与其最近的一个定位的父对象定位,这对精确定位是很有帮助的。[/color]
  更多有关CSS的说明请参考手册:http://www.biglee.cn/books/css/

  辛苦了半天得出的结论,希望对大家有用。如果有疏忽之处,还请指正。

CSS中文手册外加树形折叠菜单

  鉴于有时要用到CSS手册,为了方便随时随地可用,今天花了点时间整理了一下别人做好的,同时练练写JS脚本,用JS写了左侧导航的折叠与展开效果的树形菜单。
  这是通用于UL与LI菜单的折叠与展开脚本,免去了给各对象编ID的麻烦。不过,为了达到展开一个节点,另一个已经展开节点同时关闭的效果,我就编了两个ID来初始化已经展开节点。
  JS脚本代码如下:[code]
[/code]
  页面代码如下:[code]


[/code]
  废话不多说,有兴趣的,看效果:[url=http://www.biglee.cn/books/css/]http://www.biglee.cn/books/css/[/url]
  最后声明:此手册版权归苏沈小雨所有。

域名带来的流量

  去年cn域名推广时,我也凑热闹注册了几个域名。由于一时偷懒,懒到现在,除了本站的[url=http://www.biglee.cn/]biglee.cn[/url]和[url=http://lee.zj.cn/]lee.zj.cn[/url]外,好多域名都没真正用起来。
  昨天为了用cn域名测试Google的企业邮局套件,去给之前注册的[url=http://qqkav.com.cn]qqkav.com.cn[/url]做MX解析,顺便也做了URL转发到本站。刚才查看本站流量时发现此域名今天已经带来了7个IP的流量,其中一个是百度搜索[url=http://www.qqkav.com.cn]www.qqkav.com.cn[/url]来的,其它的都是手工输入的。
  看来此域名还是不错的,可以好好利用一下,不能浪费了。
  先想想有什么好项目做没。也欢迎各位朋友提建议。

26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法

26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法

补充最新修改版,使用Unicode的字符代码,而不是非unicode(负数值,有时会出错)代码
ゴ ガ ギ グ ゲ ザ ジ ズ ヅ デ ド ポ ベ プ ビ パ ヴ ボ ペ ブ ピ バ ヂ ダ ゾ ゼ
当字段内包含了这26个日文字符任意一个多个时,就会导致在执行SQL语句中包含了
[字段] like '%aaaaa%' 或 inStr(1,[字段],'aaaaa',1)>0
这样的查询时,毫无道理的出现了
“Microsoft JET Database Engine 错误 '80040e14' 内存溢出”的错误
其他Jet SQL函数命令未作测试,大概与字符搜索定位匹配相关的都可能出错

搜索相关资料得知被微软工程师证实是Access的bug,可能是语法关系都是微软的东东
在vbs中 执行inStr(1,日文平假名变量,”aaaaa”,1)依然要出现错误
Microsoft VBScript 运行时错误 错误 '800a0005' 无效的过程调用或参数: 'instr'

没有搜索,因这几个字符出现Access的论坛网站搜索无法进行,何等痛苦
昨天一朋友大叫怪事,他的音乐数据库无法搜索了,只有30000条记录时是好的
毫无疑问,日文片假名是祸根,花几分钟把有包含上面的日文替换成”?”搜索顺利恢复
找来论坛程序用户群最大的动网dvBBS AC版本 7.0SP2 版测试,同样有这个日文发帖后 导致无法搜索并且运行时出错的问题
线上去搜索 '80040e14' 内存溢出” 的错误 多的是!

一简单有效的解决办法:
对这26个字符进行编码和解码,可能效率感觉不理想,测试下来问题不大,速度影响不是太大

编码:

Function Jencode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
Jencode=””
Exit function
end if
dim F,i,E

E=array(“Jn0;”,”Jn1;”,”Jn2;”,”Jn3;”,”Jn4;”,”Jn5;”,”Jn6;”,”Jn7;”,”Jn8;”,

“Jn9;”,”Jn10;”,”Jn11;”,”Jn12;”,”Jn13;”,”Jn14;”,”Jn15;”,”Jn16;”,”Jn17;”,

“Jn18;”,”Jn19;”,”Jn20;”,”Jn21;”,”Jn22;”,”Jn23;”,”Jn24;”,”Jn25;”)
F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
chrw(12478),chrw(12476))
Jencode=iStr
for i=0 to 25
Jencode=replace(Jencode,F(i),E(i))
next
End Function

解码:

Function Juncode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
Juncode=””
Exit function
end if
dim F,i,E

E=array(“Jn0;”,”Jn1;”,”Jn2;”,”Jn3;”,”Jn4;”,”Jn5;”,”Jn6;”,”Jn7;”,”Jn8;”,”Jn9;”,

“Jn10;”,”Jn11;”,”Jn12;”,”Jn13;”,”Jn14;”,”Jn15;”,”Jn16;”,”Jn17;”,”Jn18;”,

“Jn19;”,”Jn20;”,”Jn21;”,”Jn22;”,”Jn23;”,”Jn24;”,”Jn25;”)
F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
chrw(12478),chrw(12476))
Juncode=iStr
for i=0 to 25
Juncode=replace(Juncode,E(i),F(i))'□
next
End Function

注意,如果直接使用字符不方便(windows还没装日文支持),注释掉的部分提供有 chr(-23804)

..这样的定义

这样
1.
表单输入保存时,使用Jencode()将这26个字符先编码再保存(为什么是这26个字符,

经过全部测试87个平假名89个片假名最终认定的)

ゴ 即 chr(-23116) 编码为 Jn1;
2.
显示时,则使用 Juncode() 函数进行解码,还原日文片假名显示
3.
搜索关键字,也要使用 Jencode() 进行编码后再放入 like里
where [Topic] like '%Jencode(kewwords)%' 使用
才能保证搜索的值和编码过的数据库字段内容匹配

==================================

PS:
也可以使用正则表达式来改写上面的两个函数,或许效率还要更高些
再就是如果 压根不使用日文,也不需要搜索日文,则解码部分可以不用,

保存数据实直接把这26个片假名字符替换为空字符或任一字符,比如”□”
抛砖引玉,如果有更本质的真正的好方法,谢分享

附:
—————————-
平假名87个 asc值
-23391 –> -23316
unicode 3040-309F

ぁあぃいぅうぇえぉお
かがきぎくぐけげこご
さざしじすずせぜそぞ
ただちぢっつづてでと
どなにぬねのはばぱひ
びぴふぶぷへべぺほぼ
ぽまみむめもゃやゅゆ
ょよらりるれろゎわゐ
ゑをん゛゜ゝゞ
——————————
片假名89个 asc值
-23135 -> -23059
unicode 30A0-30FF

ァアィイゥウェエォオ
カガキギクグケゲコゴ
サザシジスズセゼソゾ
タダチヂッツヅテデト
ドナニヌネノハバパヒ
ビピフブプヘベペホボ
ポマミムメモャヤュユ
ョヨラリルレロヮワヰ
ヱヲンヴヵヶーヽヾ

================补充 修改的版本===========================

添加一个编码解码参数codeType
都使用一个函数
使用chr()不直接使用日文字符
这样~ 够简洁了吧?

疑点: 显示日文是不会出错的,保存到数据库也不会出错
只有SQL使用 like 和 inStr 的时候 才会出错 这个与显示无关!
还有在vbs里使用 inStr(1,str,”aaa”,1)这样按字符搜索也会错
改为 inStr(lcase(str),”aaa”) 就不会出错

如果一定得用 inStr(1,str,”aaa”,1) 字符搜索语法
则一定要在先inStr() 后 jncode() 的顺序 否则会出错

一点问题都没有! 注意到这几点绝对没错!

rs(“TopicStr”)=Jncode(TopicStr,true) 'encode 保存到数据库的资料
DisplayStr=Jncode(rs(“TopicStr”),false) 'uncode '显示到页面的标题

Function Jncode(byVal iStr,codeType)
if isnull(iStr) or isEmpty(iStr) or iStr=”” then
Jncode=”” : Exit function
end if
dim F,i,E
E=array(“Jn0;”,”Jn1;”,”Jn2;”,”Jn3;”,”Jn4;”,”Jn5;”,”Jn6;”,_
“Jn7;”,”Jn8;”,”Jn9;”,”Jn10;”,”Jn11;”,”Jn12;”,”Jn13;”,_
“Jn14;”,”Jn15;”,”Jn16;”,”Jn17;”,”Jn18;”,”Jn19;”,”Jn20;”,_
“Jn21;”,”Jn22;”,”Jn23;”,”Jn24;”,”Jn25;”)
F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
chrw(12478),chrw(12476))
if codyType then
for i=0 to 25 iStr=replace(iStr,F(i),E(i)) next
else
for i=0 to 25 iStr=replace(iStr,E(i),F(i)) next
end if
Jncode=iStr
End Function

附最简单的方法:
改查询语句,用InStr(1,LCase(columnName),LCase('”&keyword&”'),0)<>0来替代Like语句。
经过本人实验,可用。

.dll 文件反编译的工具软件

.dll 文件反编译的工具软件: Reflector for .NET Remotesoft .NET Explorer
Remotesoft .NET Explorer 支持asp.net2.0

要真正反编译.dll文件就在网站上使用该软件去操作,可以完成反编译出源码,因为是共享软件,所以在下载来的,不能完成反编译出源码,要看源码的最好是在网站编译,下面有链接
链接:
http://www.remotesoft.com/salamander/
[url=http://www.remotesoft.com/salamander/obfuscator/try.html]http://www.remotesoft.com/salamander/obfuscator/try.html[/url]
[img]http://www.cnblogs.com/images/cnblogs_com/xiaoxijin/dotexplorer_decompiler.jpg[/img]

Remotesoft .NET Explorer 的下载地址:

[url=http://remotesoft.com/eval_download/DOTNET_Explorer_2008.msi]Remotesoft .NET Explorer for Visual Studio 2005[/url] – professional GUI
[url=http://remotesoft.com/eval_download/Remotesoft_DOTNET_Explorer_Evaluation.msi]Remotesoft .NET Explorer for Visual Studio 2002 and 2003[/url] – professional GUI

Reflector for .NET 是免费的很不错,我建议下载这个,网址:
http://www.aisto.com/roeder/dotnet/
下载地址:
http://www.aisto.com/roeder/dotnet/

注意:下载时要输一些注册信息,输入用户名时,中间要加一个空格。

这个还有很多插件,下载地址:
http://www.codeplex.com/reflectoraddins

另外.net SDK1.1也自带了一个WinCV.exe工具,可以浏览类文件.在C:Program FilesMicrosoft.NETSDKBin 目录下. 称为Class viewer.在search 框中输入以字母开头的类,就可以自动显示相关的类.具体自己去试吧
这里有介绍
http://www.dotnettoolbox.com/toolbox/ViewCategory.aspx?ID=5

先推荐几个实用的MSIL反编译为C#源代码的工具和网址,供大家学习参考和借鉴:

http://www.remotesoft.com/salamander/
http://www.saurik.com/net/exemplar/
http://www.iplussoftware.com/
http://www.aisto.com/roeder/dotnet/
http://www.lesser-software.com/