Array
(
)

Sequencia com os mesmos numeros usando CSHARP e sqlserver 2012

Pumpkins
   - 19 nov 2015

Olá , estou fazendo um Portifólio Utilizando C# e SQLSERVER 2012.
Criei uma BANCO chamado BDCAD com 4 Tables vai ter 2 Relacionamentos entre ORDEM e PRODUTOS
CREATE TABLE TBprouct(
IDPRODUCT INT PRIMARY KEY identity (1,1),
DESCRI VARCHAR(50) NULL,
PRICE DECIMAL(10,2) NOT NULL,
AMOUNT INT NOT NULL,
DATEOUT VARCHAR(10) NULL,
)
CREATE TABLE TBorder(
IDORDER INT PRIMARY KEY identity (1,1),
SO VARCHAR (4) NOT NULL,
ORDERNO INT NOT NULL REFERENCES TBprouct(IDPRODUCT)
)
Já no C# fiz os Forms com os Campos, na minha Lógica vou preencher o PRODUTO e Depois coloca uma ORDER e o ORDERNO vai relacionar com o ID do Produto para que eu possa fazer depois um FORM de SELECT´s até mesmo para Praticar.
mas ai que vem o problema, que dentro do meu Humilde conhecimento não consigo sair deste ponto, quando eu coloco os Inserts no Comando do SQL da certo, mas
quando eu coloco pelo C# da erro pelo que eu Entendi não segue as sequencias corretas pois o ID do Produto é IDENTITY registrando na sequencia 1,2,3...
e o ORDERNO registra de outra forma que não consigo enchergar no C# .
Vi em uns foruns que só pode um IDENTITY por Table tirei o do ID da Order e coloquei no ORDERNO mas sem sucesso.
Tambem criei um campo no C# para gerar o ORDERNO deixei como propriedade READYONLY = TRUE mas tambem sem sucesso.
Se alguem me ajudar vou agradecer muito galera, abraço..

Marcos P
   - 19 nov 2015

As colunas com IDENTITY ( normalmente as PKs nas tabelas ), NÃO DEVEM ser passadas no comando INSERT, o Sql Server se encarrega de preenchê-las...

Já as chaves estrangeiras, que devem estar relacionadas as chaves primárias nas tabelas de origem, devem ser inseridas normalmente.

Se você necessita incluir um item na tabela principal, para depois usar a chave gerada como referência nas demais tabelas ( como em um mestre-detalhe ), você deve capturar o IDENTITY gerado na tabela principal, para, na sequencia, montar os inserts das outras tabelas, passando esse valor de maneira fixa ( justamente a FK )...

Ficou meio confuso essa explicação, mas acho que dá pra entender.

Pumpkins
   - 19 nov 2015

então Marcos ficou confuso, na ver de não entendi

Pumpkins
   - 19 nov 2015

eu só quero e preciso, que a FK seja o mesmo número da Pk se não eu não vou conseguir ter o vínculo do produto com a a ordem. . . .

Marcos P
   - 20 nov 2015

O valor do IDENTITY gerado na tabela principal pelo Sql Server, deve ser a PK nessa tabela.

Depois de gerado, esse valor deve ser recuperado e atualizado nas tabelas relacionadas como FK.
#Código

Tabela Principal
ID*  Descricao       Data
---- --------------- ------------
   1 AAA             01/01/01
   2 BBB             02/02/02
   3 CCC             03/03/03
   : :               :
1475 FGT             05/08/12       << Aqui ocorre o insert na tabela principal ( IDENTITY + PK )*
----------------------------------     


    Tabela Relacionada
    ID*   ID_Princ Descricao
    ----- -------- --------------------
        1        2 Bolacha Maria
        2        5 Bolacha Água e Sal
        3        1 Biscoito de Polvilho
        :        : :
    23541     1475 Outra Bolacha 
    ------------------------------------
     ( IDENTITY + PK )*


No exemplo acima, quando você gera o IDENTITY 1475 na tabela principal ( de pedido, por exemplo ), é essa chave que deve inserir como FK na tabela relacionada ( de Itens, nesse caso ), que também tem seu IDENTITY ( para fins de controle ).

Repare que ambas tem seus respectivos sequenciais, pois tanto pedidos, quanto itens devem ter linhas únicas com características próprias.

Pumpkins
   - 20 nov 2015

Fiz assim:

CREATE TABLE TBprouct( ---> //tabela Produto//
IDPRODUCT INT PRIMARY KEY identity (1,1),
DESCRI VARCHAR(50) NULL,
PRICE DECIMAL(10,2) NOT NULL,
AMOUNT INT NOT NULL,
DATEOUT VARCHAR(10) NULL,
)

CREATE TABLE TBorder( ---> //tabela Ordem//
IDORDER INT NOT NULL PRIMARY KEY identity REFERENCES TBprouct(IDPRODUCT),
SO VARCHAR (4) NOT NULL,
)

Agora faz o Vinculo inserindo os dados Pelo C#

SELECT SO, DESCRI, DATEOUT FROM TBorder, TBprouct WHERE TBorder.IDORDER = TBprouct.IDPRODUCT

SO DESCRI DATEOUT
1 SO08 TESTE 12/03/2013
2 SO09 TESTE2222 12/03/2013
3 SO10 TESTE000 01/01/2013
4 SO10 SOFT 01/01/2013
5 SO10 SOFT ACESS 01/01/2010

Agora preciso terminar o Login e mais alguns outros problemas no sistema mas ta Rolando...

Vlw Marcos...