В текущей рабочей области нет открытых таблиц - PullRequest
0 голосов
/ 04 мая 2018

При попытке создать файл CDX на существующем файле DBF, используя приведенный ниже код, я получаю исключение, говорящее "No table is open in the current work area".

Язык - C#

Сведения об исключении -

Message - No table is open in the current work area.
Source - Microsoft OLE DB Provider for Visual FoxPro

Ниже приведен фрагмент кода:

     public void CreateIndex()
    {
        var cdxExpressions = new List<CDXExpression> {
            new CDXExpression { expression = "ENTRY_DATE", name = "cdx_p1"},
            new CDXExpression { expression = "ENTRY_CODE", name = "cdx_p2"},
            new CDXExpression { expression = "Month", name = "cdx_p3"},
            new CDXExpression { expression = "Year", name = "cdx_p4"},
            new CDXExpression { expression = "Company", name = "cdx_p5"}
        };

        string dbfFile = ConfigurationManager.AppSettings["DBFFileLocation"];
        string connectionString = @"Provider=VFPOLEDB.1;Data Source=" + dbfFile + ";Extended Properties=dBASE IV;";
        OleDbConnection connection = new OleDbConnection(connectionString);

        var queries = DBFQuery.CreateCDXQueries(cdxExpressions, dbfFile);

        connection.Open();
        try
        {
            foreach (var qry in queries)
            {
                OleDbParameter script = new OleDbParameter("script", qry);
                OleDbCommand dbfCommand = connection.CreateCommand();
                dbfCommand.CommandType = CommandType.StoredProcedure;
                dbfCommand.CommandText = "ExecScript";
                //dbfCommand.Connection.Open();
                dbfCommand.Parameters.Add(script);
                dbfCommand.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            // I should Open the DBF/Table in the current work area to avoid the exception
        }
        connection.Close();
    }

Как открыть файл DBF в c #, чтобы избежать исключения "В текущей рабочей области нет таблицы", также используется Microsoft OLE DB Provider для Visual FoxPro

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Это с вашим списком CDXExpression:

public void CreateIndex()
{
    var cdxExpressions = new List<CDXExpression> {
            new CDXExpression { expression = "ENTRY_DATE", name = "cdx_p1"},
            new CDXExpression { expression = "ENTRY_CODE", name = "cdx_p2"},
            new CDXExpression { expression = "Month", name = "cdx_p3"},
            new CDXExpression { expression = "Year", name = "cdx_p4"},
            new CDXExpression { expression = "Company", name = "cdx_p5"}
        };

    var myCode = "use sample exclusive\n" +
          string.Join("\n", cdxExpressions.Select(e => $"index on {e.expression} tag {e.name}")) +
          "\nuse";

    string dbfFile = ConfigurationManager.AppSettings["DBFFileLocation"];
    string connectionString = @"Provider=VFPOLEDB;Data Source=" + dbfFile;

    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        OleDbCommand cmd = connection.CreateCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "ExecScript";
        OleDbParameter parm = cmd.CreateParameter();
        parm.OleDbType = OleDbType.Char;
        cmd.Parameters.Add(parm);
        parm.Value = myCode;
        try
        {
            connection.Open();
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            // ...
        }
    }
}
0 голосов
/ 04 мая 2018

Вы скрываете самую важную часть, код CreateCDXQueries. Где-то, прежде чем пытаться создать индекс, вы должны открыть таблицу в текущей рабочей области как эксклюзивную. Кроме того, удалите эту часть расширенных свойств из строки подключения. Вот очень простой пример. Предположим, у вас уже есть таблица, созданная с помощью этой команды (или созданная в рамках того же вызова Execscript):

Create Table ('d:\temp\IndexTest') free (id int, firstName c(10), lastName c(10))

Это код C # для создания индексных тегов:

static void Main()
{
    string myCode =
    @"use indexTest exclusive
index on firstName tag firstName
index on lastName tag LastName
index on id tag id
use
";

    string strCon = @"Provider=VFPOLEDB;Data Source=d:\temp";
    OleDbConnection con = new OleDbConnection(strCon);
    OleDbCommand cmd = con.CreateCommand();

    con.Open();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "ExecScript";
    OleDbParameter parm = cmd.CreateParameter();
    parm.OleDbType = OleDbType.Char;
    cmd.Parameters.Add(parm);

    parm.Value = myCode;

    cmd.ExecuteNonQuery();
    con.Close();
}

Нет попытки ... поймать код, так как это был быстрый пример.

...