先前一直使用sql server 2005数据库,借用了别人所写的一个SQLHelper.cs数据库操作类,完成数据库的各种操作,一直使用正常。前天,需要连接access数据库,故将原先的SQLHelper.cs数据库稍作改动,执行时一直报错。后来,花了很久解决了问题,但还是不太了解其中的原因,所以特来请教。原来使用正常的SQLHelper.cs的主要代码如下:public void RunSQL(string cmdText, out SqlDataReader dataReader) 
{
    ///创建Command
    SqlCommand cmd = CreateSQLCommand(cmdText, null);

    try
    {
      ///读取数据
      dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch(Exception ex)
    {
      dataReader = null;
      ///记录错误日志
      //SystemError.CreateErrorLog(ex.Message);
    }
}private SqlCommand CreateSQLCommand(string cmdText, SqlParameter[] prams) 
{
    ///打开数据库连接
    Open();

    ///设置Command
    SqlCommand cmd = new SqlCommand(cmdText,myConnection);     ///添加把存储过程的参数
    if (prams != null) 
    {
      foreach (SqlParameter parameter in prams)
       {
         cmd.Parameters.Add(parameter);
       }
     }

    ///添加返回参数ReturnValue
    cmd.Parameters.Add(new SqlParameter(RETURNVALUE, SqlDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));    ///返回创建的SqlCommand对象
    return cmd;
}后来,为了连接Access数据,把上面的代码稍作改动(就是将sql改成了OleDb),变成如下:
public void RunOleDb(string cmdText, out OleDbDataReader dataReader) 
{
    ///创建Command
    OleDbCommand cmd = CreateOleDbCommand(cmdText, null);

    try
    {
      ///读取数据
      dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch(Exception ex)
    {
      dataReader = null;
      ///记录错误日志
      //SystemError.CreateErrorLog(ex.Message);
    }
}private OleDbCommand CreateOleDbCommand(string cmdText, OleDbParameter[] prams) 
{
    ///打开数据库连接
    Open();

    ///设置Command
    OleDbCommand cmd = new OleDbCommand(cmdText,myConnection);     ///添加把存储过程的参数
    if (prams != null) 
    {
      foreach (OleDbParameter parameter in prams)
       {
         cmd.Parameters.Add(parameter);
       }
     }

    ///添加返回参数ReturnValue
    cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));    ///返回创建的OleDbCommand对象
    return cmd;
}但每次执行到 :
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)时都报错:
“+   $exception {"System.Data.OleDb.OleDbDataAdapter 内部错误: 无效的参数访问器: 1 BADBINDINFO。"} System.Exception {System.InvalidOperationException}”研究了好几天,最后偶然发现若把:CreateOleDbCommand函数中的最后一句: cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));
改成:cmd.Parameters.Add(RETURNVALUE, OleDbType.Integer, 4);则完全正常,顺利执行,请问这两个有什么区别?问题出在什么地方?

解决方案 »

  1.   

    CreateSQLCommand是针对sqlserver的
    CreateOleDbCommand是针对access的
      

  2.   


    cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));
      

  3.   

    就是将一直使用正常的 SQLHelper.cs 稍作改动,改成了OleDbHelper.cs,用来连接Access(将sql改成了OleDb),变成如下:public void RunOleDb(string cmdText, out OleDbDataReader dataReader) 
    {
      ///创建Command
      OleDbCommand cmd = CreateOleDbCommand(cmdText, null);  try
      {
      ///读取数据
      dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
      }
      catch(Exception ex)
      {
      dataReader = null;
      ///记录错误日志
      //SystemError.CreateErrorLog(ex.Message);
      }
    }private OleDbCommand CreateOleDbCommand(string cmdText, OleDbParameter[] prams)  
    {
      ///打开数据库连接
      Open();  ///设置Command
      OleDbCommand cmd = new OleDbCommand(cmdText,myConnection);   ///添加把存储过程的参数
      if (prams != null)  
      {
      foreach (OleDbParameter parameter in prams)
      {
      cmd.Parameters.Add(parameter);
      }
      }  ///添加返回参数ReturnValue
      cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));  ///返回创建的OleDbCommand对象
      return cmd;
    }但每次执行到 :
    dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)时都报错:
    “+ $exception {"System.Data.OleDb.OleDbDataAdapter 内部错误: 无效的参数访问器: 1 BADBINDINFO。"} System.Exception {System.InvalidOperationException}”研究了好几天,最后偶然发现若把:CreateOleDbCommand函数中的最后一句: cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));
    改成:cmd.Parameters.Add(RETURNVALUE, OleDbType.Integer, 4);则完全正常,顺利执行,问题出在什么地方?
      

  4.   

    access数据库操作类
    oledbconectionhttp://topic.csdn.net/u/20090619/12/227c2ccc-ac6a-4598-9c24-c80d2702831a.html
      

  5.   

    private OleDbCommand CreateOleDbCommand(string cmdText, OleDbParameter[] prams) 
    {
      ///打开数据库连接
      Open();  ///设置Command
      OleDbCommand cmd = new OleDbCommand(cmdText,myConnection);    ///添加把存储过程的参数
      if (prams != null)   
      {
      foreach (OleDbParameter parameter in prams)
      {
      cmd.Parameters.Add(parameter);
      }
      }  ///添加返回参数ReturnValue
      cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));  ///返回创建的OleDbCommand对象
      return cmd;
    }上面这个函数中,cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));是什么意思,我看不懂。另外,我个人决得这句好像不是必须的,连接Access时,有这句反而出错,如果把它去掉,就正常,为什么?