(1) Prólogo
Quando o DataSet contém tabelas primárias/subtabelas (tabelas de chave primária/tabelas de chave estrangeira), às vezes as restrições de relacionamento são muito rígidas:
Por exemplo, regras de integridade de banco de dados relacional:
1. Integridade da entidade. A chave primária na tabela de chaves primárias não pode ficar vazia.
2. Integridade referencial O valor da chave estrangeira na tabela de chaves estrangeiras deve corresponder à chave primária na tabela de chaves primárias.
Vazio ou um valor de chave primária na tabela de chave primária.
3. Personalize a integridade.
Se as restrições de relacionamento multitabelas definidas na tabela DataSet forem muito rígidas, use o método Update diretamente.
Ao enviar diversas tabelas em um DataSet juntas, as regras de integridade podem não ser atendidas e pode ocorrer um erro.
Motivo: Por exemplo, configure duas tabelas: CompanyMain (tabela principal da empresa) e CompanySon (subtabela da empresa)
CompanyMain (tabela principal da empresa) armazena principalmente as informações básicas de uma empresa, CompanySon (subtabela da empresa)
Armazena principalmente informações sobre alguns clientes desta empresa E (ID) na tabela principal da empresa e (BelongID) na subtabela.
Estabeleça uma associação, ou seja, um relacionamento de chave primária e estrangeira; uma empresa corresponde a vários clientes, ou seja, um relacionamento ID:BelongID = 1:n.
O ID da tabela principal é um número gerado automaticamente.
Então:
Ao enviar a nova interface da empresa em conjunto, o sistema não cumprirá as “regras de integridade do banco de dados” para atualizar o banco de dados.
Se atualizar primeiro a subtabela e depois atualizar a tabela principal, poderá ser reportado um erro. O motivo é que as informações da empresa na tabela principal ainda não foram inseridas.
Para a tabela do banco de dados, o número da empresa: ID não é gerado e não haverá BelongID correspondente quando a subtabela for atualizada.
Neste momento, se a regra de integridade "A chave estrangeira na tabela de chave estrangeira não é nula" for definida, uma exceção será lançada.
Esta é apenas uma possibilidade de erro, há mais possibilidades de erro, e tais erros são mais prováveis de ocorrer no design distribuído
(
2
).
Regra. Antes de atualizar o DataSet, execute o envio dividido por <table> e <atributo RowState da tabela>
I. Execute o envio dividido por <table> significa:
as tabelas no DataSet não são enviadas juntas, mas enviadas uma de cada vez. Tabela, enviar várias vezes
II. Dividir o envio de acordo com o <atributo RowState da tabela> significa:
dividir uma única tabela no DataSet de acordo com o atributo RowState,
enviar o mesmo RowState uma vez e enviar várias vezes
2. Regrasbaseadas na regra
.
1, primeiro atualize o status de <novo> e <modificado> e, em seguida, atualize <excluído>.
Ou seja: primeiro atualize o valor DataRowState: Adicionado e Modificado e, em seguida, atualize: Excluído
3.
Com base na Regra 1 e na Regra
.2, se DataRowState for adicionado e modificado, a tabela principal será atualizada primeiro e, em seguida, a subtabela será atualizada com base na Regra
1 e na Regra 2, se DataRowState for Excluído, a subtabela será atualizada primeiro e, em seguida, a subtabela será atualizada
.a subtabela
é
atualizada
.
armazenado no DataSet, isso ocorre porque: Update aceita os parâmetros do DataSet e o WebService suporta apenas
//DataSet.Exemplo de código
para operação de serialização
:Suponha que o conjunto de dados a ser atualizado seja: dsCompany (que inclui duas tabelas, a tabela principal). e a subtabela) tabela e armazena
dados a serem atualizados)
//dtCompanyMain armazena informações da tabela principal da empresa, dtCompanySon armazena informações da
subtabela
da empresa
DataTabledtCompanyMail
= ds.Tables["dtCompanyMain"].Clone();
"dtCompanySon"].Clone(); //Separa os dados da subtabela
e armazena outro objeto
DataSet dsAdded= new DataSet()
;
Armazenar o registro de linha editado da tabela principal
DataSet dsDeleted = new DataSet(); //Armazenar o registro de linha excluído da tabela principal
dsAdded
= dtCompanyMain.GetChanges(DataRowState.Added)
; dtCompanyMain.GetChanges (DataRowState.Modified); //Obter o conjunto de registros de linha
editado
na tabela principal dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); //Obtero conjunto de registros de linha
excluído na tabela principal
2. Atualizar o status DataRowState; da tabela principal para: Registros adicionados e modificados.
SqlDataAdapter.Update(dsAdded,"dtCompanyMain"); //Atualiza o conjunto de registros adicionado ao banco de dados
SqlDataAdapter.Update(dsModified,"dtCompanyMain"); para
o banco de dados
3. Atualizar o status do DataRowState da subtabela é: Registros adicionados e modificados
...
//Código omitido, semelhante à atualização da tabela principal 2
4. Atualizar o status do DataRowState da subtabela: Registros excluídos.
.... // Código omitido, semelhante ao 5 abaixo
5. Atualize o status DataRowState da tabela principal para: Registros excluídos
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain"); // Atualize o conjunto de registros modificado para o banco de dados;
Obrigado por ler!