我用 VC 写了一个 com,也有类似问题,正在解决中,关注关注!

解决方案 »

  1.   

    你在vc中测试也没问题吗?若解决了,请发emai给我:[email protected],我这个问题也在asp论坛中发表着。
      

  2.   

    我用过VB编译的ActiveX DLL被ASP程序调用的程序,包括使用ADO连接ORACLE和SQLSERVER数据库,没有什么问题,可以的啊,从你写的错误看,好像数据库操作部分出错了,所以其他无关的操作能够执行,你有没有检查过数据库连接字串,传入传出参数的数据类型,我想是这里的问题,一般来说,在VB中DLL能够正常工作,DLL就没错了,Asp对数据类型的要求比较严格,基本上要和定义时的参数类型一致,否则就会出错了
      

  3.   

    以下是源码,请帮我看看,谢谢了!
    我用odbc数据源连接sql server数据库ASPComp,(库和源同名),数据表为:C4UsageTracking
    C4UsageTracking表字段:
    UTID  int    从1,逐一递增
    PageName   varchar
    WhenVisited   DateTime 以下是数据库访问组件:
    UsageTracking组件  UsageTrackingData类
    Option Explicit
    Public Sub AddHit(PageName)
      Dim Conn As New ADODB.Connection
      Conn.Open "ASPComp", "sa", ""        
    ‘ASPComp为数据源 ,C4UsageTracking是表名 
      Conn.Execute "Insert Into C4UsageTracking" _
      & "(PageName, WhenVisited) values ( " _
      & "'" & PageName & "'," & "'" & Date & "')"
    End SubPublic Function TotalHits()
      Dim Conn As New ADODB.Connection
      Dim RSHits As ADODB.Recordset
      Conn.Open "ASPComp", "sa", ""
      Set RSHits = Conn.Execute("Select Count(UTID) As TheCount " _
      & " From C4UsageTracking")
      TotalHits = RSHits("TheCount")
    End FunctionPublic Function TotalHitsOnPage(PageName)
      Dim Conn As New ADODB.Connection
      Dim RSHits As ADODB.Recordset
      Conn.Open "ASPComp", "sa", ""
      Set RSHits = Conn.Execute("Select Count(UTID) As TheCount " _
      & " From C4UsageTracking where PageName='" & PageName & "'")
      TotalHitsOnPage = RSHits("TheCount")
    End Function以下是在asp中的调用:
    <%
    Option Explicit
    Dim MyUT
    Set MyUT=Server.CreateObject("UsageTracking.UsageTrackingData")
    //MyUT.AddHit "Home"    //与后面TotalHits那句轮流测试 %>
    <html>
    <head>
    <title>home</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    </head>
    <body bgcolor="#FFFFFF" text="#000000">
    HomePage<br>
    Total Hits: <%=MyUT.TotalHits%>
    </body>
    </html>
      

  4.   

    组件中改为conn.open "dsn = ASPComp" 看看 
      

  5.   

    0x80040E4D  -2147217843  Authentication failed
    这个错误应该跟安全认证(Authentication )有关。你的详细出错信息是否如下?
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E4D)
       [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user '\'.   Microsoft OLE DB Provider for ODBC Drivers error '80040e4d'
       [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'NT
       AUTHORITY\ANONYMOUS LOGON'.如果是,建议你看看如下文章:
    INF: Authentication Methods for Connections to SQL Server in Active Server Pages (Q247931)
    http://support.microsoft.com/support/kb/articles/Q247/9/31.ASP另外检查你的SQL的authentication type,以及sa的密码。微软亚洲技术中心 VC技术支持本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款 (http://www.csdn.net/microsoft/terms.shtm)。
      

  6.   

    启动你的VB,选择ActiveX Dll图标.VB会提供一个默认的工程名(project1)和类名(class1).会将这两个名字都改成你需要的dll文件名和接口名.然后从菜单中选择"工程",在其中选择"引用",就会出现"引用"窗口,从中选择Microsoft Active Server Pages Object Library.然后,把下面这段代码复制到你的新建工程里面,Private MyScriptingContext As ScriptingContext
    Private MyApplication As Application
    Private MyRequest As Request
    Private MyResponse As Response
    Private MyServer As Server
    Private MySession As SessionPublic Sub OnStartPage(PassedScriptingContext As ScriptingContext)
    Set MyScriptingContext = PassedScriptingContext
    Set MyApplication = MyScriptingContext.Application
    Set MyRequest = MyScriptingContext.Request
    Set MyResponse = MyScriptingContext.Response
    Set MyServer = MyScriptingContext.Server
    Set MySession = MyScriptingContext.Session
    End SubPublic Sub OnEndPage()
    Set MyScriptingContext = Nothing
    Set MyApplication = Nothing
    Set MyRequest = Nothing
    Set MyResponse = Nothing
    Set MyServer = Nothing
    Set MySession = Nothing
    End Sub然后你就可以像写asp一样,在vb中使用ado,唯一要注意的是不能用response/request...,而是MyResponse/MyRequest...,如下:Public Sub Fx1()
    Dim conn
    Set conn = MyServer.CreateObject("adodb.connection")
    conn.open "dsn=webbus;uid=sa;pwd="
    Dim rs
    Set rs = MyServer.CreateObject("adodb.recordset")
    rs.open "select * from company", connMyResponse.Write rs("company")rs.Close
    Set rs = Nothing
    conn.Close
    Set conn = Nothing
    End Sub 如果编译testdll.dll,接口名为test的话然后在asp中就可以
    dim obj
    set obj=server.createobject("testdll.test")obj.fx1()
    set obj=nothing