目前我经营一个经典(老)ASP网页的有记录集对象的直接使用在不好的老spagethi码时尚.

我在考虑实施一个数据层中asp.net 作为网络服务,以提高可管理性。这也是一个迈出的第一步升级的网站asp.net.该网站本身仍然是ASP的时刻...

任何人都可以推荐一个好办法替换的记录集对象类型与一个网服务兼容的类型(如一系列或东西)?我怎么替换下面?:

set objRS = oConn.execute(SQL)
while not objRS.eof
   ...
   name = Cstr(objRS(1))
   ...
wend

并且还复式记录可以替换?我说的就是:

 set objRS = objRs.nextRecordset 

任何人经历了这一点,可以推荐吗?

@AdditionalInfo-你要:-)

让我从头开始。现有的情况是:我有一个老ASP网站与古典hierachical内容(头,部分节,内容)拉出的数据库通过存储的过程和内容的网页都是中数据库(一个链接到html文件)。

现在坏的事情是,ASP码处传播了许多。asp文件的所有做他们自己的数据库连接、阅读、写作(u有注册的内容)。最近我们有问题SQL注射攻击,所以我称为修复它。

可能 去改变所有的.asp页,以防止sql注,但这将是疯狂。因此我认为建立一个数据层的所有网页,使用这一层访问的数据库。一旦地方修复和更新数据库访问代码。

来,决定我想asp.net 升级是'f远的地方,为什么不开始使用asp.net 对于数据层?这种方式可以被重新使用升级该网站。

这使我想到的问题。

有帮助吗?

解决方案

如果你想坚持传统的ASP然后,我会建议创建一个数据库处理的对象通过ASP类然后只是使用的对象做你的记录集中的作品。这将集中数据库的处理,并让它使你只需要把手SQL注射攻击,在一个位置。

一个简单的例子。

Class clsDatabase

    Private Sub Class_Initialize()
        If Session("Debug") Then Response.Write "Database Initialized<br />"
    End Sub

    Private Sub Class_Terminate()
        If Session("Debug") Then Response.Write "Database Terminated<br />"
    End Sub

    Public Function Run(SQL)
        Set RS = CreateObject("ADODB.Recordset")
        RS.CursorLocation = adUseClient
        RS.Open SQLValidate(SQL), Application("Data"), adOpenKeyset, adLockReadOnly, adCmdText
        Set Run = RS
        Set RS = nothing
    End Function

    Public Function SQLValidate(SQL)
        SQLValidate = SQL
        SQLValidate = Replace(SQLValidate, "--", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, ";", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "SP_", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "@@", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " DECLARE", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "EXEC", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " DROP", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " CREATE", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " GRANT", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " XP_", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "CHAR(124)", "", 1, -1, 1)
    End Function
End Class

然后用这个你会改变你的电话:

Set oData = new clsDatabase
Set Recordset = oData.Run("SELECT field FROM table WHERE something = another")
Set oData = nothing

当然你可以扩大基本类,以处理存储的过程参数化或者什么不和更多的验证等。

其他提示

第一个我最喜欢的咨询意见的这一周:不要把你的网服务的喜欢它如果是当地的对象,或者你是要付出非常沉重的性能价格。从本质上讲,不要做这样的事情在你的网页应用程序:

MyDataWebService ws = new MyDataWebService();
foreach(DataItem item in myData)
{
    ws.Insert(item);
}

你应该总是喜欢尽量减少电话到你的电话网络服务(和SQL):

MyDataWebService ws = new MyDataWebService();
ws.Insert(myData); // Let the web service process the whole set at once.

现在,尽的数据类型来使用你的网服务电话,你基本上有两种选择:

  • 数据集
  • 其他的一切(Array)

大多数收藏品从一个网络服务(如一个列表<MyData>)实际转换成一系列在网服务的调用。记得网络服务不要返回的对象(数据+行为),但仅仅是数据结构(或一系列)。因此,没有多少区别之间的一个列表和一个阵列。

数据集是更复杂的课程;他们使用自己定义的程序和得到完全重建,在调用的应用程序。有一个成本中性能支付为使用数据集,这样所以我通常不会推荐的大多数方案。使用数组通过数据来回往往是更有效率,很坦率地说,这很容易做到的。

你的情况是一位不同;因为你是转换现有网站已经使用ADO,ADO.NET 数据集的可能是你最好尽快型升级的道路。ADO.NET 和ADO是足够相似,一直更新可能更容易的方式。这取决于你的网站建成。

最后一部分的问题数据集,支持多个记录集类似于ADO的记录集。他们被称为数据表.每个数据集有至少一个数据表,你可以读出他们中的任何命令。

好运气。

我建议使用XmlHttp类在ASP代码。

假设你已经ASMX网服务,与此类似,在MyService.asmx:

[WebMethod]
public string HelloWorld()
{
  return "Hello World";
}

你可以叫它在ASP事情是这样的:

Dim xhr

Set xhr = server.CreateObject("MSXML2.XMLHTTP")

xhr.Open "POST", "/MyService.asmx/HelloWorld", false
xhr.SetRequestHeader "content-type", "application/x-www-form-urlencoded"
xhr.Send

Response.Write(xhr.ResponseText)

ResponseText会XML响应:

<string>Hello World</string>

假设你的服务返回的一个收集数据,你可以迭代使用XPath或任何其他XML处理技术/图书馆。

谷歌上搜索有关MSXML2可能会回答任何具体问题,因为它的具体ASP经典。

而不是思考的层,为什么不尝试采取垂直切片通过应用和转换的那些。网。那样你会得到整个特性的编码。净额而不是分离的部分。什么商业价值的替换的完美工作的代码没有改善用户的经验或添加功能吗?

你也可以考虑交易的性能你会得到上网服务,通过直接ado话。网络服务是一个良好的解决问题的多个不连续的应用程序/小组访问一个共同的架构;他们不让一个孤立的应用程序更容易维护,仅缓慢和更为复杂。

另一种替代方法是使用COM互操作,以创建大会。净即可从经典ASP。

创建一个COM互操作会从Visual Studio(例如微软视C#2005年表达版):

  • 创建一个新的类库项目
  • 开放的项目属性

    • 在应用程序选择大会的信息...并启用"使大会COM可见的"
    • 下签订的启用标志的大会,并创建或选择一个现有的强烈的名关键文件
  • 写和建立图书馆

    • COM互操作课程必须有一个默认的构造和非静态的类和方法发表
  • 复制。dll到所需的文件夹/机

  • 登记册。dll COM使用RegAsm

例如(根据需要进行调整):

"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" "C:\path\to\assembly.dll" /tlb /codebase
  • 请大会从ASP

例如(根据需要进行调整):

Dim obj, returnValue
Set obj = Server.CreateObject("MyProject.MyClass")
returnValue = obj.DoSomething(param1, param2)

注:

  • 大会必须重新注册通过RegAsm时,它的更新

参见:

Sql注应当处理通过使用的参数化sql查询。这不仅会消除对安全风险,但它将大大加快了数据库的性能,因为它将能够重复使用一个执行计划,而不是recalcing它每次.该建议处理它通过串的替代品是愚蠢的。VB是可怕的,在处理串和那些"替换"的发言将是极其昂贵的,在性能和存储器(此外,实际上,你只需要处理'的性格无论如何)

运动代码。网不会做的更好。具有db码在你的网页并不是坏;尤其是如果id你正在谈论一个小型的网站只有一对夫妇开发者。数以千计的网站使用这种技术来处理械--我们提供海量美元的交易。现在,unparameterized动态sql是坏的,则应的工作,以消除,但这并不需要一个改写的应用程序。网做到这一点。我一直奇怪为什么人们看到的。净额为实际改善他们的应用程序。最糟糕代码和不良习惯存在COM模型只是传播前期间的转换。

你要么需要作出承诺,要创造一个真正具有凝聚力最小的耦合、面向对象设计;或者只是让你有什么打算,因为它不是那么糟糕。

太糟糕了,我没有看到这个问题在2008年。对我来说这看起来像你的网站使用Justa框架。简单的方法是修改胡斯塔码提交的搜索和数据输入到urlencode.我是和工作完美地为我。

其他代码足够安全,以防止任何类型操作系统SQL注射剂或其他企图进入数据库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top