Para as perguntas 1 e 2, siga as respostas de Mateus.
Passei muito tempo tentando descobrir a melhor maneira de estruturar o DAL dos aplicativos de desktop. E a melhor maneira realmente depende das necessidades do aplicativo. Em um dos meus aplicativos, desenvolvi uma classe DA para cada tabela de banco de dados, que se registrou com uma classe DataProvider central (ou seja, singleton) e lidou com o CRUD. Cada classe DA poderia então decidir se queria ou não armazenar em cache todos os dados da tabela na RAM (desempenho!) E / ou se precisava ativar as atualizações automáticas de clientes em outros clientes em execução em outros computadores (pense em vários usuários concorrência). Isso facilita a adição de novas classes DAL, pois tudo o que eles precisam fazer é estar em conformidade com a interface de registro.
Nem todo DAL precisa desse tipo de funcionalidade, mas aprendi que a abordagem em si (por exemplo, provedor de dados singleton e classes DAL simples com registro estático) facilitou muito minha vida quando comecei a adicionar novas classes.
Definitivamente, eu não recomendaria criar o CRUD em classes de nível superior, a menos que este seja um aplicativo muito simples. O DAL é uma abstração do armazenamento de dados. Se você decidir alterar seu armazenamento de dados em algum momento no futuro (mesmo que seja apenas para usar o MySQL em vez do MS SQL), ficará muito agradecido por isso. Além disso: os objetos BLL devem ser estruturados por seus relacionamentos de lógica de negócios. Os objetos DAL são estruturados pelos tipos de contêineres de armazenamento que eles representam. As diferenças podem ser dramáticas.
Você não fazer o seu aulas DAL estática. O que você ganha em velocidade de codificação perde muitas vezes em testabilidade e flexibilidade.