Проблемы с передачей массива значений в массив Object - PullRequest
0 голосов
/ 29 апреля 2009

Я пытаюсь передать массив значений в массив объекта таблицы, чтобы я мог записать их в базу данных.

Моя база данных выглядит так ->
tblCaseNotes
CaseNoteID | PersonId | и т. д.

tblCaseNotesContactType
rowguid | CaseNoteID | ContactTypeID

tblMaintItems
itemID | CategoryID

ItemID из таблицы Maint - это то, что записывается в tblCaseNotesContactType вместе с текущим CaseNoteID. Может быть несколько ContactTypes для CaseNote.

На данный момент у меня есть массив значений для CheckTistBox ContactType, созданный в моем событии btnNew_Click:

// Contact Type check list box
int cTypeCount = chkContactType.CheckedItems.Count;
int [] contactTypes = new int[cTypeCount];

// reusable generic counter for looping thru the check lists
int cMaintCounter = 0;

foreach (int checkedItem in chkContactType.CheckedIndices)
{
    contactTypes[cMaintCounter] = (int)chkContactType.GetItemValue(checkedItem);
    cMaintCounter++;
}
CurrentCaseNote.AddCNote(Program._CurrentPerson.PersonID, Convert.ToDecimal(tbxTimeSpentUnits.Text), chkIsCaseLog.Checked, Convert.ToDateTime(datContactDate.Text), memContactDetails.Text, contactTypes);

Который затем я передаю своему методу AddCNote объекта CurrentCaseNote.

public static void AddCNote(int personID, decimal tsUnits, bool isCaseLog, DateTime cDate, string cDetails, int[] cTypes)
{
    var caseNoteToAdd = new tblCaseNote
                            {
                                CaseNoteID = Guid.NewGuid(),
                                PersonID = personID,
                                TimeSpentUnits =tsUnits,
                                IsCaseLog =isCaseLog,
                                ContactDate =cDate,
                                ContactDetails =cDetails,
                                InsertDate = DateTime.Now,
                                InsertUser = Environment.UserName
                            };

    tblCaseNotesContactType[] cTypeToAdd = new tblCaseNotesContactType[cTypes.Length];
    cTypeToAdd[0].CaseNoteID = caseNoteToAdd.CaseNoteID;
    cTypeToAdd[0].ContactTypeID =cTypes[0];
    cTypeToAdd[0].rowguid = Guid.NewGuid();

    CaseNoteDAL.addCNote(caseNoteToAdd,cTypeToAdd);

Затем он передается в DAL для записи в локальную базу данных:

public static void addCNote(tblCaseNote caseNote, tblCaseNotesContactType[] cType)
{
    foreach (var type in cType)
    {
        caseNote.tblCaseNotesContactTypes.Add(type);               
    }
    dcCaseNotes.tblCaseNotes.InsertOnSubmit(caseNote);

    //dcCaseNotes.tblCaseNotes.InsertOnSubmit(caseNoteToAdd);
    dcCaseNotes.SubmitChanges();
}

Это дает мне NUllReferenceException была необработанная ошибка в этой строке -> cTypeToAdd[0].CaseNoteID = caseNoteToAdd.CaseNoteID;
Это потому, что я работаю только с [0]? Я просто сделал это, чтобы упростить мое тестирование. Когда я шагаю по коду, мой массив значений корректен и есть Guid для caseNoteToAdd.CasNoteID

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

Спасибо

~ P

1 Ответ

6 голосов
/ 29 апреля 2009

Проблема в том, что вы создали массив ссылочных типов, но не заполнили его.

Другими словами, после этой строки:

tblCaseNotesContactType[] cTypeToAdd = new tblCaseNotesContactType[cTypes.Length];

у вас есть массив нулевых ссылок - значение каждого элемента равно нулю.

Затем необходимо написать:

cTypeToAdd[0] = new tblCaseNotesContactType();

(или аналогичное утверждение), прежде чем вы сможете начать изменять его свойства.

Альтернативой может быть использование инициализатора объекта и выполнение его одним оператором (после создания массива):

cTypeToAdd[0] = new tblCaseNotesContactType
{
    CaseNoteID = caseNoteToAdd.CaseNoteID,
    ContactTypeID =cTypes[0],
    rowguid = Guid.NewGuid()
}:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...