Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Во-первых, можно использовать существующую платформу, которая решает эти проблемы, как CSLA.NET. Автор этой платформы занялся этими самыми проблемами. Перейдите к http://www.rockfordlhotka.net/cslanet/ для этого. Даже если Вы не используете полную платформу, понятия все еще применимы.
Если Вы хотели к самокрутке, что я сделал в прошлом, был к вместо того, чтобы использовать Список для моих наборов, я использовал пользовательский тип, полученный из BindingList. Inhereting от BindingList позволяет, Вы для переопределения поведения добавляете/удаляете объект. Таким образом, у Вас может, например, быть другой внутренний набор "delteted" объектов. Каждый раз переопределенные Удаляют метод, назван на Вашем наборе, помещает объект в "удаленный" набор и затем называют базовое внедрение Удалить метода. Можно сделать то же для добавленных объектов или измененных объектов.
Вы - пятно при о необходимости в единице работы, но не пишете ту. Используйте NHibernate или некоторый другой ORM. Для именно это они сделаны. Им встроили Единицу Работ.
Бизнес-объекты являются действительно "способом пойти" для большинства приложений. Вы погружаетесь в глубокую область и будет много обучения сделать. Изучите DDD.
Я также категорически не рекомендовал бы код как этот в Вашем коде - позади. Изучите шаблон MVP.
Я был бы также (в то время как я потрудился учиться, много новых, очень критических вещей) изучают ТЕЛО.
Можно хотеть проверить мирового судью Boodhoo только курс .NET, поскольку он покрывает много этих вещей.
Объекты данных не отслеживают изменения. Отслеживание изменений происходит на DataContext и возражает, что Вы получили через DataContext. Таким образом, для отслеживания изменений, необходимо сделать следующее:
public class FooDataContext : DataContext
{
public Table<Order> Orders;
}
public class Order
{
[DbColumn(Identity = true)]
[Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
public int Id { get; set; }
[DbColumn(Default = "(getutcdate())")]
[Column(DbType = "DateTime", CanBeNull = false, IsDbGenerated = true)]
public DateTime DateCreated { get; set; }
[Column(DbType = "varchar(50)", CanBeNull = false, IsDbGenerated = false)]
public string Name { get; set; }
}
Теперь в Вашем codebehind можно сделать что-то как:
public void UpdateOrder(int id, string name)
{
FooDataContext db = new FooDataContext();
Order order = db.Orders.Where(o=>o.Id == id).FirstOrDefault();
if (order == null) return;
order.Name = name;
db.SubmitChanges();
}
Я не рекомендовал бы непосредственно использовать контекст данных в коде позади, но это - хороший способ начать с Linq К SQL. Я рекомендовал бы поместить все Ваши взаимодействия базы данных во внешний проект и вызов от GUI до классов, которые инкапсулируют это поведение.
Я рекомендовал бы создать Linq В файл Sql (dbml), если Вы плохо знакомы с Linq К Sql.
Щелкните правой кнопкой по своему проекту в проводнике решения, и выбор Добавляет Новый Объект. Выберите Linq В файл SQL, и он затем позволит Вам соединиться со своей базой данных и выбрать таблицы.
Можно затем посмотреть на сгенерированный код и надеть некоторые прекрасные идеи, как Linq К Sql работает и что можно сделать с ним.
Используйте это в качестве инструкции по работе с Linq к SQL, и это возьмет Вас далеко...