亲爱的 Stackoverflow 社区,
在 Visual Studio 2010 中使用带有 .NET 4.0 客户端配置文件的 VFPOleDb 库 (9.0Sp2) 我有点困惑。我想做什么?使用 C# 编辑现有的并创建新的 FoxPro 数据库文件。
尝试编译我自己的示例,并基于“如何在 C# 中从头开始创建 dbf 文件”(1)、“如何从 C# 读取 FoxPro 8.0 数据库”(2)和“使用 Visual 进行数据库编程”中看到的示例FoxPro” ( 3 ) 我收到一个编译错误:“功能不可用”。Stacktracing 异常消息显示 OleDbConnection 工厂无法识别连接字符串?我已经添加了“Interop.VFPOLEDBLib”作为参考,但由于缺少清单文件,我无法添加“vfpoledb.dll”?
代码示例
using System;
using System.IO;
using System.Data;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.Common;
namespace VFPExample
{
class VFPExample
{
/*
https://stackoverflow.com/questions/754436/odbc-dbf-files-in-c-sharp/
http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic62548.aspx
*/
static void Main(String[] args)
{
{
string strTestDirectory = @"Provider=VFPOLEDB.1; DataSource=D:\TEMP\";
using (OleDbConnection vfpro_con_insert =
new OleDbConnection(strTestDirectory) )
{
vfpro_con_insert.Open(); // FIXME: Ex.Message: "Feature not available";
OleDbCommand createTable = new OleDbCommand(@"Create Table TestDBF (Field1 I, Field2 C(10))", vfpro_con_insert);
OleDbCommand insertTable1 = new OleDbCommand(@"Insert Into TestDBF Values (1, 'Hello')", vfpro_con_insert);
OleDbCommand insertTable2 = new OleDbCommand(@"Insert Into TestDBF Values (2, 'World')", vfpro_con_insert);
createTable.ExecuteNonQuery();
insertTable1.ExecuteNonQuery();
insertTable2.ExecuteNonQuery();
Console.WriteLine("Wrote in " + vfpro_con_insert.DataSource);
}
Console.ReadLine();
/*
--------------------------------------------------------------------------------
*/
using (OleDbConnection vfpro_con_read = new OleDbConnection(strTestDirectory))
{
vfpro_con_read.Open();
OleDbCommand readTable = new OleDbCommand("Select * From TestDBF (Field1 I, Field2 C(10))", vfpro_con_read);
OleDbDataAdapter da = new OleDbDataAdapter(readTable);
DataSet ds = new DataSet();
// DataRow dr = new DataRow();
da.Fill(ds);
foreach (DataRow dr in ds.Tables[0].Rows)
{
Console.WriteLine(dr.ItemArray[1].ToString());
}
}
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("\n\n Exception:\n\n{0}", e.Message); // Set Breakpoint here for detailed StackTrace
}
}
}
}
堆栈跟踪
> e {"Feature is not available."} System.Exception {System.Data.OleDb.OleDbException}
> [System.Data.OleDb.OleDbException]
> {"Feature is not available."}
> System.Data.OleDb.OleDbException
> Data {System.Collections.ListDictionaryInternal}
> System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
> HelpLink null string
> InnerException null System.Exception
> Message "Feature is not available." string
> Source "Microsoft OLE DB Provider for Visual FoxPro" string
> StackTrace "
> at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
> at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
> at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
> at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
> at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
> at System.Data.OleDb.OleDbConnection.Open()
> at bestsellerList.VFPExample.Main(String[] args)
> in D:\Visual Studio 2010\Projects\VFPExample\VFPExample.cs:Line 37." string
> TargetSite {Void .ctor(System.Data.OleDb.OleDbConnectionString, System.Data.OleDb.OleDbConnection)} System.Reflection.MethodBase {System.Reflection.RuntimeConstructorInfo}
> Static Member
> No(t) public Member
> e.Message "Feature is not available." string
(试图修复本地化)
因此,我需要对 Visual Studio 中的 VFPOleDb/Visual FoxPro 进行一些说明:
Visual FoxPro 库是否仅支持 .NET Client Profile 2.0 和/或 Visual Studio 2003/5(及更早版本)?此外,我可以清楚地看到 VSFoxPro ( 5 ) 已达到其产品生命周期结束 ( 4 ) - 至少对于主流支持而言。在 2015 年之前仍会提供延长支持。Microsoft 是否还有其他关于 FoxPro 数据库迁移的(半)官方文档或博客条目?已经看过“从 Visual FoxPro 迁移”(6)。
.NET 3.x(客户端配置文件)及更高版本是否报告了任何成功的编译?
我在 Visual Studio 中的代码示例和/或参考中缺少什么?
因此,我采用了示例代码,根据我的需要对其进行了修改——读取一个包含六列和许多行的表,该表导出为 csv 文件;在我的本地机器上工作正常(像往常一样,我们都知道)——并将可执行文件复制到安装了 .NET 3.5.x 的 Windows 2008 Server R2 并尝试启动应用程序。您是否已经进行了有根据的猜测?
我再次收到与第一次相同的异常,但这次看起来像那样
DataSet ds = new DataSet();
da.Fill(ds); // throws Exception
da.Fill(ds)
是麻烦制造者,但这对我来说真的没有意义,因为我还将基于更正代码的编译示例应用程序复制到服务器,它只是做了它应该做的事情......
感谢您的任何提示。
例外
System.Data.OleDb.OleDbException: Feature is not available.
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at Program.Main(String[] args)
System.Collections.ListDictionaryInternal
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at Program.Main(String[] args)