紧急求助!!!!!!
因对方单位的数据库测试环境是oracle9,生产时oracle7......哎,所以现在出现比较烦躁的事情。使用C#编写的程序,本地安装的是windows的oracle9客户端,访问远程oracle7数据库出现问题,
一个简单的sql语句,在执行时出错,错误提示为ora-1002,越序存取。同样的程序,我本地安装windows的oracle9客户端,访问远程oracle9客户端,能够正常运行。因明天就投产,恳请各位大虾指点!源代码如下,其中出错位置我标注出来了。
using System;
using System.Data;
using System.Data.OracleClient;
using System.IO;
using System.Text;namespace HdlOraData
{
/// <summary>
/// GetDataFromOra 的摘要说明。
/// HdlCmd()的Return Code
/// 1 成功
/// -10 参数处理错误
/// -20 记录数量错误
/// -30 读取数据库数据异常
///
/// </summary>
public class GetDataFromOra
{
private string strInfo;
private string strConn;
private string strSql;
private string strKHH;
private string yje;
private string strOut="";
private string strBlank = "                         ";
private CLogWrap m_InnerLog;//log类
private int intRcdCnt=0, realCnt, intCnt;//记录数
private string strTrans, strContent;
private string[] strParams, strUpdate,strDbData;
private StreamReader myReader;

private OracleConnection myOraConn;
private OracleTransaction myOraTrans;
OracleCommand myOraCMD;
OracleDataReader myOraDR;
private OracleParameter[] opInsert;
//表结构字段类型定义
private int[] cfgJF_LEN = {10,10,2,8,5,2,10,6,10,5,5,5,5,9,9,9,2,12,3,40,10,20,50,5,8,5,8,10,100,1,1};
private string[] cfgJF = {"C","C","C","C","C","C","C","C","D","S","S","S","S","S","S","S","C","C","C","C","C","C","C","C","C","C","C","D","C","C","C"};
private string[] cfgDZ= {"C","D","S","S","S","C","C"};
private string[] cfgJYE = {"S"};

/************************************************************************/
/* 参数:conn 数据库连接字符串;strTmp 交易请求数据            */
/************************************************************************/
public GetDataFromOra(string conn, string strTmp)
{
//
// TODO: 在此处添加构造函数逻辑
//
strConn = conn;
strInfo = strTmp;
}

/************************************************************************/
/* 连接数据库                                                           */
/************************************************************************/
public bool ConnOra()
{
myOraConn = new OracleConnection(strConn);
try
{
myOraConn.Open();

}
catch (System.Exception eConn)
{
LogFile("Error:" + eConn.ToString());
return false;
}
myOraTrans = myOraConn.BeginTransaction();
return true;
}
/************************************************************************/
/* 断开数据库                                                           */
/************************************************************************/
public bool DisConn()
{
try
{
if (myOraConn.State != ConnectionState.Closed)
{
myOraConn.Close();
myOraTrans.Dispose();
}
}
catch (System.Exception e)
{
LogFile("Close Connection Error!error info="+e.ToString());
return false;
}
return true;
} /************************************************************************/
/* 入口函数,根据交易代码处理交易                                       */
/************************************************************************/
public int HdlCmd()
{
string strTbl;

m_InnerLog = new CLogWrap(); //取得需处理包体数据在strParams[3]
int iRet = SetParams(strInfo,"#");
if (iRet < 0)
{
LogFile("get info from data error, split # error!");
return iRet; 
}

strTrans = strParams[0];
intCnt = Convert.ToInt32(strParams[1]);

if (strTrans == "8002")
{
if (GetInfoFromFile(strParams[3],ref strContent) != 1)
return -1;
}
else
{
strContent = strParams[3];
}
iRet = SetParams(strContent,"@");
if (iRet < 0)
{
LogFile("@拆解报文出错");
return iRet; 
}
LogFile("transaction="+strTrans);
//根据交易类型处理strContent
if (strTrans == "6001")
{
strTbl = "yw_jbxx";
strSql = "select yhh,yhm from " + strTbl + " where yhh = :khh";
strContent = strParams[1];

iRet = SetParams(strContent,"|");
if (iRet < 0)
{
LogFile(strTrans +":SQL参数处理错误!");
return iRet; 
}

strKHH = strParams[0];
try
{
myOraCMD = new OracleCommand(strSql,myOraConn,myOraTrans);
OracleParameter opJBXXkhh = new OracleParameter("khh",OracleType.VarChar,10);
myOraCMD.Parameters.Add(opJBXXkhh);
opJBXXkhh.Value = strKHH;
}
catch (System.Exception e)
{
LogFile("create oracleCommand object error!"+e.Message);
return -100;
}

iRet = HdlSelect();
if (iRet < 0)
{
LogFile("Get data from" + strTbl + "error!");
return iRet;
}

iRet = SetOutStr();
if (iRet < 0)
{
LogFile("Set Out String Error:"+ iRet.ToString());
return iRet;
}
strOut = strTrans+"#"+intRcdCnt.ToString("D4")+"#0.00#" + strOut;
LogFile("Get data from database ok ,buff=[" + strOut +"]");
//return 1;
}
//strOut = strTrans + "#" + intRcdCnt.ToString("D4") + "#0.00#";
m_InnerLog.Close();
return 1;
}

/************************************************************************/
/* 取数据库数据,将得到的记录数据按分隔符组成字符串                     */
/************************************************************************/
private int HdlSelect()
{
LogFile("begin select operation...");
try
{
myOraDR = myOraCMD.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (System.Exception eReader)
{
LogFile("executereader occurs error:"+eReader.ToString());
return -1;
}
intRcdCnt = 0;
LogFile("reader excute ok!");
if ( myOraDR == null)
{
LogFile("reader is null");
return -2;
}
strDbData = new string[5];//存放记录
int i = 1;
//while(myOraDR.Read())
//{
try
{
myOraDR.Read();//=========出错位置========
}
catch (System.Exception e)
{
LogFile("read record error!"+e.Message);//出错后log
return -200;
}
LogFile("begin deal line " + i.ToString() + "; filecount=" + myOraDR.FieldCount.ToString());
strDbData[intRcdCnt] = "@";
for (int iColumn=0;iColumn<myOraDR.FieldCount;iColumn++)
{
if (myOraDR.IsDBNull(iColumn))//是否为null
{
strDbData[intRcdCnt] += "|";
continue;
}
strDbData[intRcdCnt] += myOraDR.GetValue(iColumn).ToString() +"|";
}
intRcdCnt ++;
if (intRcdCnt > 3)
{
LogFile("too many rows!");
//break;
myOraDR.Close();//关闭OracleDataReader
myOraCMD.Dispose();
return intRcdCnt;
}
i++;
//}
LogFile("select operation end!");
myOraDR.Close();//关闭OracleDataReader
myOraCMD.Dispose();

return intRcdCnt;
} private int SetParams(string strTmp, string strkey)
{
strParams = null;
if (strkey.Equals("#"))
{
strParams = strTmp.Split(new char[]{'#'});
if (strParams.Length != 4)
{
LogFile("Params count error:" + strTmp);
return -10;
}
try
{
intRcdCnt = Convert.ToInt32(strParams[1]);
if (intRcdCnt <=0)
{
LogFile("记录笔数错误!");
strOut = strTmp;
return -20;
}
}
catch (System.Exception e)
{
LogFile("传入包头记录数转换错误!数据=["+ strParams[1]+"]\r\n" + strBlank + e.ToString());
return -100;
}
}
else if (strkey.Equals("@"))
{
//处理包体有效数据部分
strParams = strTmp.Split(new char[]{'@'});
realCnt = strParams.Length-1;
if (intCnt != realCnt)
{
LogFile("记录总数有误!协定记录总数:" + intRcdCnt.ToString() + ";实际记录数:" + realCnt.ToString());
return -20;
}
}
else if (strkey.Equals("|"))
{
strParams = strTmp.Split(new char[]{'|'});
}
else
{
LogFile("No Split Key[" + strkey + "] Exists!");
return -40;
}

return 1;
}

private int SetOutStr()
{
for (int i=0;i< intRcdCnt;i++)
{
strOut += strDbData[i];
}
return 1;
}

private int LogFile(string strLogMsg)
{
int intRet = 1;
m_InnerLog = new CLogWrap();
//bool bRet = m_InnerLog.Init(Path.Combine(Environment.CurrentDirectory/*System.Windows.Forms.Application.StartupPath*/, "Log"),"DB");
bool bRet = m_InnerLog.Init(Path.Combine(Environment.CurrentDirectory/*System.Windows.Forms.Application.StartupPath*/, "Log"),"OraHdl");
bRet = m_InnerLog.WriteLine(strLogMsg);
if (!bRet)
intRet = -1;
m_InnerLog.Close();
return intRet;
}
public string GetOutStr()
{
if (strOut.Length == 0 || strOut == null)
{
strOut = strTrans+"#" + "0000#0.00#@" + strKHH +"|";
}
return strOut;
}
}
}

解决方案 »

  1.   

    不了解C#检查一下参数匹配的情况, 而且在java里,param塞值和resultset取值的序号都是从1开始的。
      

  2.   

    单步调试,把SQL语句方到ORACLE7里测试下是否能通过,然后再写程序,可能是ORA7和ORA9有函数之类的区别吧
      

  3.   

    myOraDR.Read();//=========出错位置========
    错误提示为ora-1002,越序存取
    1)你的查询真有返回数据吗?
    2)Oracle7 支不支持.ExecuteReader(CommandBehavior.CloseConnection)?
    换手动关闭的试一试.用来保持持久的连接.
    3)select 语句有for update吗?