我有一个在TOAD中执行正常的查询,但是当使用ADO.Net DataReader或DataAdapter / DataSet返回结果时,它不会识别select语句中的列。请参阅下面的查询...相关列的数据来自动态表或子选择或您称之为的任何内容。我不明白为什么这是.Net中的问题:
Dim sql As String = String.Format("select bu.row_id, bu.name, selectedOrgs.bu_id as selectedOrg " _
& " FROM SIEBEL.s_prod_int_bu pb " _
& " INNER JOIN SIEBEL.s_bu bu on pb.bu_id = bu.row_id " _
& " LEFT OUTER JOIN (select bu_id " _
& " FROM SIEBEL.s_lit_bu " _
& " WHERE lit_id = ?) selectedOrgs on selectedOrgs.bu_id = bu.row_id " _
& " WHERE pb.prod_int_id in ('{0}') " _
& " ORDER BY bu.name ", String.Join("','", ids.ToArray()))
'We also need to add a parameter
cmd.Parameters.AddWithValue("", resourceID)
我有一个OdbcCommand对象“cmd”和一个OdbcDataReader“dr”。我正如我一直在初始化ObcDataReader:dr = cmd.ExecuteReader()。但是在循环记录中(见下文),代码在从上面的SQL中检索“selectedOrg”列(索引超出范围异常)时爆炸:
dr = cmd.ExecuteReader
If dr.HasRows Then
While dr.Read
Dim bu As New OrgResource
'Dim bu As New Resource
bu.ID = IIf(IsDBNull(dr.Item("row_id")), "", dr.Item("row_id"))
bu.Name = IIf(IsDBNull(dr.Item("name")), "", dr.Item("name"))
bu.Selected = False
If Not String.IsNullOrEmpty(resourceID) Then
'BOOM: Code blows up on next line
bu.Selected = Not IsDBNull(dr.Item("selectedOrg"))
End If
lRet.Add(bu)
End While
End If
我不认为这会因为SQL在TOAD中正确返回而爆炸,而.Net应该将此列视为普通列,对吧?我尝试使用OdbcDataAdapter / DataSet组合交换OdbcDataReader,它在同一区域中爆炸。事实上,在Studio的Watch窗口中,如果我这样做:ds.Tables(0).Columns.Count,它表明我只有2列。 (在Jerry Seinfeld的声音中:与此有什么关系?)
堆栈跟踪信息的异常详细信息:
System.IndexOutOfRangeException InnerException:没什么 消息:selectedOrg 来源:System.Data StackTrace:at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) at System.Data.Odbc.OdbcDataReader.GetOrdinal(String value) at System.Data.Odbc.OdbcDataReader.get_Item(String value) 在MyNameSpace1.MyProject.MyClass.MyMethod(List`1 ids,String resourceID)in C:\ Documents and Settings \ my_username \ My Documents \ MyProject \ MyClass.vb:line 1088
感谢您的帮助!!
安迪
答案 0 :(得分:1)
编辑:添加堆栈跟踪后
@Andy,当然......该错误意味着您的selectedOrg列未被识别为有效列。没有什么能够成为您代码中的明显错误。但是这里有一些尝试。
更改此行...
bu.Selected = Not IsDBNull(dr.Item("selectedOrg"))
......对此...
bu.Selected = Not IsDBNull(dr("selectedOrg"))
过去这对我有用。
答案 1 :(得分:0)
尝试删除selectedOrgs.bu_id列的'as'指示符。我认为Oracle不会使用它,这可能会导致ODBC转换器窒息。
这
'selectedOrgs.bu_id as selectedOrg'
要
'selectedOrgs.bu_id selectedOrg'
答案 2 :(得分:0)
我最终删除了SQL语句的“LEFT OUTER JOIN(select ...)”部分,并且一个接一个地执行了2个语句。我猜这是System.Data.Odbc namespsace中的一个错误。不确定这是否发生在System.Data.SqlClient或System.Data.OracleClient。
中感谢您的回复。
安迪