2014-07-04 2 views
1

Я пытаюсь выяснить, существует ли запись в таблице. Теперь один очевидный путь будет просто искать записи:Существует в ESENT

// Create correct keys for index with Api.MakeKey 
Api.JetSeek(sessionId, tableId, SeekGrbit.SeekEQ); 

Однако эта операция будет установить курсор на найденной записи (в случае успеха), что я не хочу делать. Я думаю, я мог бы как-то просто сохранить текущий номер записи, а затем установить его обратно, но, может быть, есть лучшее решение? Я не смог найти правильный метод в api.

Итак, возможно ли существовать «Существо», что означает «Иск», чтобы проверить, существует ли запись?

Кстати, я использую .NET 4.0 с управляемым интерфейсом ESENT 1.9.0.

ответ

1

Во-первых, получить текущую позицию курсора с помощью JetGetRecordPosition метода

public static void JetGetRecordPosition(
    JET_SESID sesid, 
    JET_TABLEID tableid, 
    out JET_RECPOS recpos 
) 

Затем проверьте, если запись существует, как вы сделали

Api.JetSeek(sessionId, tableId, SeekGrbit.SeekEQ); 

или используя булеву метод TrySeek который возвращает истину, если запись соответствия критериям был найден.

public static bool TrySeek(
    JET_SESID sesid, 
    JET_TABLEID tableid, 
    SeekGrbit grbit 
) 

Затем вам нужно установить курсор на предыдущую позицию, для этого его используют Api.JetGotoPosition метод с recpos вы получили от первого метода.

public static void JetGotoPosition(
    JET_SESID sesid, 
    JET_TABLEID tableid, 
    JET_RECPOS recpos 
) 

Надеюсь, это поможет.

+0

Я не думаю, что я понимаю ваш ответ правильно. Таким образом, я могу получить IndexInfo текущего применяемого индекса. Как это помогает мне с проверкой наличия записи? – Daniel

+0

@ Даниэль, я полностью изменил свой ответ. –

+0

Хорошо, я думаю, если это единственный вариант (я уже обрисовал это в своем вопросе). В любом случае, спасибо за подробное описание того, как работать с внутренними позициями записи, экономит мне некоторое время, узнавая о себе. Я подожду еще один день, прежде чем награждать щедрость, чтобы удостовериться, что у кого-то еще нет лучшей идеи – Daniel

0

Другой метод заключается в использовании метода JetDupCursor() для создания нового JET_TABLEID, который не зависит от текущего JET_TABLEID. Таким образом, метод TrySeek() не изменит положение исходного курсора, если строка найдена

https://msdn.microsoft.com/en-us/library/microsoft.isam.esent.interop.api.jetdupcursor%28v=exchg.10%29.aspx?f=255&MSPPError=-2147217396