Конференция "Базы" » Провайдер VFPOLEDB.1 и запрет возврата удаленных запис [D7, dBase, FoxPro]
 
  • Сергей М. © (17.09.10 17:49) [0]
    Строка коннекта:

    Provider=VFPOLEDB.1;
    Data Source=x:\yyy\zzz.dbf;
    Mode=Share Deny Write;
    Deleted=Yes;
    и т.д.

    Не работает, зараза.. Возвращает все подряд - и удаленные и не удаленные ..

    Явное требование 'SET DELETED ON' в ADCommand.CommandText так же не приводит к ожидаемому результату.

    Где грабли ?)
  • sniknik © (17.09.10 19:10) [1]
    > Deleted=Yes;
    указание показывать удаленное... попробуй No.
  • Сергей М. © (17.09.10 22:26) [2]

    > sniknik ©   (17.09.10 19:10) [1]


    Если бы)..
    Это мелкомягкие так умудрились сократить Ignore Deleted..


    > попробуй No


    Хоть Но, хоть Йес, хоть Да, хоть Нет - результат один и тот же ..

    Чувствуя себя полным бараном открываю FoxPro25, командую ему SET DELETED ON - и та же самая таблица расчудесно показывается им без удаленных записей, а SET DELETED OFF - пожалуйста вам, с удаленными ..
  • Сергей М. © (17.09.10 22:36) [3]
    Раньш бывалочи ходил в фоксовые таблицы через ISAM да ODBC, проблем как помнится не было - Deleted=Yes отрабатывала как положено ..
    А тут вот приспичило постучать через OLEDB - и нате вам)..
  • sniknik © (18.09.10 09:01) [4]
    > ODBC, проблем как помнится не было
    тоже работал с ним только через ODBC... но по другой причине.
    вот попробуй в подключении к ODBC выполнить 2 запроса в одном блоке/команде (разделенные ;). работает? а теперь то же самое в OLEDB... а я с MSSQL уже как то привык к множественным рекордсетам (ну и если не работает одно, причем давно, и не исправляют, то где гарантии на остальное?).
  • sniknik © (18.09.10 09:18) [5]
    > а SET DELETED OFF - пожалуйста вам, с удаленными ..
    вообще, проверил, у меня так работает... а в строке при наборе в мастере параметра Deleted совсем нет. т.е. возможно ты пытаешься задать не существующий параметр, или у меня версия драйвера другая, давно ставил, точно не новая.
  • Сергей М. © (20.09.10 13:56) [6]

    > sniknik ©   (18.09.10 09:01) [4]


    Не возьму в толк нафига мне множественные рекордсеты, тем более что в

    http://msdn.microsoft.com/en-us/library/0xzsac67%28VS.80%29.aspx

    черным по желтому написано

    Note

    Visual FoxPro OLE DB Provider does not support multiple result sets.


    ?

    Все что мне надо - это после коннекта к провайдеру (OLEDB или ODBC) установить режим игнора удал.записей в возвращаемых провайдером наборах данных, после чего открыть собственно требуемый НД.

    Ну хорошо, пусть, предположим, vfpoledb-провайдер "не понимает" расширенного св-ва "Deleted"

    Но команду SET DELETED On/OFF он обязан понимать и исполнять как положено, судя хотя бы по первоисточнику:

    http://msdn.microsoft.com/en-us/library/80x51c04%28v=VS.80%29.aspx

    Вот рантайм-эквивалент моих потуг, не приводящих к желаемому результату:

       adoConn.ConnectionString := 'Provider=VFPOLEDB.1;Data Source=x:\yyy;Password=\"\";Collating Sequence=MACHINE
       adoCmd.Connection := adoConn;
       adoDataset.Connection := adoConn;
       adoCmd.Connection.Connected := True;
       cmd.CommandText := '
    SET DELETED ON';
       cmd.Execute;
       adoDataset.Open;



    Команда SET DELETED ON якобы успешно отрабатывается (иначе бы я схлопотал исключение), дейтасет успешно открывается, но в нем я вижу солянку из существующих и удаленных записей.

    Вот и стою на асфальте в лыжи обутый..

    p.s
    Долбаный фокс, когда же он наконец окончательно умрет ?)
  • sniknik © (20.09.10 14:52) [7]
    > черным по желтому написано
    > Note
    > Visual FoxPro OLE DB Provider does not support multiple result sets.
    > ?
    и тем не менее, в ODBC драйвере они были. (не буду искать доку, и так помню, у меня без них одна программа бы не работала)

    > Но команду SET DELETED On/OFF он обязан понимать и исполнять как положено
    ну, у меня и исполняет. как положено.

    > adoConn.ConnectionString := 'Provider=VFPOLEDB.1;Data Source=x:\yyy;Password="";Collating Sequence=MACHINE
    adoConn.KeepConnection := ???
  • Сергей М. © (20.09.10 15:03) [8]

    > adoConn.KeepConnection := ???


    Оно хоть True хоть False - никак не влияет.
    Да и с с какого перепугу оно должно влиять если я явно командую

    adoCmd.Connection.Connected := True;



    ?

    Хочешь сказать что коннект разрывается после

    cmd.Execute;



    ?

    Это не так при любом состоянии adoConn.KeepConnection.
    Хотя бы судя по невозбуждению события adoConn.XXXXDisconnect в промежутке времени между

    cmd.Execute;
    и
    adoDataset.Open;
  • Anatoly Podgoretsky © (20.09.10 15:08) [9]
    > Сергей М.  (20.09.2010 13:56:06)  [6]

    По документации данная команда поддержана и работает даже для Query
  • Anatoly Podgoretsky © (20.09.10 15:10) [10]
    Работает только в рамках текущего скопа, а эта последовательность

      cmd.Execute;
      adoDataset.Open;



    Вроде относится к разным скопам.
  • Сергей М. © (20.09.10 15:12) [11]
    p.s.

    Насколько я понимаю, версия VFPOLEDB-провайдера у меня свежее некуда

    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e1a87d8f-2d58-491f-a0fa-95a3289c5fd4

    Cправедливости ради нужно сказать что лезу я через него в таблицу, сверстанную в FoxPro 2.5, хотя этот факт не должен никоим макаром влиять на проблему, судя даже по тому что MS VFP 9 расчудесно открывает эту таблицу,  исправно исполняя при этом мои требования по SET DELETED.
  • Сергей М. © (20.09.10 15:14) [12]

    > Anatoly Podgoretsky ©   (20.09.10 15:10) [10]


    Ну так ткни меня носом в то как обеспечить единый скоп ..
  • Polevi © (20.09.10 15:20) [13]
    adoConn.ConnectionString := 'Provider=VFPOLEDB.1;Data Source=x:\yyy;Password="";Collating Sequence=MACHINE
      adoCmd.Connection := adoConn;
      adoCmd.Connection.Connected := True;
      adoCmd.CommandText := 'SET DELETED ON; SELECT * FROM Table';
      adoCmd.Execute;
  • Сергей М. © (20.09.10 15:33) [14]

    > Polevi ©   (20.09.10 15:20) [13]


    Так ведь adoCmd не есть наследник TDataSet ?
    После открытия, предположим, мне нужно из DataSource подцепиться к открытому таким образом НД ..
  • sniknik © (20.09.10 15:38) [15]
    Polevi ©   (20.09.10 15:20) [13]
    получится только в ODBC, там есть возврат множественных рекордсетов...

    > Так ведь adoCmd не есть наследник TDataSet ?
    он возвращает рекордсет, т.что можно просто его присвоить.
  • sniknik © (20.09.10 15:40) [16]
    > Хочешь сказать что коннект разрывается после
    при отсутствии открытых рекордсетов у данного коннекта... т.е. да и после Execute тоже возможно.
  • Сергей М. © (20.09.10 15:42) [17]
    Похоже я сообразил почему лыжи не едут ..

    При  
    CommandType = cmdUnknown

    или
    cmdText

    и
    CommandText = SomeTablename


    НД открывается в режиме прямого доступа к соотв. табличному контейнеру (что эквивалентно
    CommandType = cmdTableDirect

    )

    А в этом режиме провайдеру начхать на флаг DELETED, что как раз и подтверждается значением св-ва adoDataset.Properties['Skip Deleted Bookmarks'] =False после открытия рекордсета
  • Anatoly Podgoretsky © (20.09.10 16:33) [18]
    > Сергей М.  (20.09.2010 15:14:12)  [12]

    Не знаю как здесь, но в MS SQL

    Insert into
    execute
    select from
    open

    Это два разных скопа
    А,

    Insert into
    select from
    open

    Это один и тот же (инструкция известная, для получение ИД)
    Также можно создать серверную транзакцию, тогда все команды в одном скопе.
  • Anatoly Podgoretsky © (20.09.10 16:36) [19]
    > Polevi  (20.09.2010 15:20:13)  [13]

    Вот и я про тоже. Но тут утверждают, что это не работает. Может надо ниже
    спускаться, на уровень АДО, а не ADO.VCL
  • Anatoly Podgoretsky © (20.09.10 16:37) [20]
    Удалено модератором
  • Anatoly Podgoretsky © (20.09.10 16:38) [21]
    Удалено модератором
  • Anatoly Podgoretsky © (20.09.10 16:39) [22]
    Удалено модератором
  • Anatoly Podgoretsky © (20.09.10 16:43) [23]
    Удалено модератором
  • Сергей М. © (21.09.10 09:28) [24]
    Тогда возникает попутный вопрос - а фигурирует ли тем или иным образом поле с флагом DELETED в ADO-рекордсет, открытый в режиме TableDirect ?

    Иными словами, есть ли в этом режиме принципиальная возможность организовать пользов.фильтрацию записей по этому признаку, к примеру, обработчика OnFilterRecord ?
  • Сергей М. © (21.09.10 09:54) [25]
    Любопытно что попытка установки в дизайн-тайм  свойства

    CommandText = 'SELECT Deleted('MyDBFTable')', * FROM MyDBFTable'

    тут же вешает IDE намертво)
  • sniknik © (21.09.10 10:25) [26]
    ну так, получается же рекурсия, смена свойства таблицы сбрасывает/переоткрывает ее, а открытие вызывает смену... ты же его в запрос "влепил", т.е. получается взаимоблокировка.

    проверь, поставь другую.
  • Anatoly Podgoretsky © (21.09.10 11:28) [27]
    > Сергей М.  (21.09.2010 09:54:25)  [25]

    Ну вообще то этот запрос не выполнить, разбаланс кавычек
    Проверь так

    CommandText = 'SELECT Deleted(), * FROM MyDBFTable';

    и даже так, для начала

    CommandText = 'SELECT Deleted() FROM MyDBFTable';
 
Конференция "Базы" » Провайдер VFPOLEDB.1 и запрет возврата удаленных запис [D7, dBase, FoxPro]
Есть новые Нет новых   [134432   +18][b:0][p:0.001]