我在前面有发了两帖,但都石沉大海,杳无音信,大家可以看看我前面的帖
http://community.csdn.net/Expert/topic/4361/4361946.xml?temp=.1479151
http://community.csdn.net/Expert/topic/4361/4361047.xml?temp=.434765
我再把我的问题描述一遍,就是说原来的代码是VB写的com,生成的dll中,有一个叫做obj的接口,还有一个叫做objclass的类类型(这个我还不知道是怎么回事,后来我看到ADO空间里也有一个recordset接口和一个recordsetclass类,这两个有什么区别?)
我用objclass生成一个对像
objclass paramobj = new objclass();
然后调用这个类的函数:paramobj.fun();根据我的推断他返回的应该是一个recordset类型,因为我看到在asp的版本中有这么一句:
set param = paramobj.fun();然后后面就可以用param.movenext,这是对reocrdset类型的典型写法。但是我引入adodb空间后,创建了一个recordset的实例:
adodb.recordsetclass rs = new adodb.recordsetclass();
再用rs = paramobj.fun();的时候却报错,说无法隐式转换object类型至recordsetclass类型。(这里说明一下,paramobj.fun()的返回类型是object,所以我也不知道具体是什么类型,只能猜测)。
我后来又用paramobj.fun().GetType().ToString()的方法测试了一下,显示的竟然是paramobj.fun()是system.string类型的?为什么会这样?各位都参与帮我想想,我该怎么办?
是不是asp里的recordset在asp.net里面就返回成string类型的啦啊?
还有我应该怎么在asp.net中调用com里面的recordset数据集呢?

解决方案 »

  1.   

    从表面上来看,
    这是.NET里面的类型封送,但是,建议不要用COM返回recordset,因为.NET不认recordset类型,
    返回一个数组不知道可以不可以,如果用.NET做一个数据访问也就5分钟吧,很多问题需要说明,COM与.NET的互操作性,
    你也可以去Microsoft News Group看看,应该可以给你一个满意的答复,
    谢谢如果需要进一步帮助,可以email:[email protected]
      

  2.   

    COM And .NET !http://www.microsoft.com/china/MSDN/library/netFramework/netframework/0501ExceptLog.mspxhttp://chs.gotdotnet.com/quickstart/howto/doc/default.aspx
    找到 交互操作谢谢
      

  3.   

    谢谢你,问题是原来的ASP系统中,所有的数据访问层都封装在dll文件中,然后返回recordset数据集给前台调用。如果我现在要改的话,我根本不知道dll文件中的函数做了什么,连接哪个数据库等等一系列的问题,我该怎么解决呢?
      

  4.   

    我不清楚你的VB类怎么样的,单从你的描述来看,你的问题就是对于paramobj.fun这个函数的返回类型不能确定,导致出现了问题??对吗?如果是:如果你能确定set param = paramobj.fun();这个返回的对象是Recordset的话,请在你的C#中,这么写:
    adodb.recordsetclass rs ;
    rs = (recordsetclass )paramobj.fun();你再次编译一下看看..如果有问题,请贴出来..我下班前会再来看一次..
      

  5.   

    我已经试过了,生成过程中并不报错,但是在生成的页面中显示,不允许进行这样的类型转换
    至于 VB的类是怎么样的,我也不知道,因为当时做这个程序开发的人好像都不在公司了。但是我按他在ASP中的写法,他应该是返回了一个recordset数据集,因为他在asp的版本中有这么一句:
    set param = paramobj.fun();然后后面就可以用param.movenext,这是对reocrdset类型的典型写法。
    我想请问一下我怎么得到一个COM函数返回值的类型呢?如果我用paramobj.fun().GetType().ToString()得到的是返回值类型吗?我用paramobj.fun().GetType().ToString()后,显示的是System.String类型
      

  6.   

    我把页面报的错帖上来应用程序中的服务器错误。
    --------------------------------------------------------------------------------指定的转换无效。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidCastException: 指定的转换无效。源错误: 
    行 71:  Response.Write((objProduct.getCategory(g_strcompanyurl,null)).GetType().IsClass);
    行 72:  RecordsetClass rsCateGory;
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    行 73:  rsCateGory =(RecordsetClass)objProduct.getCategory
    (g_strcompanyurl,null);
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    {
     
      

  7.   

    获取对象类型就是GetType方法..对你的问题,我再本地测试引用ADODB后,没问题的..可以正常
      

  8.   

    object rs = paramobj.fun();这样直接写,然后rs.GetType(),看看输入的类型是什么.
      

  9.   

    我是这样写的
    Object rs = paramobj.fun();
    Response.Write(rs.GetType().ToString());测试结果是:System.String
      

  10.   

    我不明白为什么会是System.String,如果是System.String那它在asp中怎么可以movenext呢?
    另外我也很疑惑,在dll里面有一个interface obj,还有一个class objclass,在asp里面是写的
    set rs = Server.CreateObject("crmWeb.obj")而不是
    set rs = Server.CreateObject("crmWeb.objclass"),是什么原因啊?
      

  11.   

    crmWeb.obj是com组件在注册表的信息,你可以用regedit查到
      

  12.   

    <%
               dim objProduct
               dim rsCategory
               
               set objProduct=server.CreateObject("crmWeb.rsProduct")            if isobject(objProduct.getCategory(g_strcompanyurl,null)) then
          set rsCategory=objProduct.getCategory(g_strcompanyurl,null)
      else 
          Response.Redirect "crError.asp"
      end if
             %>
             <div class="simpleItemSearch">
             <form name="frmSearch" action="crItemListView.asp?flag=byName" method="post">
            <div>&nbsp;&nbsp;&nbsp;<b>Search</b></div>
            <select id="sltCategory" name="sltCategory" >
    <option value="">[All categories]
    <%do while not rsCategory.eof%>
    <option value="<%=server.HTMLEncode(rsCategory("cCategory"))%>"><%=rsCategory.fields("vcDesc").value%><%rsCategory.moveNext
             Loop%>
    </select>
    <div><input id="txtItemName" name="txtItemName" maxlength=40><label onclick="Javascript:frmSearch.submit();return false;" title="Go">&nbsp;&nbsp;GO</label></div>
    <A href="crAdvanceSearch.asp">Advanced Search</A>
    </form>
      </div>
      

  13.   

    crmWeb.obj是com组件在注册表的信息,你可以用regedit查到
    是什么意思啊?是说interface obj只是为了给注册表注册用的,在程序中没有实际用途吗?那我是不是就该把set rs = Server.CreateObject("crmWeb.obj")改成
    crmWeb.objclass rs = new crmWeb.objclass()啊?
      

  14.   

    下班了...唉..这个是我的测试代码ConnectionClass和RecordsetClass:
    你引入ADODB.Dll之后.先using ADODB,然后加入下面的代码.
    ==============================ConnectionClass conn = new ConnectionClass();
    string connstr = "PROVIDER=SQLOLEDB;DATA SOURCE=(local);database=test;User Id=sa;PASSWORD=aa;";
    conn.Open(connstr,"sa","aa",0);
    RecordsetClass r = new RecordsetClass();
    string sql = "select * from new";
    r.Open(sql,conn,ADODB.CursorTypeEnum.adOpenForwardOnly,ADODB.LockTypeEnum.adLockReadOnly,0);
    if (r.EOF && r.BOF) {
    Response.Write("没有记录!");
    }else {
    Response.Write(r.RecordCount);
    // for (int i = 0 ; i < r.RecordCount ; i++)
    // Response.Write( i + ":" + r.Fields[i].Value + "<br>");
    }
    r.Close();
    conn.Close();
      

  15.   

    哥哥,你的这个程序没有问题证明一点,asp.net中有recordset可用,但是问题是我的两个问题还没有解决,一是,是否asp.net的recordset和asp中的recordset相兼容,就是说我能不能用
    asp.net 中的recordset对象接收 asp中的recordset对象?
    第二,asp中的recordset返回到asp.net中到底还是不是recordset对象了?为什么我测试的会变成System.String了?
    第三,我能否在asp.net生成一个recordset实例来接收 由asp传过来的recordset数据集(这个问题好像和第一个问题差不多)
      

  16.   

    我也认为,
    人家问的是.NET怎么接受COM返回的Recordset
      

  17.   

    你问的问题都可以..只要在ASP下可以使用,在ASP.NET完全没问题..只是我也没有你的组件,没办法知道具体的情况..很难下结论..另外,我看了你的ASP代码,fun()返回的应该是Recordset对象..
    adodb.recordset rs ;
    rs = (recordsetclass )paramobj.fun();你这么写.看看行不
      

  18.   

    .NET认识recordsetclass吗?
    rs      net认识吗?
      

  19.   

    .NET认识recordsetclass吗?
    rs      net认识吗?=================你引用了ADODB之后,当然可以使用了..看看我上面给的例子就明白了.
      

  20.   

    感谢两们大哥的帮忙, bingbingcha(不思不归,不孟不E,原来是头大灰狼) 大哥,我按照你教我的办法再试一下,不行再来请教
      

  21.   

    还是错误啊,指定的转换无效
    应用程序中的服务器错误。
    --------------------------------------------------------------------------------指定的转换无效。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidCastException: 指定的转换无效。源错误: 
    行 74: // Response.Write(rsCateGory.GetType().ToString());
    行 75:  ADODB.Recordset rs;
    行 76:  rs = (RecordsetClass)objProduct.getCategory(g_strcompanyurl,null);
    行 77: 
    行 78: // if(!objProduct.getCategory(g_strcompanyurl,null).GetType().Equals(rsCateGory))
     源文件: f:\pro\test\test.aspx.cs    行: 76 堆栈跟踪: 
    [InvalidCastException: 指定的转换无效。]
       eShop.test.ShowData() in f:\pro\test\test.aspx.cs:76
       eShop.test.Page_Load(Object sender, EventArgs e) in f:\pro\test\test.aspx.cs:51
       System.Web.UI.Control.OnLoad(EventArgs e)
       System.Web.UI.Control.LoadRecursive()
       System.Web.UI.Page.ProcessRequestMain() 
    --------------------------------------------------------------------------------
    版本信息: Microsoft .NET Framework 版本:1.1.4322.573; ASP.NET 版本:1.1.4322.573
      

  22.   

    rs = (RecordsetClass)objProduct.getCategory
    改为这个
    rs = objProduct.getCategory试试
      

  23.   

    感谢您的耐心等待!首先生成class和interface接口是COM Interop的默认行为,通常我们在.NET中使用COM Interop创建对象时,都是调用如:
    RecordSet rs = new RecordSetClass()这种方式,而关于这种行为的具体信息,我建议您可以到VC++新闻组进行咨询,这部分属于COM的方式,与.NET的编程方式有区别。
    另外使用“param.movenext”,如果该对象自己重写了movenext方法或者实现了ICollection接口,都是可以调用这个方法的,因此我不是很清楚这里您可以确定返回的是一个RecordSet对象么?请您能否提供一下VB中相关的代码。
    “是不是asp里的recordset在asp.net里面就返回成string类型的啦啊?”
    这个当然不是,RecordSet返回的依然是RecordSet类型。
    “还有我应该怎么在asp.net中调用com里面的recordset数据集呢?”
    我们依然可以向ASP中使用RecordSet一样来使用,只要我们自己创建数据库连接,然后new RecordSet对象即可。“问题是原来的ASP系统中,所有的数据访问层都封装在dll文件中,然后返回recordset数据集给前台调用。如果我现在要改的话,我根本不知道dll文件中的函数做了什么,连接哪个数据库等等一系列的问题,我该怎么解决呢?”
    这个需要创建DLL的人提供相关的文档说明,或者使用VS.NET 2003提供的“COM/OLE Object Viewer”来查看。希望我的回复对您有所帮助,谢谢!