我做了一个用来显示数据的页面,用的是SqlClient连接SQL,主要是用多重循环显示一个excel表格,运行很正常,可是这个页面是需要连接oracle的,我这里没有这个环境,就先用SQL写代码,准备到时候改一下连接(oracle用OleDb连接,和连接Access一样),我从来没有连接过oracle,然后代码写完了,准备该成OleDb连接Access试一下,到时候给别人的话直接改oracle的连接字符串就可以了。没想到这里出了问题,改成OleDb连接Access报错,调试了很多方法,代码如下public class oledb
{
private System.Data.OleDb.OleDbConnection conn;
public oledb(string ConnectionString)
{
conn=new System.Data.OleDb.OleDbConnection(ConnectionString);
}
public void ExecuteQuery(string SelectString,ref DataSet ds,string TableName)
{
System.Data.OleDb.OleDbDataAdapter da=new System.Data.OleDb.OleDbDataAdapter(SelectString,conn);
da.Fill(ds,TableName);
}
}
这段代码是可以用的,可以返回ds,但我的一段代码用的双循环提取ds,这里就出错了:
标准表达式中数据类型不匹配。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 标准表达式中数据类型不匹配。源错误: 
行 261: {
行 262: System.Data.OleDb.OleDbDataAdapter da=new System.Data.OleDb.OleDbDataAdapter(SelectString,conn);
行 263: da.Fill(ds,TableName);
行 264: }
行 265: }我用单循环读区可以出来,可是套循环后就报这个错,是不是因为access是单连接的数据库的原因?大家知不知道这个错是什么原因造成的?如果不明白回帖问,我在线等

解决方案 »

  1.   

    读取数据代码如下:
    private void Page_Load(object sender, System.EventArgs e)
    {
    sql1=new oledb(ConnectionString.connectionstring);
     string selectSF="select * from SF_DICT";
    DataSet ds=new DataSet();
    sql1.ExecuteQuery(selectSF,ref ds,"SF");
    for(int a=0;a<ds.Tables["SF"].Rows.Count;a++)
    {
    TableRow trSF=new TableRow();
    TableCell tcSF=new TableCell();
    tcSF.Text=ds.Tables[0].Rows[a]["SFMZ"].ToString();
    trSF.Cells.Add(tcSF);
    Table1.Rows.Add(trSF);
    }

    }
    这是可以运行的,可是在中间加一个循环就报上面的错了
      

  2.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    sql1=new oledb1(ConnectionString.connectionstring);
     string selectSF="select * from SF_DICT";                     DataSet ds=new DataSet();
    sql1.ExecuteQuery(selectSF,ref ds,"SF");
    for(int a=0;a<ds.Tables["SF"].Rows.Count;a++)
    {
    TableRow trSF=new TableRow();          //创建行
    TableCell tcSF=new TableCell();
    tcSF.Text=ds.Tables[0].Rows[a]["SFMZ"].ToString();   ///读取记录
    trSF.Cells.Add(tcSF);

    sql1.ExecuteQuery("select * from DS_DICT where SID='" + ds.Tables[0].Rows[a]["OBJECTID"].ToString() + "'",ref ds,"DS"); //内循环,根据上个循环内得到的数据进行子循环
    if(ds.Tables["DS"].Rows.Count>0)
    {
    for(int b=0;b<ds.Tables["DS"].Rows.Count;b++)
    {
    TableRow trDS=new TableRow();            //创建子循环的行
    TableCell tcDS=new TableCell();
    tcDS.Text="<b>"+ds.Tables[1].Rows[b]["DSMZ"].ToString()+"<b>";
    trDS.Cells.Add(tcDS);
    Table1.Rows.Add(trDS);
    }
    }
    ds.Tables[1].Clear();
    Table1.Rows.Add(trSF);
    }

    }这段就无法执行了,问,为什么?why?
      

  3.   

    我的代码没有问题,是不是access的原因呢?
      

  4.   

    是吗?SQL就不用关闭是吗?access需要关闭吧?可是我的conn没有打开啊,如果只是用dataset读取的话是不用conn.open()的,除非是插入修改和或删除。我需要关闭什么呢?
      

  5.   

    nmlvjun(网事如风)你说的是什么意思,详细一点点嘛
      

  6.   

    sql1.ExecuteQuery("select * from DS_DICT where SID='" + ds.Tables[0].Rows[a]["OBJECTID"].ToString() + "'",ref ds,"DS");
    表DS_DICT的SID的数据类型是什么?如果是INT的话,那么你加两个单引号出错! 
    sql1.ExecuteQuery("select * from DS_DICT where SID=" + ds.Tables[0].Rows[a]["OBJECTID"].ToString(),ref ds,"DS");
      

  7.   

    是吗?SQL就不用关闭是吗?access需要关闭吧?可是我的conn没有打开啊,如果只是用dataset读取的话是不用conn.open()的,除非是插入修改和或删除。我需要关闭什么呢?
    -------------------------------------------------------------------------------------
    一.不管是对何种数据库,在操作时全部放进Try{..}Catch{..}finally{}
    1. 出错时可直接补捉到
    2. 不会在需要关闭连接时,因为没有关闭而造成连接过多
    二.建议在提取数据时,一次性提取出来
     以你上面的代码完全可以一次性将SF_DICT和DS_DICT两张表的数据提取出来,
      

  8.   

    ccwq([Kiss Eash Not Teach]) 是正解,我快不行了,麻烦叫救护车。问题出在数据类型,在SQL里面
    SID是自动增长的int型,但在写sql语句时可以加单引号,结果到access成了自动编号,就不能加单引号了。好了,结帐