ADO.Net无法识别Select语句中的列

时间:2009-10-07 15:36:34

标签: sql vb.net ado.net

我有一个在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

感谢您的帮助!!

安迪

3 个答案:

答案 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。

感谢您的回复。

安迪