使用Web服务的asp,使用recordset对象有什么用?

使用Web服务的asp,使用recordset对象有什么用?

问题描述:

目前我运行一个经典的(旧)ASP网页与记录集对象直接使用旧的spagethi代码fasion。使用Web服务的asp,使用recordset对象有什么用?

我想在asp.net中实现一个数据层作为web服务来提高可管理性。这也是将网站升级到asp.net的第一步。 该网站本身目前仍然ASP ...

任何人都可以推荐一种很好的方式来替换记录集对象类型与Web服务兼容类型(如数组或类似的东西)吗? 我怎么用?:

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

而且复式的记录可以被替换为以下取代? 我在说:

set objRS = objRs.nextRecordset 

有人经历过这个,可以推荐?

@AdditionalInfo - 你问吧:-)

让我从头说起。 现有的情况是: 我有一个古老的ASP网站,经由存储过程从数据库中拉出经典的分层内容(标题,节,小节,内容),内容页面也在数据库中(HTML文件的链接)。

现在坏的一点是,ASP代码无处不在遍布许多.asp文件,他们都在做自己的数据库连接,阅读,写作(你必须注册内容)。最近我们遇到了SQL注入攻击的问题,所以我被要求修复它。

可能去改变所有的.asp页面,以防止SQL注入,但这将是疯狂。所以我想构建一个数据层 - 所有页面都使用这个层来访问数据库。一旦修复并更新数据库访问代码。

即将到来的决定我认为asp.net升级不是很远,为什么不开始使用asp.net的数据层?这种方式可以在升级网站时重新使用。

这给我带来了上述问题!

+0

你能给我们更多的例子和信息吗?很难理解你在这里试图做什么。 – 2008-09-10 21:23:53

如果你想坚持传统的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 

当然,你可以扩展基本类来处理参数化的存储过程或什么不是,更验证等

+0

嗨Skyhigh!这就是我最终做的。坚持使用ASP代码并引入一个类来处理与数据库有关的所有事情。谢谢! – Johannes 2008-09-23 07:30:00

本周我最喜欢的建议是:如果是本地对象或者您要付出非常高的性能价格,请不要像您的Web服务那样对待它。从本质上讲,不要做这样的事情在你的web应用:

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

你应该总是喜欢以最小化您的Web Service调用(和SQL):

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

现在,只要数据类型用于Web服务调用,你基本上有两种选择:

  • 的DataSet
  • 其他一切(阵列)

从Web服务返回的大多数集合(如列表<MyData>)在Web Service调用期间实际转换为Array。请记住,Web服务不返回对象(数据+行为),而只是数据结构(或一系列)。因此,List和Array之间几乎没有区别。

数据集是更复杂的类;他们使用自己的自定义序列化程序,并且几乎在调用应用程序中完全重新创建。使用这样的数据集支付性能费用,所以我通常不会在大多数情况下推荐它。使用数组来传递数据往往更有效率,坦率地说,它更容易做到。

你的情况有点不同;因为您正在转换已经使用ADO的现有站点,所以ADO.NET DataSet可能是您最佳的升级路径。 ADO.NET和ADO足够相似,直接更新可能更容易。这种取决于你的网站是如何建立的。

对于问题的最后部分,DataSets确实支持与ADO的Recordset类似的多个记录集。他们被称为数据表。每个DataSet至少有一个DataTable,您可以按任意顺序阅读它们。

好运。

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

假设你有类似于这样的ASMX Web服务,在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处理技术/库。

使用Google搜索MSXML2可能会回答您的任何具体问题,因为它是ASP经典特有的。

为什么不尝试在应用程序中使用垂直切片并将它们转换为.net,而不是在图层中思考。这样你就可以得到以.net编码的全部特征,而不是不相交的部分。在不改善用户体验或增加功能的情况下,取代完美工作代码的商业价值是什么?

您可能还会考虑放弃通过直接的ado调用使用Web服务的性能。对于多个不相交的应用程序/团队访问通用模式的问题,Web Services是一个很好的解决方案;他们不会让一个单独的应用程序更易于维护,只会更慢,更复杂。

+0

谢谢你的想法!我也在想这个。不幸的是,数据库acccess代码遍布在许多.asp文件中,所以我将不得不做大量的垂直切片并最终转化大部分网站。 – Johannes 2008-09-11 07:06:35

另一种选择是使用COM Interop在.NET中创建一个可从传统ASP调用的程序集。

若要从Visual Studio(如微软的Visual C#2005 Express Edition的)一个COM Interop程序集:

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

    • 下应用程序选择装配信息...并启用“使装配COM可见”
    • 底部签名启用签署装配并创建或选择T时的现有的强名称密钥文件
  • 编写和构建库

    • COM互操作的类必须有一个默认的构造函数和唯一的非静态的类和方法公布
  • 将.dll复制到所需的文件夹/机器

  • 注册。的DLL使用RegAsm

例如COM(根据需要调整):

"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查询。这不仅可以消除安全风险,而且可以显着加快数据库性能,因为它可以重用执行计划,而不是每次都重新执行。通过字符串替换来处理它的建议是愚蠢的。 VB在处理字符串时非常糟糕,那些“替换”语句在性能和内存中的代价将非常昂贵(也就是说,实际上只需要处理字符)

将代码移到.net并不会使它更好。在你的页面中有db代码并不坏。特别是如果你是在谈论一个只有几个开发者的小网站。成千上万的网站使用这种技术来处理交易中超过1美元的美元。现在,未参数化的动态sql很糟糕,您应该努力消除这种情况,但这不需要重写应用程序或.net来完成。我总是好奇为什么人们将.net看作是他们应用程序的事实上的改进。大多数存在于COM模型中的错误代码和坏习惯只是在转换过程中向前传播。

您或者需要承诺创造一个真正凝聚力,最小耦合的OO设计;或者只是保持你的目标,因为它并不是那么糟糕。

+0

我同意 - 在我的情况下没有点去.net疯狂,ASP工作正常。现在,我在数据层类中为参数化查询进行集中维护。使用COM只会增加我不需要的复杂性。 – Johannes 2008-09-23 07:33:24

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

其余的代码足够安全,以防止任何类型的SQL注入或其他尝试进入数据库。