ASPXSHELL开发之.NET调用非托管DLL小记


author : kj021320 

    近日来经过团队的一些意见,继续完善ASPXSHELLBUG以及新加入功能,搞到数据库的地方...

当然二话不说,直接去下了官方的ADO.NET 手册翻了翻!

要做数据库控制,当然要做基础的2件事了。

1. 遍历元数据

2. 所有SQL语句操作

 

那怎么去做这个 遍历元数据呢?

打开文档找到OdbcConnectionGetSchema 方法!

看了看帮助感觉很不错

抬头一瞄,发现有句很明显的鸟话!

注意:此方法在 .NET Framework 2.0 版中是新增的。

 

我操了!那就是.NET 1.1的不支持!

再找到OleDbConnection这个类,发觉GetSchema一样的! 真汗!-_-

郁闷之下想了想!

如果要做成通用的支持1.1 2.0 3.0都能支持的SHELL 那么就需要找个万全的策略...

翻遍了GOOGLE无奈之下只能自己从经验里面找方案了

 

1.       2.0以上的.NET库代码中,把GetSchema函数的代码COPY出来自己做一个实现

2.       抛开ADO.NET,用其他方式操作数据库

 

又拿出我惯用的工具Reflector ,打开一看GetSchema代码行数就啥也不想说了...

接下来找找非ADO.NET的实现,那就直接用ADO比较土的。

但是ADO不是.NET DLL!也就是非托管的!要用当然MS也给了方法了!

就是把DLL拷贝到 WEB BIN目录,然后就可以直接import来使用了!这个肯定不可能的啊,脚本的SHELL搞的那么复杂...那就只能用Assembly指令如下:

<%@ Assembly Name="assemblyname" %>

<%@ Assembly Src="pathname" %>

 

<%@ Assembly Name="ADODB, Version=7.0.3300.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %>

这样就把ADODB加载进来了!

OK第一个问题搞定~

 

现在来使用RecordsetGetRows函数,ASP中这个函数非常常用,一般调用就直接

Dim tablesRows

tablesRows=rs.GetRows()

 

但是其实ADO手册中对这个GetRows函数有其定义

GetRows 方法

Recordset 对象的多个记录恢复到数组中

语法

array = recordset.GetRows( Rows, Start, Fields )

返回值

返回二维数组

参数

Rows    可选,长整型表达式,指定要检索记录数默认值为 adGetRowsRest (-1)

Start    可选,字符串长整型,计算得到在 GetRows 操作开始处的记录的书签也可使用下列 BookmarkEnum 飞,飞Asp技术乐园

常量

说明

AdBookmarkCurrent

从当前记录开始

AdBookmarkFirst

从首记录开始

AdBookmarkLast

从尾记录开始

Fields   可选,变体型,代表单个字段名、顺序位置、字段名数组或顺序位置号ADO 仅返回这些字段中的数据

 

可选?

转到C#代码中测试结果发现错误

object[][] rows;

rows=(object[][])rs.GetRows();//错误方法调用

 

郁闷了!难道.NET不支持 可选类型!?

换个方式

object[][] rows;

rows=(object[][])rs.GetRows(-1,null,null);//参数传入错误!

折腾了整个晚上!翻遍了GOOGLE,汗啊!

后来想来想去... 这样搞不是办法!直接采用反射,获取他的函数实体

看看他的参数是啥类型属性的!遍历出来看!挖他个底朝天!

Type t = rs.GetType();

MethodInfo mi = t.GetMethod("GetRows");

ParameterInfo[] pis= mi.GetParameters();

foreach(ParameterInfo p in pis)

{

echo(p.GetOptionalCustomModifiers());

echo(p.DefaultValue);

}

搞到最后!结果发现MS里面居然还有一个Missing类型代表缺省,汗啊!佩服佩服!鄙视鄙视!

最终结果需要这样调用!郁闷得哭了!发飚了... @_# 这个垃圾浪费了我人生中非常宝贵的4个小时!

object o = Missing.Value;

rows = (object[,])rs.GetRows(-1, o, o);

就两句话!哎!~~ 无语

posted on 2008-02-18 20:54  springside例子  阅读(136)  评论(0编辑  收藏  举报