Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从C处理.dbf的最佳方法#_.net_Database_Ado.net_Dbf - Fatal编程技术网

.net 从C处理.dbf的最佳方法#

.net 从C处理.dbf的最佳方法#,.net,database,ado.net,dbf,.net,Database,Ado.net,Dbf,我可以使用哪个数据提供程序从C#更新.dbf文件 我尝试了几个不同的.dbf提供程序来创建数据源,但得到的消息如下: “错误消息:错误HYC00 Microsoft ODBC数据库驱动程序可选功能未实现。” 或者,当我生成了一个数据集和一个带有更新函数的dataadapter时,我得到了:“当传递带有修改行的DataRow集合时,更新需要一个有效的UpdateCommand。” 如果有人知道如何使用C#中的.dbf进行大量更新,请提供帮助。当我尝试逐个更新行时,速度太慢,因为提供程序在搜索大的.

我可以使用哪个数据提供程序从C#更新.dbf文件

我尝试了几个不同的.dbf提供程序来创建数据源,但得到的消息如下: “错误消息:错误HYC00 Microsoft ODBC数据库驱动程序可选功能未实现。”

或者,当我生成了一个数据集和一个带有更新函数的dataadapter时,我得到了:“当传递带有修改行的DataRow集合时,更新需要一个有效的UpdateCommand。”

如果有人知道如何使用C#中的.dbf进行大量更新,请提供帮助。当我尝试逐个更新行时,速度太慢,因为提供程序在搜索大的.dbf文件时会浪费太多时间。也许有一种方法可以自动构建索引,并且数据源知道如何使用它

另一种方法是在所有更改完成后将所有内容加载到dataset和update中,但更新部分暂时无法工作


救命啊

如果您坚持使用非常基本的SQL操作,那么普通的OleDbConnection可以很好地处理DBF

在我工作的地方,我们构建并维护使用专用OleDb类与DBF交互的应用程序。然而,我们不使用适配器或数据源——一切都是通过OleDbCommands、OleDbDataReaders等“直接”完成的


也许DataAdapter依赖于与基本或旧数据源(如xBase)交互时可能不存在的功能。您是否尝试过使用
更新
OleDbCommand?

通常,FoxPro驱动程序使用.DBF文件。该文件格式非常相似,适合阅读。写作有点棘手。不幸的是,由于DBASE是一种非常古老的技术,.NET不能很好地使用它,因此您几乎只能选择缓慢的选项。相信我,我感觉到你的痛苦,因为我必须为我们支持的POS系统定期使用这些

最后,我最喜欢的连接字符串源:


从您关于1GB数据库的信息中,我也可以使用VFP数据库(.dbf)文件格式,SQL更新通过OleDbCommand创建/执行工作没有问题,并且可以使用VFP OleDbProvider运行的任何本机命令

为了尝试删除一些字符,我通常使用函数CHRTRAN()(也就是说,如果您使用Visual Foxpro Ole DB Provider),您可以从中删除许多字符(例如无效字符),例如

Update YourTable
   set SomeField = chrtran( SomeField, "!@#$%^*(", "" )
将遍历所有记录并从字段(第一个参数)中删除任何字符,单个字符的任何实例(2st参数),并将其更改为在第三个参数中找到的相应字符。。。在本例中,没有值,只有一个空字符串,因此字符将被删除。它本身相当快,而且您不必一直扫描所有正在下载、测试、然后被推后的记录

同样,不能确定您使用的是哪个本机.DBF文件系统,但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; }
    }
}
您可以这样定义上下文:

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; }
    }
}
最后,您可以执行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);
}

是的,但是更新太慢了。我有大约1GB的基数,我必须从包含它的每一行中清除一些字符。如果我一行一行地做,会花费太多的时间,因为db没有索引。我必须做一些丑陋的事情,比如把所有的记录都放到内存中,删除所有的记录,然后用更改过的记录替换。我尝试使用replace命令进行更新,但Microsoft JET似乎不支持该命令。也许其他供应商会这样做?现在我成功地用Access中的replace进行了更新,但我不确定Access使用的是什么?我通过以下您推荐的页面上的链接发现了这一点:它看起来很有希望,改天我会尝试一下。有趣的方法,我将在下次需要时研究它。法拉蒂苏杰德。Živio!)