RUS  ENG 

Ошибка в приложении на C#

Страницы: 1
RSS
Ошибка в приложении на C#
 
Добрый день, пишем программку небольшую на C# чтобы автоматизировать некоторые действия
код такой:

using ZB;
using Zulu;
using ZuluLib;

namespace app
{
class Class1
{
public static void sdf()
{
Zulu.Zulu zApp = new Zulu.Zulu();
MapDoc zMapDoc = zApp.ActiveDocument.NativeDoc as MapDoc;
Layer L = zMapDoc.Layers.Active;
ElementKeys uch_keys = L.ElementKeys.SelectByType(6, 0);

ZbDatabase DB_Uch = new ZbDatabase();
DB_Uch.Open(L.ObjectTypes.GetItemByIndex(5).BaseName); //5 участки

for (int j = 1; j <= uch_keys.Count; j++)
{
int _sys = L.Elements.GetElement(uch_keys[j]).Key; //это Sys элемента
string _Begin_uch;
string _End_uch;
try
{
_Begin_uch = DB_Uch.SelectByKey(_sys).FieldValue[DB_Uch.SelectByKey(_sys).GetFieldIndexByName(0, "Begin_uch")];
_End_uch = DB_Uch.SelectByKey(_sys).FieldValue[DB_Uch.SelectByKey(_sys).GetFieldIndexByName(0, "End_uch")];

if (_End_uch.EndsWith(" п20"))
{
DB_Uch.UpdateBaseRecord(uch_keys[j], "Dpod", "0.1", null);
DB_Uch.UpdateBaseRecord(uch_keys[j], "Dobr", "0.1", null);
MessageBox.Show(_sys.ToString());
}
}
catch (Exception e)
{
MessageBox.Show(e);
}
}
}
}
}

программа обращается к активному сейчас слою, ищет на нем определенные участки, и меняет диаметр трубопровода
uch_keys.Count=3623; (столько у нас участков на слое)
но когда в цикле доходит до j=1871 то программа вылетает на строчке
_Begin_uch = DB_Uch.SelectByKey(_sys).FieldValue[DB_Uch.SelectByKey(_sys).GetFieldIndexByName(0, "Begin_uch")];
с сообщением
"ссылка на объект не указывает на экземпляр объекта"


Что пробовал:
1) перед циклом ручками написать
_Begin_uch = DB_Uch.SelectByKey(1871).FieldValue[DB_Uch.SelectByKey(1871).GetFieldIndexByName(0, "Begin_uch")]; - ошибки не вызывает
затем цикл всеравно вылетает на j=1871

2)сделать цикл for (int j = 1870; j <= uch_keys.Count; j++) - ошибки не вылетает, программа завершается нормально

3) пробовал сделать два цикла один от j=1 до j=1870 следом второй от j = 1870; j <= uch_keys.Count вылетает во втором цикле на 1871 опять

эта ошибка вылазит не всегда, не могу закономерность уловить из-за чего она появляется...
Подскажите в какую сторону копать?

UPD: а сейчас вот на 2805 вылетело... на строчке int _sys = L.Elements.GetElement(uch_keys[j]).Key; //это Sys элемента
 
Есть замечания к коду:
1. Код выполняется из плагина ? Если да, то доступ к объекту Zulu нужно получать через IPluginConnector.Zulu, вместо new Zulu.Zulu.
2. Проверяйте в коде результат вызова DB_Uch.SelectByKey(_sys). Если возвращается null, проверьте значение DB_Uch.LastErrorString, почему не выполнился запрос.
3. Обратите также внимание, что в коде "_Begin_uch = DB_Uch.SelectByKey(_sys).FieldValue[DB_Uch.SelectByKey(_sys).GetFieldIndexByName(0, "Begin_uch")];" запрос к БД выполняется дважды(!)
4. _sys = L.Elements.GetElement(uch_keys[j]).Key эквивалентна просто _sys = uch_keys[j] (по ключу получаете элемент от которого получаете ключ)
 
я не нашел примера или описания боле менее подробного как сделать плагин, поэтому это просто отдельное приложение сейчас
по замечаниям спасибо, поправил, теперь так, и вроде бы все работает

namespace zulu_участки
{
class connect_to_zulu
{
public static void sdf(int nachalo_cikla, int konec_cikla)
{
int qwer = 0;
NumberFormatInfo provider = new NumberFormatInfo();
provider.NumberDecimalSeparator = ".";

Zulu.Zulu zApp = new Zulu.Zulu();
MapDoc zMapDoc = zApp.ActiveDocument.NativeDoc as MapDoc;
Layer actLayer = zMapDoc.Layers.Active;
ElementKeys uch_keys = actLayer.ElementKeys.SelectByType(6, 0);

ZbDatabase db_uch = new ZbDatabase();
db_uch.Open(actLayer.ObjectTypes.GetItemByIndex(5).BaseName); //5 участки

try
{
for (int j = nachalo_cikla; j <= konec_cikla; j++)
{
qwer = j;
int sys_el = uch_keys[j]; //это Sys элемента
dynamic row = db_uch.SelectByKey(sys_el);
int index_begin_uch = row.GetFieldIndexByName(0, "Begin_uch");
int index_end_uch = row.GetFieldIndexByName(0, "End_uch");
string begin_uch = row.FieldValue[index_begin_uch];
string end_uch = row.FieldValue[index_end_uch];

if (end_uch.EndsWith(" п20"))
{
db_uch.UpdateBaseRecord(sys_el, "Dpod", "0.1", null);
db_uch.UpdateBaseRecord(sys_el, "Dobr", "0.1", null);
}
Marshal.ReleaseComObject(row);
}
}
catch (Exception e)
{
string message_err = db_uch.LastErrorString;
MessageBox.Show(message_err+"\n"+"ОШИБКА2\n"+ qwer+ e);
}
db_uch.CloseConnections();
Marshal.ReleaseComObject(uch_keys);
Marshal.ReleaseComObject(actLayer);
Marshal.ReleaseComObject(zMapDoc);
Marshal.ReleaseComObject(zApp);
}
}
}
Страницы: 1