【发布时间】:2021-06-30 22:59:57
【问题描述】:
我正在尝试在我的 .net 应用程序中获取视图的来源。
为此,我查询DBA_VIEWS:它有一列TEXT 正是我需要的。类型为LONG。
如果我使用非托管驱动程序,一切都会按预期工作。
与托管驱动程序相同的代码导致ORA-01009: missing mandatory parameter。
使用断点和“慢”步骤有时围绕命令和添加事务会导致相同的代码工作。
ODP.NET 版本是 19,Oracle DB 是 18c Express Edition。奇怪的是,无论驱动程序类型如何,相同的代码都可以在 Oracle Database 12c 中正常工作。
我是否需要在数据库或代码中更改某些设置?我完全迷路了。
我用于测试的代码:
Imports System.Data.Common
Imports Oracle.ManagedDataAccess
'Imports Oracle.DataAccess
Module Views
Function CreateCommand(Connection As DbConnection) As System.Data.Common.DbCommand
Dim cmd As Data.Common.DbCommand = Connection.CreateCommand()
With CType(cmd, Client.OracleCommand)
.BindByName = True
.FetchSize = &H100000 '1 Mb
.InitialLONGFetchSize = -1 'the entire LONG or LONG RAW data is prefetched and stored in the fetch array.
.InitialLOBFetchSize = -1 'the entire LOB data is prefetched and stored in the fetch array.
End With
Return cmd
End Function
Sub query()
Try
Using DBConnection = New Client.OracleConnection("User ID=TESTUSER;Password=TESTPWD;Data Source=TESTDB;Pooling=True")
DBConnection.Open()
Using DBConnection.BeginTransaction()
Using cmdSQL = CType(CreateCommand(DBConnection), Client.OracleCommand)
cmdSQL.CommandText = "select TEXT from DBA_VIEWS where VIEW_NAME = :0"
Dim p = cmdSQL.CreateParameter()
p.ParameterName = "0"
p.Value = "TEST_VIEW"
cmdSQL.Parameters.Add(p)
Dim sw = Stopwatch.StartNew
Using rdr = cmdSQL.ExecuteReader
rdr.FetchSize = 2 ^ 20
While rdr.Read
Dim row(rdr.FieldCount - 1) As Object
rdr.GetProviderSpecificValues(row)
Dim x = row(0)
Console.WriteLine($"{x.ToString.Length} bytes")
End While
End Using
Console.WriteLine($"{sw.ElapsedMilliseconds} ms")
End Using
End Using
End Using
Catch ex As Exception
Console.WriteLine(ex.ToString)
End Try
End Sub
End Module
【问题讨论】:
-
不确定它会起作用,但试试这个:
"begin select TEXT into :0 from DBA_VIEWS where VIEW_NAME = :1; end;"。添加2个参数。确保第一个parameterDirection = output、oracleDbType = Long、size=1000000。并使用cmd.ExecuteNonQuery。然后,如果检索到参数,只需使用cmd.Parametersp[0].Value.ToString() -
@T.S.这确实有效,谢谢!
-
添加了答案。自己知道也很好。
标签: oracle vb.net odp.net odp.net-managed