我在前面有发了两帖,但都石沉大海,杳无音信,大家可以看看我前面的帖
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数据集呢?
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数据集呢?
解决方案 »
- asp.net的page_load事件中能进行数据库操作吗
- svn提交时出错
- url 传参的时候URL重写后乱码,不重写的没事
- 后台代码里,怎样引用另外一个网页?
- 自定义控件事件问题,请各位大哥帮助!
- 折磨我三天的问题:Oracle8.05中使用Parameters报错,请思归、孟子及高手进来指点。
- 能否用JSValidation验证框架对服务器端控件进行客户端验证?怎么用?望大侠帮忙!急!!!
- 急,换了空间没法用,在线等....完了就结贴
- 浏览器打开word文档是出错
- 请问各位仁兄 如何在处理我部署工程时的错误 谢拉 我给100分
- ————关于网站效率的再问,谢谢
- 请问,在Asp.net 2.0中是怎么实现多语言的!!
这是.NET里面的类型封送,但是,建议不要用COM返回recordset,因为.NET不认recordset类型,
返回一个数组不知道可以不可以,如果用.NET做一个数据访问也就5分钟吧,很多问题需要说明,COM与.NET的互操作性,
你也可以去Microsoft News Group看看,应该可以给你一个满意的答复,
谢谢如果需要进一步帮助,可以email:[email protected]
找到 交互操作谢谢
adodb.recordsetclass rs ;
rs = (recordsetclass )paramobj.fun();你再次编译一下看看..如果有问题,请贴出来..我下班前会再来看一次..
至于 VB的类是怎么样的,我也不知道,因为当时做这个程序开发的人好像都不在公司了。但是我按他在ASP中的写法,他应该是返回了一个recordset数据集,因为他在asp的版本中有这么一句:
set param = paramobj.fun();然后后面就可以用param.movenext,这是对reocrdset类型的典型写法。
我想请问一下我怎么得到一个COM函数返回值的类型呢?如果我用paramobj.fun().GetType().ToString()得到的是返回值类型吗?我用paramobj.fun().GetType().ToString()后,显示的是System.String类型
--------------------------------------------------------------------------------指定的转换无效。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidCastException: 指定的转换无效。源错误:
行 71: Response.Write((objProduct.getCategory(g_strcompanyurl,null)).GetType().IsClass);
行 72: RecordsetClass rsCateGory;
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
行 73: rsCateGory =(RecordsetClass)objProduct.getCategory
(g_strcompanyurl,null);
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
{
Object rs = paramobj.fun();
Response.Write(rs.GetType().ToString());测试结果是:System.String
另外我也很疑惑,在dll里面有一个interface obj,还有一个class objclass,在asp里面是写的
set rs = Server.CreateObject("crmWeb.obj")而不是
set rs = Server.CreateObject("crmWeb.objclass"),是什么原因啊?
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> <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"> GO</label></div>
<A href="crAdvanceSearch.asp">Advanced Search</A>
</form>
</div>
是什么意思啊?是说interface obj只是为了给注册表注册用的,在程序中没有实际用途吗?那我是不是就该把set rs = Server.CreateObject("crmWeb.obj")改成
crmWeb.objclass rs = new crmWeb.objclass()啊?
你引入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();
asp.net 中的recordset对象接收 asp中的recordset对象?
第二,asp中的recordset返回到asp.net中到底还是不是recordset对象了?为什么我测试的会变成System.String了?
第三,我能否在asp.net生成一个recordset实例来接收 由asp传过来的recordset数据集(这个问题好像和第一个问题差不多)
人家问的是.NET怎么接受COM返回的Recordset
adodb.recordset rs ;
rs = (recordsetclass )paramobj.fun();你这么写.看看行不
rs net认识吗?
rs net认识吗?=================你引用了ADODB之后,当然可以使用了..看看我上面给的例子就明白了.
应用程序中的服务器错误。
--------------------------------------------------------------------------------指定的转换无效。
说明: 执行当前 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
改为这个
rs = objProduct.getCategory试试
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”来查看。希望我的回复对您有所帮助,谢谢!