7月的误会(2)

如何获取access中的所有表名? 代价:老典型...
问了mvm问题,mvm回答了我。虽然不是我想的办法,不想当了典型。
详见
http://blog.joycode.com/mvm/archive/2004/07/27/28502.aspx

Mvm语
-------------------------
我从看到他的信,到搜索,到scan搜索结果,到找到答案,甚至还包括验证那条SQL是否真的有效,总共花了才不过两三分钟。

那么这么容易就能够找到答案的问题,为什么给我写信的那位还要写信来问我呢?是不是因为掌握的资源不够多,不知道http://groups.google.com?还是因为英语不够好,因而无法选择有效的关键字?其实我并不觉得我自己是一个优秀程序员,但至少我不会去问别人一个在Internet上或者MSDN里面很容易能够搜索到答案的问题。以前也有很多人觉得CSDN和Newsgroup里面的很多人总是问一些答案唾手可得的问题,因而有感于中国程序员的一些有待提高的地方,我从今天这件事情上,也有类似的感觉吧。

Btw,如果用百度搜索关键字“Microsoft Access 所有表”,返回的第一条就是正确答案。如此轻易。
-------------------------

对于这种指责,若真是如mvm所言,也就算了。被盲目画为典型,还是颇有气愤的心情啊。回头想想我哪里做错了?
于是回答mvm
-------------------------
Mvm,我就是那个“不争气的”程序员!我终于抽出点时间再次光临您的blog...原来你对我本人的评价不怎么好么。首先我想声明的是,您的评论似乎有些武断。对您的话 我首先作为一个求教者对你表示感谢。不过是想说明,我再问您之前已经在google上搜索过2个小时,至于msdn我也搜索过了,找到的方法早已经包括了您第一次提供的方法。该2种方法我都测试过不符合要求,或者说行不通。具体的原因在第二封信中我详细说明了,但是您似乎已经断定我是个初,只是叫我提升asp.net权限。其实我是个5年的程序员了。不用说很注意搜索先,并注意询问有可能知道人的,最后才问不相识的您,并且了解提问的技巧。并且我想我在第二次的信中委婉提出了我要的答案不是那样,并想和您交个朋友。呵呵。看来您没想仔细看。感谢“开心就好”对http://groups.google.com不能访问的解释。在给mvm第二次的信中提到,但是您并没有在意。感谢来自博客堂的人们开心、重粒子、Ripper等等,感谢mvm的两次回答。本来在总结了这个没解决的问题后,再来看看您的blog。不幸当了典型...一个老典型:(
------------------------

给mvm同志留言以后 mvm好人做到底

------------------------

又:这位问我问题的朋友后来又跟我说我给的答案不对,云云,具体的可以见下面的留言。

那么既然如此,好人做到底,我把在ASP.NET里面用CSharp列出Access 2003里面所有的Table名字的程序贴一下:

private string GetTableList()
{
    string result=""; 
    ADODB.Connection Cn=new ADODB.ConnectionClass(); 
    ADODB.Command Cmd=new ADODB.CommandClass(); 
    ADODB.Recordset Rs1; 
    Cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C://Inetpub//wwwroot//AccessTables//aaa.mdb","Admin","",0); 
    Rs1 = Cn.OpenSchema(ADODB.SchemaEnum.adSchemaTables,System.Reflection.Missing.Value,System.Reflection.Missing.Value); 
    do{ 
        foreach(ADODB.Field field in Rs1.Fields){ 
            result+=field.Value+";"; 
        } 
        result+="/r/n"; 
        Rs1.MoveNext(); 
    }while(Rs1.EOF==false); 
    Rs1.Close(); 
    return result;
}

用的时候,项目里面要添加ADO 2.7的引用(我认为2.6或者2.5也肯定是可以的),其他什么配置都不需要。不需要改动access文件的users and groups permission,也不需要做asp.net上面的impersonate。运行结果是这样的:

;;MSysAccessObjects;ACCESS TABLE;;;;2002-12-17 1:48:35;2002-12-17 1:48:35;
;;MSysAccessXML;ACCESS TABLE;;;;2004-7-29 16:56:40;2004-7-29 16:56:40;
;;MSysACEs;SYSTEM TABLE;;;;2000-4-6 17:49:34;2000-4-6 17:49:34;
;;MSysObjects;SYSTEM TABLE;;;;2000-4-6 17:49:34;2004-7-29 16:57:18;
;;MSysQueries;SYSTEM TABLE;;;;2000-4-6 17:49:34;2000-4-6 17:49:34;
;;MSysRelationships;SYSTEM TABLE;;;;2000-4-6 17:49:34;2000-4-6 17:49:34;
;;Table_asdfa;TABLE;;;;2004-7-29 16:56:51;2004-7-29 16:56:51;
;;table_lkjlkjlkj;TABLE;;;;2004-7-29 16:56:40;2004-7-29 16:56:40;

这次我是用“access MSysObjects permission select table”为关键字在www.google.com搜索来的(不是groups)。第一页的结果里面有段code就是对的,我只不过从VB的代码改到了C#而已。
------------------------

这也基本是个结局了,虽然后来我还是用了自己的办法
------------------------

mvm 好人做到底,给出了引用ado的操作,再次感谢。偶也终于成功了OLEDB的。原因呢?偶们的proj没用这一类ADO的类,要是添加个引用,就又会有人提出异议,所以我又找找,方法来自msdn。用的System.Data.OleDb,无需添加引用,比较符合我当前的项目。这方法在回给mvm的信中提到,当时出现了奇怪的异常,我没搞定,今天再试,结果好了(Dataset open的问题,msdn异常中解释)......
;(
VB代码如下

Imports System.Data.OleDb

Dim strConn As String _
= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/DefaultWeb/Web3/db1.mdb;Persist Security Info=False;Jet OLEDB:Database Password="
Dim conn As System.Data.OleDb.OleDbConnection _
= New System.Data.OleDb.OleDbConnection(strConn)
conn.Open()
Dim schemaTable As DataTable _
= conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
Dim DR As DataRow
Dim strOutput As String
Dim i As Integer
For Each DR In schemaTable.Rows
For i = 0 To schemaTable.Columns.Count - 1
strOutput = strOutput & schemaTable.Columns(i).ColumnName & "=" & DR(i) & ","
Next
System.Diagnostics.Debug.WriteLine(strOutput)
strOutput = ""
Next
conn.Close()

output as follows:
TABLE_CATALOG=,TABLE_SCHEMA=,TABLE_NAME=telelist,
TABLE_TYPE=TABLE,TABLE_GUID=,DESCRIPTION=,
TABLE_PROPID=,DATE_CREATED=2003-10-14 18:11:20,
DATE_MODIFIED=2003-10-14 18:37:07,

------------------------

相信大家对于CSDN或者其他地方的高手,也许新手,也有可能遇到这种情形,双方都应该静心思量一下。我就是抱着交个朋友的心情,被示众的。心情沉重呀。博客堂是我常常去的地方,mvm和我本在一个城市,希望在这次误会之后,不要给大家心里面留下不快。
BTW 还是要感谢来自博客堂的人们。只是不幸当了典型...一个老典型:(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值