尝试调用Oracle.DataAccess.Client.OracleDataAdapter.Fill()时出错

时间:2012-03-26 13:58:35

标签: oracle powershell odp.net

当我尝试调用Fill()时,会记录以下错误,并且我的powershell会话崩溃。

  

事件类型:错误事件源:.NET运行时描述:.NET运行时   版本2.0.50727.3625 - 尝试读取或写入受保护的内存。   这通常表明其他内存已损坏。

我的脚本如下:

$asm = [System.Reflection.Assembly]::LoadWithPartialName(“Oracle.DataAccess”) 
$userName = "foo"
$tnsDbName = "bar"
$pass = "foobar"
$connectionString = "User Id=$userName;Password=$pass;Data Source=$tnsDbName"

$q = @"
SELECT * FROM blah WHERE blar = '5848752'
"@

$cstr = $connectionString 
$conn= New-Object Oracle.DataAccess.Client.OracleConnection($cstr)
$conn.open()
$adapter = New-Object Oracle.DataAccess.Client.OracleDataAdapter($q,$conn)
$dataset = New-Object Data.DataSet
$adapter.Fill($dataset)
$dataset.Tables[0]

如果我只是通过“$ adapter =”行跑来查看崩溃前的事情状态:

PS H:\> $asm.GetName()

Version        Name                                                                                         
-------        ----                                                                                         
10.2.0.100     Oracle.DataAccess  

PS H:\> $adapter.SelectCommand.Connection | fl ClientID,ConnectionTimeout,ServerVersion,State


ClientId          : 
ConnectionTimeout : 15
ServerVersion     : 10.2.0.4.0
State             : Open

我愿意接受建议!在我的计算机上可能已经对ODP.NET进行了更新,但是使用它的所有其他应用程序(一些简单的winform应用程序)和Toad for Oracle都可以正常运行。

1 个答案:

答案 0 :(得分:0)

你看到了这个吗? An access violation occurs when you run a .NET Framework 2.0-based application that has a virtual call the IList, IEnumerable, or ICollection interface in an LCG (Lightweight Code Generation) method. DataSet确实实现了IListSource,它有一个方法GetList(),它返回一个实现IEnumerable的IList。