2

Stackoverflowコミュニティの皆様、

Visual Studio2010で.NET4.0クライアントプロファイルを使用してVFPOleDbライブラリ(9.0Sp2)を使用すると少し混乱します。何をしたいですか?C#を使用して、既存のFoxProデータベースファイルを編集し、新しいFoxProデータベースファイルを作成します。

「C#でdbfファイルを最初から作成する方法」(1)、「C#からFoxPro 8.0データベースを読み取る方法」(2)、「Visualを使用したデータベースのプログラミング」に示されている例に基づいて、独自の例をコンパイルしようとしています。 FoxPro "(3)コンパイルエラーが発生しました:"機能が利用できません"。例外メッセージをスタックトレースすると、OleDbConnection Factoryが接続文字列を認識しないことがわかりますか?参照として「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

(ローカリゼーションを修正しようとしました)

したがって、VisualStudioのVFPOleDb/VisualFoxProに関する説明が必要です。

  • Visual FoxProライブラリは、.NET ClientProfile2.0および/またはVisualStudio2003/5(およびそれ以前)でのみサポートされていますか?さらに、VSFoxPro(5)が製品ライフサイクルの終了(4)に到達したことをはっきりと確認できます。少なくともメインストリームサポートについてはそうです。拡張サポートは2015年まで引き続き付与されます。FoxProデータベースの移行に関するMicrosoftからの他の(半)公式ドキュメントまたはブログエントリはありますか?すでに見た「VisualFoxProからの移行」(6)。

  • .NET 3.x(クライアントプロファイル)以降で成功したコンパイルが報告されていますか?

  • Visual Studioのコード例やリファレンスに何が欠けていますか?


そこで、サンプルコードを使用して、必要に応じて変更しました。6つの列と多数の行を持つ1つのテーブルを読み取り、csvファイルとしてエクスポートします。私のローカルマシンでは正常に動作します(いつものように)-実行可能ファイルを.NET3.5.xがインストールされたWindows2008 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)
4

3 に答える 3

3

提案どおりにコードを修正し、クリーンアップして、いくつかのマイナーな部分を改善しました。できます。

using System;
using System.IO;
using System.Data;
using System.Data.Odbc;
using System.Data.OleDb;
using System.Data.Common;

namespace VFPExample
{
    class VFPExample
    {
        /*
         * http://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)
        {
            try
            {
                string strTestDirectory = @"Provider=VFPOLEDB.1; Data Source=D:\TEMP\";

                using (OleDbConnection vfpro_con_insert = new OleDbConnection(strTestDirectory) )
                {
                    vfpro_con_insert.Open(); 

                    OleDbCommand createTable = new OleDbCommand(@"Create Table TestDBF (Field1 N(2,0), Field2 C(10))", vfpro_con_insert);
                    OleDbCommand insertTable1 = new OleDbCommand(@"Insert Into TestDBF (Field1, Field2) Values (1, 'Hello')", vfpro_con_insert);
                    OleDbCommand insertTable2 = new OleDbCommand(@"Insert Into TestDBF (Field1, Field2) 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))
                {
                    Console.WriteLine("Read from " + vfpro_con_read.DataSource);

                    vfpro_con_read.Open();

                    OleDbCommand readTable = new OleDbCommand(@"Select * From TestDBF", vfpro_con_read);

                    OleDbDataAdapter da = new OleDbDataAdapter(readTable);

                    DataSet ds = new DataSet();

                    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
            }
        }
    }
}
于 2012-06-01T21:19:20.027 に答える
2

「機能を利用できません」という例外は、接続文字列が正しくないことが原因です。「データソース」の代わりに「データソース」を使用します。</p>

于 2012-05-31T18:09:21.357 に答える
0

VS2010ビルドWPFアプリを使用してVFPOleDbを問題なく使用しましたが、32ビットの開発マシンで実行しています。VFPは64ビットをサポートしていません--PERIOD、そしてそれがあなたが遭遇しているものであるかもしれないかどうかわかりません。

また...パス「D:\ TEMP」は存在しますか?パスを自動的に作成しようとはしませんが、別のエラーをスローしているように見えます。

System.Data.ODBCとSystem.Data.Commonを削除することもできます。これらは、作業しているサンプルでは必要ないと思います。

また、「Interop.VFPOLEDBLib」の明示的な追加参照もありません。私が遭遇したことから、System.Dataとあなたが持っているものを持っているだけです

using System.Data;
using System.Data.OleDb;

行ってもいいはずです。OleDBプロバイダーは、「Provider = VFPOLEDB.1;」を読み込もうとすると、実際には「登録済み」のものを調べます。部分。

そうは言っても、私はそれをさらに単純にすることから始めます...接続を開いてから閉じてみてください

static void Main(String[] args)
{
   string strTestDirectory = @"Provider=VFPOLEDB.1; DataSource=D:\TEMP\";

   OleDbConnection VFPConn = new OleDbConnection(strTestDirectory);
   VFPConn.Open();
   if( VFPConn.State == System.Data.ConnectionState.Open )
      VFPConn.Close();
}

これがクラッシュするかどうかを確認してください...クラッシュする場合は、接続の作成、挿入、選択の他の準備とは何の関係もありませんが、明示的には関係ありません。

于 2012-05-31T16:59:07.540 に答える