Comparando RPG com C# e SQL
-
26-09-2019 - |
Pergunta
Em um programa de RPG (um dos idiomas da IBM no AS/400), posso "fazer a corrente" para um arquivo para ver se existe um registro (digamos, um determinado registro do cliente) no arquivo. Se isso acontecer, posso atualizar esse registro instantaneamente com novos dados. Se o registro não existir, posso escrever um novo registro. O código seria assim:
Customer Chain CustFile 71 ;turn on indicator 71 if not found
if *in71 ;if 71 is "on"
eval CustID = Customer;
eval CustCredit = 10000;
write CustRecord
else ;71 not on, record found.
CustCredit = 10000;
update CustRecord
endif
Não estou familiarizado com o SQL/C#, estou me perguntando se existe uma maneira de fazer uma recuperação aleatória de um arquivo (que é o que a "cadeia" faz no RPG). Basicamente, quero ver se existe um registro. Se isso acontecer, atualize o registro com algumas novas informações. Caso contrário, quero escrever um novo registro. Tenho certeza de que é possível, mas não tenho certeza de como fazer isso. Qualquer conselho seria muito apreciado.
Solução
O RPG possui conectividade intrínseca com as tabelas de banco de dados no sistema. Isso facilita escrever operações tão sucintas.
C#, por outro lado, exige que você implemente suas próprias rotinas de banco de dados (ou use uma estrutura como o LINQ).
Se eu estivesse fazendo isso, criaria uma classe responsável pela manipulação do banco de dados usando os objetos System.oledb.
Alguns métodos podem ser (ideia geral, não código real):
public boolean CheckExists(string TableName, string ColumnName, int ID) {
//Connect to database
// Create Command with query "SELECT COUNT(1) FROM " + TableName.Replace(";","") + " WHERE " + ColumnName.Replace(";","") + " = " + ID
Return int.Parse(myQuery.ExecuteScalar) > 0
//disconnect
}
public boolean UpdateCredit(int CustID, int newCredit) {
//Connect to database
// Create Command with query "UPDATE CustTable SET CustCredit = " + newCredit.ToString() + " WHERE = CustId = " + CustID
myQuery.ExecuteNonQuery
//disconnect
}
public boolean CreateCredit(int CustID, int newCredit) {
//Connect to database
// Create Command with query "INSERT INTO CustTable (CustID, CustCredit) VALUES (" + CustId.ToString + ", " + newCredit.ToString + ")"
myQuery.ExecuteNonQuery
//disconnect
}
Então o seu principal método do mundo leu algo como
If (CheckExists("CustTable", "CustId", CustID)) {
UpdateCredit(CustID, 10000)
} else {
CreateCredit(CustId, 10000)
}