Pergunta

Eu estou usando ADO.NET conjuntos de dados em minhas aplicações de VB. Eu tenho um conjunto de dados digitados com mesa de um dos pais e muitas tabelas filho. Eu quero gerar Identidade Key quando eu inserir dados na tabela pai e, em seguida, atualizar os dados em todas as tabelas filho com a mesma chave (key Como foregin).

Por fim, quero atualizar o conjunto de dados em banco de dados (SQL Server08).

Bem, a coisa acima pode ser possível pela primeira Mesa inserção Pai no banco de dados diretamente, obter a coluna de identidade e do que o uso de para tabelas filho.

Mas eu quero isso como uma operação automática (como LINQ to SQL que cuida de primário e chaves estrangeiras nas datacontext.)

I tal coisa é possível no conjunto de dados que cuida da coluna Autogenerated para tabelas pai e filho?

Obrigado,

ABB

Nenhuma solução correta

Outras dicas

Eu acho que isso deve ser mais óbvio e deve funcionar sem qualquer ajustes. Mas ainda assim, é muito fácil.

A solução tem duas partes:

  1. Criar DataRelation entre tabelas pai e filho e configurá-lo para cascata sobre as atualizações. Dessa forma, sempre que pai Id muda, todas as crianças serão atualizados.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId"))
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade
    
  2. comandos
  3. inserção e atualização Dataset são de duas vias: Se houver quaisquer parâmetros de saída com destino ou quaisquer linhas de dados retornados, eles serão usados ??para atualizar conjunto de dados linha que causou a atualização.

    Este é mais útil para este problema em particular: recebendo colunas Autogenerated voltar para a aplicação. Além de identidade este pode ser, por exemplo, uma coluna timestamp. Mas a identidade é mais útil.

    Tudo o que precisamos fazer é conjunto de comandos de inserção para a identidade retorno. Existem várias maneiras de fazer isso, por exemplo:

    a) usando o procedimento armazenado com parâmetro de saída. Esta é a maneira mais portátil entre os bancos de dados "reais".

    b) A utilização de várias instruções SQL, com último retornando linha inserida. Esta é AFAIK específico para SQL Server, mas a mais simples:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...);
    select * from Parent where Id = SCOPE_IDENTITY();
    

Depois de definir isso, tudo que você precisa fazer é criar linhas pai com Ids que são únicas (dentro único conjunto de dados), mas impossíveis no banco de dados. Os números negativos são geralmente uma boa escolha. Então, quando você salvar conjunto de dados muda para banco de dados, todas as novas linhas pai terá Ids reais do banco de dados.


Nota: Se acontecer de trabalho com o banco de dados sem várias instruções suportes e sem procedimentos armazenados (por exemplo, acesso), você terá de manipulador de eventos de configuração no evento RowUpdated no adaptador de tabela pai. No hanler que você precisa para obter a identidade com o comando select @@IDENTITY.


Alguns links:

Algumas coisas a apontar.

  1. Sim, você definitivamente precisa de relações atribuídas para ambas as tabelas. Você pode verificar a partir editor XSD (clique duas vezes em seu arquivo xsd). Por padrão, a relação é definida como 'única relação', que não tem qualquer tipo de 'regra de actualização'. Editar esta relação entrando em 'editar relação' e selecione 'restrição de chave externa Apenas' ou 'Ambos ~~~' um. E necessidade de set 'Regra Update' como Cascade! 'Excluir regra' é com você.

  2. Agora, quando você usa o ID de uma nova linha da tabela pai (AutoIncrement) para novas linhas da tabela filho como uma chave estrangeira, você tem que adicionar a linha pai na tabela antes de você usar ID da nova linha pai ao redor.

  3. Assim que você chamar Update para a tabela pai usando TableAdapter, novas linhas da tabela da criança associado terá parentID correcta automaticamente.

Os meus trechos de código simples:

'--- Make Parent Row
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow
drOrder.SomeValue = "SomeValue"
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables....
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1")
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2")
'....
'....

'--- Update Parent table first
myTableAdapterTOrder.Update(myDS.TOrder)
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1)
'--- will become real number given by SQL server. And also new rows in child table will
'--- have the updated parentID

'--- Now update child table
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail)

Espero que ajude!

E se você não quiser usar conjuntos de dados e ainda assim obter os IDs atribuídos a criança e obter os ids de modo que você pode atualizar o seu modelo: https://danielwertheim.wordpress.com/2010/10/ 24 / c-lote-identidade-inserções /

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top