Office中国论坛/Access中国论坛

标题: 急救密文啊! [打印本页]

作者: KenjiSato    时间: 2003-3-11 00:53
标题: 急救密文啊!

用代码A、代码B写入同样的文字“ABC”,加RC4("ABC")打开表结果不一样,代码B有误,
但两段代码不加RC4写入,结果都一样,是明码“ABC”,请教存储过程加了RC4为什么会出错,
如何解决?
谢谢!

代码A
Dim RST As New ADODB.Recordset, CNN As New ADODB.Connection
  Set CNN = CurrentProject.Connection
  RST.Open "SELECT * FROM Sb_员工基本资料 WHERE 姓名='" & "陈芬芬" & "' ", CNN, adOpenStatic, adLockPessimistic
  RST!密码 = RC4("ABC")
  RST.Update
  RST.Close
  Set RST = Nothing
END SUB

代码B
Sub AddPass2()
  DoCmd.RunSQL ("exec Tb_更改密码 " & "'陈芬芬', '" & RC4("ABC") & "'")
End Sub

'存储过程 Tb_更改密码
UPDATE dbo.Sb_员工基本资料
SET 密码效期 = GETDATE() + 30, 密码 = @新密码
WHERE (姓名 = @姓名)


Option Compare Database
Private Const conKey = "E54YBYB5eytn7kVSr6ub56uyAV%^&^$^%$$*YUGhj"

Public Function RC4(strInp As String) As String

Dim s(0 To 255) As Byte, K(0 To 255) As Byte, I As Long
Dim j As Long, temp As Byte, Y As Byte, t As Long, X As Long
Dim Outp As String


For I = 0 To 255
  s(I) = I
Next

j = 1
For I = 0 To 255
  If j > Len(conKey) Then j = 1
  K(I) = Asc(Mid(conKey, j, 1))
  j = j + 1
Next I

j = 0
For I = 0 To 255
  j = (j + s(I) + K(I)) Mod 256
  temp = s(I)
  s(I) = s(j)
  s(j) = temp
Next I

I = 0
j = 0
For X = 1 To Len(strInp)
  I = (I + 1) Mod 256
  j = (j + s(I)) Mod 256
  temp = s(I)
  s(I) = s(j)
  s(j) = temp
  t = (s(I) + (s(j) Mod 256)) Mod 256
  Y = s(t)
  
  Outp = Outp & ChrW(AscW(Mid(strInp, X, 1)) Xor Y)
Next
RC4 = Outp
End Function




作者: 竹笛    时间: 2003-3-11 06:36
没细研究,反正我用RC4没问题。
作者: cg1    时间: 2003-3-27 23:02
呵呵,老问题了,这就是只抄代码的坏处

你要先搞清楚 ANSI 和 UNICODE 的区别
作者: KenjiSato    时间: 2003-3-29 06:33
我想 cg1兄说得对,ACCESS与SQL之间好象有区别,cg1兄能否帮忙解决一下!谢谢!
作者: cg1    时间: 2003-3-29 19:18
什么乱七八糟的?这个和sql有什么关系?
作者: KenjiSato    时间: 2003-3-29 19:26
直接写表没问题,用存储过程就出错,好象SQL与ACCESS有些东西不兼容。
有劳 cg1帮我解决一下。
作者: cg1    时间: 2003-3-29 20:28
Sub AddPass2()
  DoCmd.RunSQL ("exec Tb_更改密码 " & "'陈芬芬', '" & RC4("ABC") & "'")
End Sub

这个很可能就是导致错误的根源

不要这样执行存储过程,你用command来执行试试看,但是还要注意,还是有可能出错的,存储过程的参数定义也有关。你先试验一下再说
作者: cg1    时间: 2003-3-31 06:18
XXX网站,抄袭代码如下:(哈哈)

adp 代码如下:
----------------------------------------
Public Function DoProcedure()
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim intRoyalty As String
    Set cmdByRoyalty = New ADODB.Command
    cmdByRoyalty.CommandText = "存储过程名"
    cmdByRoyalty.CommandType = adCmdStoredProc
    intRoyalty = Trim(InputBox("输入参数:"))
        '你可以直接写参数,不用调用 input
    Set prmByRoyalty = cmdByRoyalty.CreateParameter("aab", adChar, adParamInput, 255)
    cmdByRoyalty.Parameters.Append prmByRoyalty
    prmByRoyalty.value = intRoyalty
    Set cmdByRoyalty.ActiveConnection = CurrentProject.Connection
    Set rstByRoyalty = cmdByRoyalty.Execute
End Function

作者: cg1    时间: 2003-3-31 06:24
up
[此贴子已经被作者于2003-3-31 19:21:33编辑过]


作者: KenjiSato    时间: 2003-3-31 21:11
标题: 联不上
与昨天一样的错误![attach]16[/attach]
作者: KenjiSato    时间: 2003-3-31 21:18
标题: 无权限
[attach]17[/attach]
作者: KenjiSato    时间: 2003-3-31 22:37
标题: 存储过程
[attach]19[/attach]
作者: 159234    时间: 2006-10-22 18:07
看看,学习学习
作者: zhuyiwen    时间: 2006-10-22 18:38
呵呵,有意思。

CG1的意思是:用ADO的Command来执行存储过程,则可保正确存储。

我想其中的主要原因是RC4会在字符串中产生诸如空格、逗号类的特殊字符,呵呵。
作者: zhuyiwen    时间: 2006-10-22 18:40
好老的贴子哟。还被翻出来了。哈哈
作者: SUBARU    时间: 2006-10-26 01:32
让我想想!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3