2010-07-08 93 views
1

可以使用什麼數據提供程序來從C#更新.dbf文件?從C#處理.dbf的最佳方式

我嘗試了幾個不同的.dbf提供程序來創建一個DataSource,但我收到這樣的消息: 「錯誤消息:錯誤HYC00 Microsoft ODBC dBase驅動程序可選功能未實現。

或者當我使用更新函數生成數據集和數據適配器時,我得到:「當使用修改的行傳遞DataRow集合時,Update需要有效的UpdateCommand。」

如果有人知道一些方法來處理來自C#的.dbf大量更新請幫助。當我嘗試逐行更新行時,速度太慢,因爲提供程序在搜索大型.dbf文件時會損失太多時間。也許有辦法自動建立一個索引,並且數據源知道使用它?

另一種方法是將所有內容加載到類似數據集的內容中,並在完成所有更改後進行更新,但更新部分目前無法使用。

請幫忙!

回答

0

如果你堅持非常基本的SQL操作,那麼vanilla OleDbConnection可以很好地處理DBF。

在這裏,我工作,我們建立&維護應用程序,使用專門OleDb類與DBF交互。但是,我們不使用適配器或數據源 - 所有事情都是通過OleDbCommands,OleDbDataReaders等「直接」完成的。

也許DataAdapters依賴於與基本或傳統數據源(如xBase)交互時可能不存在的功能。你有沒有嘗試過使用OleDbCommand的UPDATE

+0

是的,但更新太慢。我有〜1GB的基地,我必須清除每行中包含它的一些字符。如果我一行一行地做,它會花費太多,因爲數據庫沒有索引。我必須做一些醜陋的事情,比如將所有內容全部移到內存中,刪除所有記錄並用更改的記錄進行替換。我嘗試更新替換命令,但似乎微軟JET不支持它。也許有些其他供應商呢?現在我成功更新從Access中取代,但我不確定訪問使用什麼? – watbywbarif 2010-07-08 21:54:41

0

通常,FoxPro驅動程序與.DBF文件一起使用。文件格式非常相似,這對於閱讀很有效。寫作有點棘手。不幸的是,由於DBASE是一種如此古老的技術,因此.NET不能很好地處理它,所以你幾乎堅持使用緩慢的選項。相信,我,我感到你的痛苦,因爲我必須經常爲這些POS系統配合我們的工作。

http://www.aspcode.net/Reading-DBF-files-in-C.aspx

.NET Connection to dBase .dbf file

How to read/write dBase III files using C#/.NET ODBC or OLE?

最後,我最喜歡的源連接字符串:

http://www.carlprothman.net/Default.aspx?tabid=81

+0

我通過以下鏈接在您推薦的網頁上找到了此鏈接: http://www.c-sharpcorner.com/uploadfile/rfederico/xbaseenginerfv12022005011623am/xbaseenginerfv.aspx 它看起來很有前途,生病讓它在前些天嘗試。 – watbywbarif 2010-07-08 22:08:39

1

從你一下〜1GB數據庫COMENT,我也有工作VFP數據庫(.dbf)文件格式和SQL-Updates w ork沒有問題通過OleDbCommand創建/執行,並且可以使用VFP OleDbProvider運行的任何本機命令。爲了試圖刪除一些字符,我通常使用函數CHRTRAN()(也就是說,如果你使用Visual Foxpro Ole DB提供程序),在那裏你可以從字面上去掉很多字符(比如無效)。 ..

Update YourTable 
    set SomeField = chrtran(SomeField, "[email protected]#$%^*(", "") 

將通過所有的記錄,並從外地(第一個參數)中去掉任何,個性(2ST參數)的任何實例,並改變它的第三個參數找到相應的字符...在這種情況下,沒有值,只是一個空字符串,所以字符將被刪除。本身速度非常快,您不必繼續掃描所有正在下載,測試,然後推回的記錄。

再說一次,並非肯定您正在使用的本機.DBF文件系統,但VFP對於此類操作非常快速。

1

您可以使用LINQ to VFP來讀取和寫入DBF文件。我用它來編輯一些dBase III文件,像魅力一樣。

定義你的表格到DBF定義這樣的匹配:

public partial class MyTable 
{ 
    public System.Int32 ID { get; set; } 
    public System.Decimal Field1 { get; set; } 
    public System.String Field2 { get; set; } 
    public System.String Field3 { get; set; } 
} 

您定義的背景是這樣的:

public partial class Context : DbEntityContextBase 
{ 
    public Context(string connectionString) 
     : this(connectionString, typeof(ContextAttributes).FullName) 
    { 
    } 

    public Context(string connectionString, string mappingId) 
     : this(VfpQueryProvider.Create(connectionString, mappingId)) 
    { 
    } 

    public Context(VfpQueryProvider provider) 
     : base(provider) 
    { 
    } 

    public virtual IEntityTable<MyTable> MyTables 
    { 
     get { return this.GetTable<MyTable>(); } 
    } 
} 

您定義上下文屬性是這樣的:

public partial class ContextAttributes : Context 
{ 
    public ContextAttributes(string connectionString) 
     : base(connectionString) { 
    } 

    [Table(Name="mytable")] 
    [Column(Member="ID", IsPrimaryKey=true)] 
    [Column(Member="Field1")] 
    [Column(Member="Field2")] 
    [Column(Member="Field3")] 
    public override IEntityTable<MyTable> MyTables 
    { 
     get { return base.MyTables; } 
    } 
} 

你還需要一個連接字符串,你可以像這樣在app.config中定義它(Data\相對路徑被用作DBF文件,在這種情況下,源):

<connectionStrings> 
    <add name="VfpData" providerName="System.Data.OleDb" 
    connectionString="Provider=VFPOLEDB.1;Data Source=Data\;"/> 
</connectionStrings> 

最後,您可以執行讀取和寫入,並從DBF作爲文件一樣簡單:

// Construct a new context 
var context = new Context(ConfigurationManager.ConnectionStrings["VfpData"].ConnectionString); 

// Write to MyTable.dbf 
var my = new MyTable 
{ 
    ID = 1, 
    Field1 = 10, 
    Field2 = "foo", 
    Field3 = "bar" 
} 
context.MyTables.Insert(my); 

// Read from MyTable.dbf 
Console.WriteLine("Count: " + context.MyTables.Count()); 
foreach (var o in context.MyTables) 
{ 
    Console.WriteLine(o.Field2 + " " + o.Field3); 
} 
+1

有趣的方法,下次我需要這個時,我會研究它。 Fala ti susjed。 Živio! ;) – watbywbarif 2012-05-08 06:17:18