Sql ADO.Net无法识别Select语句中的列
我有一个查询在TOAD中执行得很好,但是当使用ADO.Net DataReader或DataAdapter/DataSet返回结果时,它无法识别select语句中的列。请参阅下面的查询。。。所讨论的列的数据来自动态表、子选择或您所称的任何内容。我不明白为什么这在.Net中是个问题:Sql ADO.Net无法识别Select语句中的列,sql,vb.net,ado.net,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 " _
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”列时,代码崩溃(索引超出范围异常):
我不认为这应该爆炸,因为SQL在TOAD中正确返回,并且.Net应该将此列视为普通列,对吗?我尝试用OdbcDataAdapter/DataSet组合替换OdbcDataReader,结果它在同一区域爆炸。事实上,在Studio的“监视”窗口中,如果我执行以下操作:ds.Tables(0).Columns.Count,则显示我只有2列。(杰瑞·宋飞配音:这是怎么回事?)
包含堆栈跟踪信息的异常详细信息:
System.IndexOutOfRangeException
例外:没有
信息:selectedOrg
资料来源:System.Data
StackTrace:at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(字符串fieldName)
位于System.Data.Odbc.OdbcDataReader.GetOrdinal(字符串值)
位于System.Data.Odbc.OdbcDataReader.get_项(字符串值)
在中的MyNameSpace1.MyProject.MyClass.MyMethod(列出`1个ID,字符串resourceID)
C:\Documents and Settings\my\u username\my Documents\MyProject\MyClass.vb:第1088行
谢谢你的帮助
安迪编辑:添加堆栈跟踪后 @安迪,果然。。。该错误意味着您的selectedOrg列未被识别为有效列。代码中没有明显的错误。但这里有一些东西可以尝试 更改此行
bu.Selected = Not IsDBNull(dr.Item("selectedOrg"))
。。。对此
bu.Selected = Not IsDBNull(dr("selectedOrg"))
这在过去对我很有效。编辑:添加堆栈跟踪后 @安迪,果然。。。该错误意味着您的selectedOrg列未被识别为有效列。代码中没有明显的错误。但这里有一些东西可以尝试 更改此行
bu.Selected = Not IsDBNull(dr.Item("selectedOrg"))
。。。对此
bu.Selected = Not IsDBNull(dr("selectedOrg"))
这在过去对我很管用。尝试删除所选rgs.bu_id列的“as”指示符。我认为Oracle不使用它,这可能会导致ODBC转换器阻塞 从
'selectedOrgs.bu_id为selectedOrg' 到
“selectedOrgs.bu_id selectedOrg”尝试删除selectedOrgs.bu_id列的“as”指示符。我认为Oracle不使用它,这可能会导致ODBC转换器阻塞 从
'selectedOrgs.bu_id为selectedOrg' 到
“selectedOrgs.bu_id selectedOrg”我最终删除了SQL语句的“左外连接(select…)部分,并一个接一个地执行了两条语句。我猜这是System.Data.Odbc名称空间中的一个错误。不确定这是发生在System.Data.SqlClient还是System.Data.OracleClient中 谢谢你的回复 Andy我最终删除了SQL语句的“左外连接(select…)”部分,然后一个接一个地执行了两条语句。我猜这是System.Data.Odbc名称空间中的一个错误。不确定这是发生在System.Data.SqlClient还是System.Data.OracleClient中 谢谢你的回复
安迪谢谢你的回复-问题不在IsDbNull()上。。。在Watch窗口中,如果我尝试查看dr.Item(“selectedOrg”),它会给我一条类似这样的消息:索引超出范围异常。我很快就会收到完整的异常消息。感谢您的回复-问题不在IsDbNull()上。。。在Watch窗口中,如果我尝试查看dr.Item(“selectedOrg”),它会给我一条类似这样的消息:索引超出范围异常。我很快就会收到完整的异常消息。感谢您的回复,但不是这样-我们在其他地方成功地使用了“as”作为字段别名。好的,然后看看变量“sql”的字符串。拉取“sub-select”语句,运行它以验证它是否返回了某些内容。感谢您的回复,但不是这样-我们在其他地方成功地使用了“as”作为字段别名。好的,然后查看变量“sql”的字符串。拉取“sub-select”语句,并运行它以验证它是否返回了某些内容。