本帖最后由 ptwhite 于 2010-01-25 11:45:16 编辑

解决方案 »

  1.   

    这年头用dbf的人太少了,你改用其他数据库吧,dbf老是存在索引文件出错的问题,麻烦啊
      

  2.   

    年=2008;   
    如果是int类型不要带单引号
      

  3.   

    呵呵,谢谢,年是char(5)类型的,不是int,另外在ACCESS 中可以执行select * from Tdata where 年='2008',但是我就不知道为什么查询出来的结果在Winform中就不能显示出来,显示空
      

  4.   

    可以交流一下么?[email protected]
      

  5.   

    我在WINFORM环境下试过,没问题// 1.确认安装了Microsoft Visual FoxPro Driver
    //   控制面板 --> 管理工具 --> 数据源(ODBC) --> 驱动程序 --> Microsoft Visual FoxPro Driver
    // 2.确认dbf数据库中有数据,并且数据路径正确无误
    // 3.用Winform下,用DataGridView试试
    private void button1_Click(object sender, EventArgs e)
    {
        System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection();
        string table = @"C:\TDATA.dbf";
        string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + table + ";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO";
        conn.ConnectionString = connStr;
        conn.Open();
        string sql = "select * from " + table;
        OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
        DataTable dt = new DataTable();
        da.Fill(dt);
        dataGridView1.DataSource = dt;
        conn.Close();
    }
      

  6.   

    因为你的类型是char(5)是定长类型一共有5个字符,不满5个用空格填充,而2008只有4个字符,你用2008加空格就可以了。或则用varchar(5)不定长的类型,把所有的空格删掉 
      

  7.   

    7楼讲得有道理。数据库建议用VarChar类型代替Char.
    可以用like测试一下,不知Foxpro的查询是否支持like。
    string sql = "select * from " + table + " where 年 LIKE '2008%'";
      

  8.   


    这个可以排除 字符型的字段宽度默认是10,我用的默认值,运行正常.
    楼主用的是ODBC驱动程序--Microsoft Visual FoxPro Driver。VFP数据库中 "1980   "="1980" 这个等式成立。 另外 VFP数据库 只有Char 没有VarChar。
      

  9.   

    不懂呢
    用 dbf好像现在的太少了吧
    还有用 C#跟 dbf 来搭配,感觉就不爽
    还不如就用 VFP 来写呢,还好些
    呵呵
      

  10.   

    老哥,这样就可以了,是不是Foxpro不支持“年='2008'”啊
      

  11.   

    本帖最后由 ptwhite 于 2010-01-25 11:45:40 编辑
      

  12.   

    没接触过这种数据库,不过LZ的代码很OK,没问题
      

  13.   


    下面实测结果:只包含2008年的private void button1_Click(object sender, EventArgs e)
    {
        System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection();
        string table = @"C:\TDATA.dbf";
        string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + table + ";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO";
        conn.ConnectionString = connStr;
        conn.Open();
        //string sql = "select * from " + table;                        //全部的
        string sql = "select * from " + table + " where 年='2008'";     // 只包含2008年的
        OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
        DataTable dt = new DataTable();
        da.Fill(dt);
        dataGridView1.DataSource = dt;
        conn.Close();
    }
      

  14.   

    VFP数据库  == 和 = 都可以作比较运算 前者是绝对相等,
    后者是前半部分包含,相当于sql中的 like "---%" 。
      

  15.   

    我的驱动文件是vfpodbc.dll版本6.1.8630.1
      

  16.   

    比我用的还新,我用的是6.01.8629.01 应该是VFP6.0 sp1自带的。换个驱动试试,网上下载一个,先排除驱动程序和数据库版本的问题
      

  17.   

    试试这个       
     private void button1_Click(object sender, EventArgs e)
            {
                OpenFileDialog ofdDBF = new OpenFileDialog();     // 新建打开文件对话框
                ofdDBF.Filter = "属性表文件(*.dbf)|*.dbf";       //打开对话框可选用的文件类型
                if (ofdDBF.ShowDialog() == DialogResult.OK)    //如果单击对话框的“打开”俺就
                {
                    string OpenFileName = ofdDBF.FileName.Trim();
                    string dbfFilePath = System.IO.Path.GetDirectoryName(OpenFileName);
                    string dbfFileName = System.IO.Path.GetFileName(OpenFileName);                IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();                IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(dbfFilePath, 0);                IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
                   
                    if (pFeatureWorkspace != null)
                    {
                        IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(dbfFileName);
                        if (pFeatureClass != null)
                        {
                            DataTable dt = new DataTable();
                            DataColumn dc = null;                        for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
                            {
                                dc = new DataColumn(pFeatureClass.Fields.get_Field(i).Name);
                                dt.Columns.Add(dc);
                            }                        IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
                            IFeature pFeature = pFeatureCursor.NextFeature();
                            DataRow dr = null;
                            while (pFeature != null)
                            {
                                dr = dt.NewRow();
                                for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
                                {
                                    if (pFeatureClass.FindField(pFeatureClass.ShapeFieldName) == j)
                                    {
                                        dr[j] = pFeatureClass.ShapeType.ToString();
                                    }
                                    else
                                    {
                                        dr[j] = pFeature.get_Value(j).ToString();
                                    }
                                }
                                dt.Rows.Add(dr);
                                pFeature = pFeatureCursor.NextFeature();
                            }
                            dataGridView1.DataSource = dt;
                        }
                    }
                }        }
      

  18.   

    回复27 楼 yaobaihu 
    这位大侠,你是要我直接打开TDATA.DBF文件吧?我要查询啊
      

  19.   

    兄弟,你19#的代码可以直接查询?能显示出来所有2008年的数据吗?
    string sql = "select * from " + table + " where 年='2008'";     // 只包含2008年的
      

  20.   

    其实问题已经解决了,看16#或者我和lzsh0622(永不言弃)的对话,问题是为什么会出现这种现象?