【发布时间】:2013-12-09 22:59:26
【问题描述】:
我有一个包含 CIDR 块的表,我已将它们转换为二进制的 StartIP 和 EndIP (4)。我想使用用户提供的 IP (IPV4) 搜索该表并返回 IP 位于 StartIP 和 EndIP 之间的任何记录。
背景见:Convert IP to 32-bit Binary in TSQL
以下在 TSQL 中有效(返回 1 条记录):
declare @Binary varbinary(25)
select @Binary = MyDB.dbo.fnBinaryIPv4Start('204.228.241.25')
select field1, field2 from MyDB.dbo.MyTable WHERE (@Binary >= IPStartBinary AND @Binary <= IPEndBinary)
但是,这不会在 Classic ASP 中返回任何记录:
Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandType = adCmdText
cmd.ActiveConnection =objConn
strSQL2 = "SELECT MyDB.dbo.fnBinaryIPV4Start(?)"
'IP Parameter
cmd.Parameters.Append cmd.CreateParameter("@IP",adVarChar,adParamInput,15,strIP)
cmd("@IP") = strIP
cmd.CommandText = strSQL2
strBinary = cmd.Parameters(0)
Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandType = adCmdText
cmd.ActiveConnection = objConn
cmd.CommandTimeOut = 1200
strSQL = "SELECT field1, field2 FROM MyDB.dbo.MyTable WHERE (? >= IPStartBinary AND ? <= IPEndBinary) "
cmd.Parameters.Append (cmd.CreateParameter("IP", adVarBinary, adParamInput, 50, strBinary))
cmd.Parameters.Append (cmd.CreateParameter("IP", adVarBinary, adParamInput, 50, strBinary))
End If
cmd.CommandText = strSQL
set objRS = cmd.Execute
if not objRS.EOF then
arrMyResults = objRS.GetRows()
strMyRewultsUbound = UBound(arrMyResults,2)
end if
objRS.close
set objRS = nothing
有什么建议吗?
谢谢!
【问题讨论】:
-
我不明白你的 asp 代码的第一部分?你从不执行strSQL2?所以你永远不会将ip作为二进制文件?尝试 Response.write strBinary 变量
-
哈!多么愚蠢的错误!非常感谢您的帮助!
-
如果您将评论转换为答案,我将接受它作为我的答案...
-
我建议将 SQL 转换为接受单个参数(IP 作为字符串)并返回记录集的存储过程。然后,您可以将 ASP 代码简化为单个命令执行 (
adCmdStoredProc)。