author : kj021320
近日来经过团队的一些意见,继续完善ASPXSHELL的BUG以及新加入功能,搞到数据库的地方...
当然二话不说,直接去下了官方的ADO.NET 手册翻了翻!
要做数据库控制,当然要做基础的2件事了。
1. 遍历元数据
2. 所有SQL语句操作
那怎么去做这个 遍历元数据呢?
打开文档找到OdbcConnection的GetSchema 方法!
看了看帮助感觉很不错
抬头一瞄,发现有句很明显的鸟话!
注意:此方法在 .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第一个问题搞定~
现在来使用Recordset的GetRows函数,在ASP中这个函数非常常用,一般调用就直接
Dim tablesRows
tablesRows=rs.GetRows()
但是其实ADO手册中对这个GetRows函数有其定义
GetRows 方法
将 Recordset 对象的多个记录恢复到数组中。
语法
array = recordset.GetRows( Rows, Start, Fields )
返回值
返回二维数组。
参数
Rows 可选,长整型表达式,指定要检索记录数。默认值为 adGetRowsRest (-1)。
Start 可选,字符串或长整型,计算得到在 GetRows 操作开始处的记录的书签。也可使用下列 BookmarkEnum 值。
常量 | 说明 |
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);
就两句话!哎!~~ 无语