我有一个持续的问题,Windows服务会收到此Oracle错误:
消息:ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误
但是,我肯定我将数值传递给Oracle。通过使用我们的Oracle DBA和Oracle支持服务单,我们能够捕获Oracle服务器收到的内容。我的问题是绑定变量#10。 Oracle在服务器上的跟踪日志中报告的值是“ A @ Y8 ”。但是,我实际发送的值是 167569173 。
Oracle值“A @ Y8”看起来并不熟悉 - 它不是来自其他字段的值。它始终与Oracle跟踪文件中的值相同 - 始终为A @ Y8。但是我发送的数值对于每条记录都是不同的。
该服务每隔几分钟从外部源提取数据并将其插入Oracle。它工作了大约两天,然后我得到了ORA-06502。一旦我收到Oracle错误,我会在每次通过时继续获取它,直到我重新启动服务。当服务重新启动时,它会运行属性几天 - 即使它正在拉动导致错误的相同数据。
对程序的调用发生转换错误。也就是说,当尝试将参数传递给过程中实际插入的过程no时。
不知何故,Oracle收到代码时,我的代码中的Integer值不是Integer。似乎有一些腐败,但我认为它不在Vb.Net中。我的字段是一个整数,不符合Oracle报告的值。
如果该字段确实保持该值,那么它应该在我记录它时记录该值。
如何查看Oracle客户端向Oracle服务器发送的值?我找不到任何相关的客户端日志。
关于可能导致这种情况的任何想法?
以下是Oracle跟踪条目:
Bind#10
oacdty=01 mxl=32(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=178 siz=0 off=480
kxsbbbfp=9fffffffbed31848 bln=32 avl=06 flg=01
value="A@Y8"
EXEC #11529215044982021440:c=0,e=1300,p=0,cr=34359738368,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=2656312500288
ERROR #4:err=6502 tim=2656312500311
这是我的代码: 这是插入数据库的方法 - 它会抛出错误:
Public Shared Sub AddNewUploadedDocument(document As ManualUploadDocument)
Using conn As OracleConnection = DataFactory.GetConnection()
Using command As New OracleCommand("OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments", conn)
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add("tSelecteeID", document.SelecteeID)
command.Parameters.Add("tFileName", document.FileNameGUID)
command.Parameters.Add("tFileType", document.FileType)
command.Parameters.Add("tOriginalFileName", document.OriginalFileName)
command.Parameters.Add("tOriginalFileType", document.OriginalFileType)
command.Parameters.Add("tDocTypeID", DBNull.Value)
command.Parameters.Add("tStatus", document.Status.ToString())
command.Parameters.Add("tSource", Integer.Parse(document.Source))
command.Parameters.Add("tSubmitted", Convert.ToInt32(document.Submitted))
command.Parameters.Add("tIsStaffingConversion", Convert.ToInt32(document.IsStaffingConversion))
command.Parameters.Add("tStaffingDocumentationID", document.StaffingDocumentationID)
command.ExecuteNonQuery()
End Using
'close connection
conn.Close()
End Using
End Sub
在此之后,我调用此方法来记录值:
Private Shared Function getInsertAttemptFields(document As OnBoardingDataObjects.ManualUploadDocument) As String
Dim sb As New StringBuilder()
sb.AppendLine("Insert Fields")
sb.Append("tSelecteeID:")
sb.AppendLine(document.SelecteeID)
sb.Append("tFileName:")
sb.AppendLine(document.FileNameGUID)
sb.Append("tFileType:")
sb.AppendLine(document.FileType)
sb.Append("tOriginalFileName:")
sb.AppendLine(document.OriginalFileName)
sb.Append("tOriginalFileType:")
sb.AppendLine(document.OriginalFileType)
sb.Append("tDocTypeID:")
sb.AppendLine("<null>")
sb.Append("tStatus:")
sb.AppendLine(document.Status.ToString())
sb.Append("tSource:")
sb.AppendLine(Integer.Parse(document.Source))
sb.Append("tSubmitted:")
sb.AppendLine(Convert.ToInt32(document.Submitted))
sb.Append("tIsStaffingConversion:")
sb.AppendLine(Convert.ToInt32(document.IsStaffingConversion))
sb.Append("tStaffingDocumentationID:")
sb.AppendLine(document.StaffingDocumentationID)
Return sb.ToString()
End Function
这是我传递给两个方法的同一个对象。 StaffingDocumentationID字段是Oracle跟踪显示为A @ Y8的字段,日志显示为167569173。
这是我传递的manualUploadDocument对象的定义。为简洁起见,我在某些方法中删除了代码 - 这里的属性是相关的,删除的代码不会引用它们。
<Serializable()>
Public Class ManualUploadDocument
Private _Submitted As Boolean = False
Public Property DocumentUploadID As Integer
Public Property SelecteeID As Integer
Public ReadOnly Property FileName As String
Get
Return FileNameGUID + "." + FileType
End Get
End Property
Public Property FileType As String
Public Property OriginalFileName As String = ""
Public Property OriginalFileType As String = ""
Public Property DocumentTypeID As Integer
Public Property DocumentType As String = ""
Public Property UploadDate As Date
Public Property FileNameGUID As String
Public Property Status As PublicEnums.ManualUploadStatus
Public Property Source As PublicEnums.ManualUploadSource
Public Property IsMarkedFortransmission As Boolean = False
Public Property TransmissionStatusDescription As String
Public Property IsStaffingConversion As Boolean = False
Public Property StaffingDocumentationID As Int32?
Public Property Submitted As Boolean
Get
Return _Submitted
End Get
Set(value As Boolean)
_Submitted = value
End Set
End Property
Public Shared Function getStatusDisplayName(status As PublicEnums.ManualUploadStatus) As String
Dim name As String = ""
'Some code here
Return name
End Function
Public Shared Function getStatusDescription(status As PublicEnums.ManualUploadStatus) As String
Dim val As String = ""
'Some code here
Return val
End Function
End Class
答案 0 :(得分:0)
好吧,我没有在提供的代码中看到任何错误。因此,OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments存储过程中应该存在一些错误。无论如何,我有三条建议:
1-确保存储过程OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments正确。
2-在AddNewUploadedDocument中使用try catch块,如:
Public Shared Sub AddNewUploadedDocument(document As ManualUploadDocument)
Using conn As OracleConnection = DataFactory.GetConnection()
Using command As New OracleCommand("OM.EXTERNAL_DOCUMENT_OBJECTS.insertUploadedDocuments", conn)
Try
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add("tSelecteeID", document.SelecteeID)
command.Parameters.Add("tFileName", document.FileNameGUID)
command.Parameters.Add("tFileType", document.FileType)
command.Parameters.Add("tOriginalFileName", document.OriginalFileName)
command.Parameters.Add("tOriginalFileType", document.OriginalFileType)
command.Parameters.Add("tDocTypeID", DBNull.Value)
command.Parameters.Add("tStatus", document.Status.ToString())
command.Parameters.Add("tSource", Integer.Parse(document.Source))
command.Parameters.Add("tSubmitted", Convert.ToInt32(document.Submitted))
command.Parameters.Add("tIsStaffingConversion", Convert.ToInt32(document.IsStaffingConversion))
command.Parameters.Add("tStaffingDocumentationID", document.StaffingDocumentationID)
command.ExecuteNonQuery()
Catch Ex as Exception
Log (document.StaffingDocumentationID)
Log (Ex.StackTrace)
End Try
结束使用 '紧密联系 conn.Close() 结束使用
End Sub
3-如果其他一切都失败了,用sql语句而不是存储过程重写AddNewUploadedDocument。