C#读取dbf文件 本帖最后由 ptwhite 于 2010-01-25 11:45:16 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这年头用dbf的人太少了,你改用其他数据库吧,dbf老是存在索引文件出错的问题,麻烦啊 年=2008; 如果是int类型不要带单引号 呵呵,谢谢,年是char(5)类型的,不是int,另外在ACCESS 中可以执行select * from Tdata where 年='2008',但是我就不知道为什么查询出来的结果在Winform中就不能显示出来,显示空 可以交流一下么?[email protected] 我在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();} 因为你的类型是char(5)是定长类型一共有5个字符,不满5个用空格填充,而2008只有4个字符,你用2008加空格就可以了。或则用varchar(5)不定长的类型,把所有的空格删掉 7楼讲得有道理。数据库建议用VarChar类型代替Char.可以用like测试一下,不知Foxpro的查询是否支持like。string sql = "select * from " + table + " where 年 LIKE '2008%'"; 这个可以排除 字符型的字段宽度默认是10,我用的默认值,运行正常.楼主用的是ODBC驱动程序--Microsoft Visual FoxPro Driver。VFP数据库中 "1980 "="1980" 这个等式成立。 另外 VFP数据库 只有Char 没有VarChar。 不懂呢用 dbf好像现在的太少了吧还有用 C#跟 dbf 来搭配,感觉就不爽还不如就用 VFP 来写呢,还好些呵呵 老哥,这样就可以了,是不是Foxpro不支持“年='2008'”啊 本帖最后由 ptwhite 于 2010-01-25 11:45:40 编辑 没接触过这种数据库,不过LZ的代码很OK,没问题 下面实测结果:只包含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();} VFP数据库 == 和 = 都可以作比较运算 前者是绝对相等,后者是前半部分包含,相当于sql中的 like "---%" 。 我的驱动文件是vfpodbc.dll版本6.1.8630.1 比我用的还新,我用的是6.01.8629.01 应该是VFP6.0 sp1自带的。换个驱动试试,网上下载一个,先排除驱动程序和数据库版本的问题 试试这个 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; } } } } 回复27 楼 yaobaihu 这位大侠,你是要我直接打开TDATA.DBF文件吧?我要查询啊 兄弟,你19#的代码可以直接查询?能显示出来所有2008年的数据吗?string sql = "select * from " + table + " where 年='2008'"; // 只包含2008年的 其实问题已经解决了,看16#或者我和lzsh0622(永不言弃)的对话,问题是为什么会出现这种现象? 进制转换 想请教下类似腾讯QQ的聊天窗体发送抖动怎么实现? 方法参数ref,out的问题! DataGrid中显示xml中数据 有这样一个数列:分子成等差数列,分母成等比数列,求这个数列的和S 高分求教直播流的问题 开启多个线程调用异步socket进行通信出错 wpf水墨画板问题 请教:枚举值可不可以为字符值呢?例如:GB2312 = "GB2312" 谢谢!!! 谁知道哪里有<C# primer>下载,[email protected] 新生,帮翻译一句代码 大侠们快来帮忙啊~来的通通给分
如果是int类型不要带单引号
// 控制面板 --> 管理工具 --> 数据源(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();
}
可以用like测试一下,不知Foxpro的查询是否支持like。
string sql = "select * from " + table + " where 年 LIKE '2008%'";
这个可以排除 字符型的字段宽度默认是10,我用的默认值,运行正常.
楼主用的是ODBC驱动程序--Microsoft Visual FoxPro Driver。VFP数据库中 "1980 "="1980" 这个等式成立。 另外 VFP数据库 只有Char 没有VarChar。
用 dbf好像现在的太少了吧
还有用 C#跟 dbf 来搭配,感觉就不爽
还不如就用 VFP 来写呢,还好些
呵呵
下面实测结果:只包含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();
}
后者是前半部分包含,相当于sql中的 like "---%" 。
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;
}
}
} }
这位大侠,你是要我直接打开TDATA.DBF文件吧?我要查询啊
string sql = "select * from " + table + " where 年='2008'"; // 只包含2008年的