本来也许没那么容易产生误会,全因为偶的一个问题。
偶那天想要获取一个库所有的表名,可是一个异常出现,我觉得有些个费解。预先查询了不少的资料以后,想问问前些日子翻blog 翻到的mvm同志。相信能确认一下子答案。结果...发生了小插曲。
第一幕act 1
获取表名这个问题实在是不好回答。
在delphi 中很好办
TADOConnection.GetTableNames(List: TStrings; SystemTables: Boolean = False);
可是.Net 中呢?我找了几天还是没有找到好的办法。
问了一下mvm回答我两个办法
>(1) syntax
>SQL = "SELECT Name FROM MSysObjects WHERE (Name Not Like 'MSys*') AND
>(Type=1 Or Type=6);"
>.Open SQL , db, adOpenDynamic
>
>I forgot to put in the connection & cursor
我对这个方法是尝试过的,在access中建立查询可以,但是在asp.net 或者delphi 应
用中均出现权限不足的问题。
MVM的答复是
在asp.net中无法运行,多半是因为权限问题。要么可以把asp.net的运行账号(在
win2k和win2003中不一样的)放到administrators组里面,或者可以在asp.net里面用
impersonate把asp.net的工作进程的权限升上去。
以前我在asp.net里面调用wmi也遇到类似的问题的,用impersonate把权限升上去就好
了。
我却不大了解这个impersonate,因为没有时间尝试。所以还没有试验。项目也不会同意修改权限。
>(2)
>found the answer in MSDN....look for "OpenSchema Method" Works like a charm
>
>Public Sub OpenSchemaX()
>
> Dim cnn1 As ADODB.Connection
> Dim rstSchema As ADODB.Recordset
> Dim strCnn As String
>
> Set cnn1 = New ADODB.Connection
> strCnn = "Provider=sqloledb;" & _
> "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
> cnn1.Open strCnn
>
> Set rstSchema = cnn1.OpenSchema(adSchemaTables)
>
> Do Until rstSchema.EOF
> Debug.Print "Table name: " & _
> rstSchema!TABLE_NAME & vbCr & _
> "Table type: " & rstSchema!TABLE_TYPE & vbCr
> rstSchema.MoveNext
> Loop
> rstSchema.Close
>
> cnn1.Close
>
>End Sub
这是来自msdn 的方法,我找到类似的几个。mvm提供的方法我观察好像是vb 而非.net的方法?
VB.Net中能用不?
该方法来自
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052
/ado270/htm/mdaexamples_vb02_9.htm)?
.net中
而我找的第三种方法
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html
/frlrfSystemDataOleDbOleDbConnectionClassGetOleDbSchemaTableTopic.htm)
也不对。
constr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=0712.mdb;User
Id=Admin;Password=;Jet OLEDB:Database Password=xxxxxx;"
Dim oldCon As OleDbConnection _
= New OleDbConnection(constr)
Dim oleAd As OleDbDataAdapter = New OleDbDataAdapter
'some operate here
Dim schemaTable As DataTable = New DataTable
Try
schemaTable = oldCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
New Object() {Nothing, Nothing, Nothing, "TABLE"})
Catch ex As Exception
System.Diagnostics.Debug.Write(ex.Message)
End Try
结果是 System.InvalidOperationException
ex.Message = "无效操作。连接被关闭。"
我用的是OleDbConnection
最后还是没办法用,不知道那个adodb在.Net中还有么?
时间紧,有时间在继续研究哈。
结果不想,这个小小的问题中下了隐患。欲知后事请看下文