先前一直使用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);则完全正常,顺利执行,请问这两个有什么区别?问题出在什么地方?
{
///创建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);则完全正常,顺利执行,请问这两个有什么区别?问题出在什么地方?
CreateOleDbCommand是针对access的
cmd.Parameters.Add(new OleDbParameter(RETURNVALUE, OleDbDbType.Int,4,ParameterDirection.ReturnValue,false,0,0,string.Empty, DataRowVersion.Default,null));
{
///创建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);则完全正常,顺利执行,问题出在什么地方?
oledbconectionhttp://topic.csdn.net/u/20090619/12/227c2ccc-ac6a-4598-9c24-c80d2702831a.html
{
///打开数据库连接
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时,有这句反而出错,如果把它去掉,就正常,为什么?