日期:2014-05-18  浏览次数:20893 次

C# + Oracle问题
这个sql在sql*plus worksheet里执行是正确的,到C#程序里就不行了。各位帮忙看看什么问题
str="SELECT VGUID,VCRTTIME,VCRTUSER,VMDTIME,VMDUSER,VSTATUS FROM ( SELECT A.*,rownum r FROM ( SELECT VGUID,VCRTTIME,VCRTUSER,VMDTIME,VMDUSER,VSTATUS FROM "ZZ_1" ) A WHERE rownum <= 20 ) B WHERE r > 0";

OracleCommand selectCommand = new OracleCommand(str, conn);
selectCommand.CommandType = CommandType.Text;
mySqlDataAdapter.SelectCommand = selectCommand;
mySqlDataAdapter.Fill(dgList);


{System.InvalidOperationException: 语法错误: 应为标识符或带引号的标识符。
  在 System.Data.OracleClient.DbSqlParser.Parse2(String statementText)
  在 System.Data.OracleClient.DbSqlParser.Parse(String statementText)
  在 System.Data.OracleClient.OracleSqlParser.Parse(String statementText, OracleConnection connection)
  在 System.Data.OracleClient.OracleDataReader.FillSchemaTable(DataTable schemaTable)
  在 System.Data.OracleClient.OracleDataReader.GetSchemaTable()
  在 System.Data.ProviderBase.DataReaderContainer.GetSchemaTable()
  在 System.Data.ProviderBase.SchemaMapping..ctor(DataAdapter adapter, DataSet dataset, DataTable datatable, DataReaderContainer dataReader, Boolean keyInfo, SchemaType schemaType, String sourceTableName, Boolean gettingData, DataColumn parentChapterColumn, Object parentChapterValue)
  在 System.Data.Common.DataAdapter.FillMappingInternal(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
  在 System.Data.Common.DataAdapter.FillMapping(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 schemaCount, DataColumn parentChapterColumn, Object parentChapterValue)
  在 System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
  在 System.Data.Common.DataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
  在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
  在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
  在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
  在 LandaEntry.Server.Oracle9i_DBOperator.GetPageingData(String ptables, String pPK, String psort, Boolean pisAscending, Int32 ppageNumber, Int32 ppageSize, String pfields, String pfilter, String pgroup)}

------解决方案--------------------
SELECT B.VGUID,B.VCRTTIME,B.VCRTUSER,B.VMDTIME,B.VMDUSER,B.VSTATUS 
FROM ( SELECT A.VGUID,
A.VCRTTIME,
A.VCRTUSER,
A.VMDTIME,
A.VMDUSER,
A.VSTATUS,
rownum r 
FROM ( SELECT VGUID,VCRTTIME,VCRTUSER,VMDTIME,VMDUSER,VSTATUS 
FROM SCHEMA.ZZ_1 
) A 
WHERE rownum <= 20 
) B 
WHERE B.r > 0

最好把schema加上,还有一个就是表名A,B,等等,去掉*再试一试.