Pessoal, com o intuito de ajudar a comunidade um pouquinho e devolver o conhecimento agregado com alguns anos de experiência nas tecnologias Microsoft, vou mostrar como criar um sistema em várias camadas que pode ser usado para tipos diferentes de software, como aplicações em console (a famosa tela DOS) e aplicações Web.
Pré-requisitos: conhecimentos básicos em C#/Java e SQL Server ou outro banco de dados, mas se você nunca viu a linguagem nem o banco de dados ainda irá se aproveitar dos conhecimentos.
A ideia de ser multi camadas é para evitar a repetição do mesmo código pra fazer a mesma tarefa pra cada tipo de aplicação, assim serão separadas as camadas de arquitetura (dados, entidades e negócio) e as respectivas camadas das aplicações, totalizando assim 5 camadas, mas as 2 de aplicações irão se aproveitar das 3 de arquitetura do projeto, sem precisar criar código novo toda vez que trocar de camada.
Será utilizado a versão free tanto do SQL Server 2012, quanto do Visual Studio Community 2019, os links tanto destes aplicativos quanto do projeto completo estarão ao final do post.
PS: Fica aqui a “provocação” e incentivo a procurar mais sobre assuntos que serão brevemente discorridos aqui, como por exemplo a linguagem C#, o banco de dados SQL Server, e outros conceitos importantes da programação orientada a objetos, mas dependendo do “sucesso” e demanda deste post consigo detalhar melhor em outros posts alguns conceitos, mas de qualquer forma esse artigo se foca no título da postagem e em tentar descomplicar a programação, espero conseguir.
PS2: Será feito somente o cadastro de clientes neste post, só a parte de INSERT, com motivos de tentar simplificar todo o processo e mostrar o conceito das camadas. Para o processo de exclusão (DELETE), atualização (UPDATE) e consulta (SELECT) é o mesmo conceito, só muda a instrução SQL.
A ideia é ser um cadastro simples de clientes então no SQL Server criei a seguinte tabela:


Note que na linha do ID já é definido o campo como chave primária e também como
Identity, que significa que ele é um identificador único e será incrementado de 1 em 1, a cada inserção.
Indo agora para o Visual Studio, crie uma solução vazia (template Empty Project) na versão
4.5 do .NET Framework, ao criar ele já adiciona um projeto, mas não iremos usá-lo, então clique com o botão direito nele e clique em Remove. Depois clique com o direito na solução e em
Add > New Project, selecione o template Class Library .NET Framework (não confundir com .NET Standard), dê Next, o nome
DAL e Create.
DAL é de Data Access Layer, representará a camada de acesso a dados. Renomeie a classe criada com o nome de Dados.cs, é nela que ficará toda a lógica de acesso ao banco.

A aba de cima é a
Solution Explorer, ela mostra a hierarquia do seu projeto contendo todos os arquivos do sistema e que permite mais arquivos serem adicionados conforme necessário.
Antes de começar a codificar é importante definir a conexão com o banco de dados, existe uma aba em que é possível adicionar e configurar a conexão, para isso vá no menu
View > Server Explorer.

Essa Add Connection abre o popup abaixo, onde será possível configurar a conexão entre o Visual Studio e o SQL Server, acessando assim a tabela criada.

Agora é necessário copiar o caminho desta conexão porque será utilizada logo mais, para copiar a conexão basta clicar com o botão direito em cima da conexão criada, na aba Server Explorer, e clicar em
Properties.
Ele irá abrir a aba de propriedades do Visual Studio, copie a linha Connection String pois ela será usada em breve, só dar um botão direito e copiar mesmo. Lembrando que a conexão varia dependendo de cada computador então não siga à risca o print abaixo, mas o padrão é sempre esse.

Abra o arquivo
Dados.cs, agora vamos incluir a conexão com o banco de dados em uma variável, ela será usada mais à frente. Coloque o seguinte código:

Agora será necessário criar a camada de entidades, que representam um template da sua tabela, contendo campos que referenciam as colunas da tabela de Clientes (não diretamente, por isso é um template). Existem formas melhores de fazer isso, usando Entity Framework por exemplo (aí sim há referência direta), mas pra fins de simplicidade vamos seguir a linha básica, que é criar as propriedades na mão.
Crie um projeto, igual feito com a DAL e agora dê o nome de
Entities.
Por padrão todo projeto criado é adicionado automaticamente uma classe com o nome Class1.cs, você pode renomear a classe deste projeto para Clientes, já que ela irá representar a tabela de clientes do banco. Quando você manda renomear o Visual Studio dá um aviso perguntando se você deseja realizar a mesma ação para as referências desta classe, clique em Sim (desta forma o nome da classe virtual também é alterado, não só do arquivo físico).
Código para as entidades:

Entidades criadas, agora podemos voltar para a camada de dados e fazer a lógica de conexão ao banco, assim como as entidades irei fazer da forma simples e rápida pra explicar o conceito, depois com boas práticas dá pra melhorar com certeza.
Vamos criar alguns métodos padronizados para fazer de fato a conexão com o banco.
Antes só explicando a ideia, o fluxo é:
• Instanciar a classe de conexão com o banco, no caso como o banco é SQL Server a classe se chama
SqlConnection • Instanciar a classe de command, responsável por receber a conexão criada, a instrução SQL (SELECT, INSERT, DELETE ou UPDATE, no caso é INSERT)
• Adicionar os parâmetros referente aos campos da tabela ao command e
• Finalmente enviar a execução para o banco e aguardar o retorno.
Indo por partes, primeiro o método de conexão:

Note que é passado como parâmetro na instância da conexão a variável criada anteriormente. Depois é necessário criar a variável para a instrução SQL, mas isso será feito na camada de negócios, a Business.
Agora é criado o método de instância e retorno do command, passando como parâmetro a instrução SQL e a conexão criada, acompanhe:

Agora será necessário criar uma instância da classe Clientes, do projeto Entities, criado anteriormente.
Comece digitando private Clientes, vai ser sublinhado o Clientes como erro, nessa palavra aperte CTRL + . (ponto):

O Intellisense do Visual Studio irá identificar que você está tentando chamar uma classe de outro projeto e sugerir na quinta opção pra ser adicionado uma referência ao projeto.
Pode ser que demore muito pra ele adicionar (bugs do VS), caso aconteça cancele a ação e faça o seguinte: clique com o botão direito em
References, dentro do projeto DAL e em
Add Reference. Selecione o projeto Entities e dê OK. Novamente use o Intellisense para ser adicionado o
using Entities; no alto da tela, dessa vez é mais rápido. A instância da classe fica assim:

Agora o método pra inserir os parâmetros ao command:

Este método basicamente usa como parâmetro o command do método anterior e adiciona os parâmetros da instância da classe de Clientes, o @ é utilizado para definir que os campos são passados como parâmetros, na instrução SQL será usado novamente este símbolo.
O último parâmetro do método é para definir se a execução é um UPDATE ou DELETE, se for é passado o ID do registro, pra atualizar ou excluir. Sendo SELECT ou INSERT o ID não precisa ser passado, já que pra consulta irei trazer todos os registros e pra inserção ele por ser chave primária não precisa ser passado, já que é gerado automaticamente.
Finalmente o método para gravar o cliente no banco, utilizando os métodos anteriores:

Basicamente é criada a conexão, chamando os 3 métodos anteriores, enviado o command com todo o conteúdo anterior ao banco e fechado a conexão.
Na parte 2 (que será postada logo em sequencia) iremos começar a fazer o teste prático pra ver se está tudo funcionando como esperado.
Valeu.