PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → Help Https://multilinkdb.com.br
Help Https://multilinkdb.com.br
Iniciado por Boller, jun., 19 2025 3:02 PM - Sem resposta
Membro registado
4.520 mensagems
Publicado em junho, 19 2025 - 3:02 PM
Below is a structured presentation outline for showcasing the usage of Multilink Database, a powerful solution for data integration across multiple database systems, as provided by WX Soluções. The presentation includes an overview, key features, benefits, and practical code examples in both C# and WLanguage to demonstrate its functionality. The content is based on the provided documents and focuses on real-world applications.

Presentation: Multilink Database - Streamlining Data Integration
Slide 1: Introduction to Multilink Database
• What is Multilink Database?
◦ A robust solution by WX Soluções for seamless integration and management of multiple database systems.
◦ Supports a wide range of databases, including MS SQL Server, Oracle, PostgreSQL, MySQL, Redis, and more.
◦ Designed for developers to simplify connections, execute SQL commands, manage transactions, and handle email notifications.
• Why Multilink?
◦ High performance, scalability, and secure data handling.
◦ Compatible with C#, WLanguage, and various ERP/CRM systems.
◦ User-friendly interface for both novice and experienced developers.
Visual: Logo of Multilink Database (if available) and a diagram showing connectivity to various databases.

Slide 2: Key Features
• Multi-Database Support:
◦ MS SQL Server, Oracle, PostgreSQL, MySQL, MariaDB, SQLite, Redis, and more.
◦ Upcoming support for additional databases.
• Core Functionalities:
◦ Native database connections with secure SSL support.
◦ JSON data serialization for easy data handling.
◦ Transaction management (BEGIN, COMMIT, ROLLBACK).
◦ Email notifications with text/HTML and attachment support.
◦ Integration with platforms like Firebase, Elasticsearch, and Redis.
• Security & Efficiency:
◦ Parameterized queries to prevent SQL injection.
◦ Data compression and optimized performance for large datasets.
Visual: Icons representing supported databases and a checklist of features.

Slide 3: Benefits for Users
• For Developers:
◦ Simplifies database connectivity with a unified API.
◦ Reduces development time with intuitive methods.
◦ Supports both C# and WLanguage for cross-platform development.
• For Businesses:
◦ Scalable solution for growing data needs.
◦ Enhanced security for sensitive data.
◦ Seamless integration with existing ERP/CRM systems.
• Ease of Use:
◦ Intuitive interface for non-technical users.
◦ Comprehensive documentation and community support.
Visual: A comparison table showing Multilink vs. traditional database connectors (e.g., faster integration, broader compatibility).

Slide 4: Getting Started with Multilink
• Installation:
◦ Download the Multilink driver from https://repository.windev.com.
◦ Reference the manual at PC SOFT Forum.
• Dependencies:
◦ For Oracle: Oracle.ManagedDataAccess.dll, Newtonsoft.Json.dll.
◦ For other databases: Relevant native drivers.
• Setup:
◦ Configure connection parameters (server, user, password, database, etc.).
◦ Use provided classes like MSSQL_CLIENT, ORACLE_CLIENT, or POSTGRESQL_CLIENT.
Visual: Screenshot of the download page or a step-by-step setup guide.

Slide 5: Example 1 - Connecting to MS SQL Server
Objective: Connect to an MS SQL Server database, execute a query, and retrieve results in JSON.
C# Example



using Multilink;

class Program
{
static void Main()
{
// Configure connection
MSSQL_CLIENT.CONFIGURE("server_name", "user", "password", "database", true, true);

if (MSSQL_CLIENT.BEGIN_CONNECT())
{
Console.WriteLine("Connected to database!");
// Execute query
MSSQL_CLIENT.SQL_QUERY("SELECT * FROM Clientes WHERE ClienteID = @ClienteID");
MSSQL_CLIENT.SET("ClienteID", 1001);
Console.WriteLine(MSSQL_CLIENT.DATA); // Results in JSON
MSSQL_CLIENT.END_CONNECT();
}
else
{
Console.WriteLine("Error: " + MSSQL_CLIENT.MSG);
}
}
}


WLanguage Example


MultilinkConfigure("server_name", "user", "password", "database", True, True)
IF MultilinkBeginConnect() THEN
Info("Connected to database!")
MultilinkSQLQuery("SELECT * FROM Clientes WHERE ClienteID = @ClienteID")
MultilinkSet("ClienteID", 1001)
Info(MultilinkDATA())
MultilinkEndConnect()
ELSE
Info(MultilinkMSG())
END


Explanation:
• Configures a secure connection to MS SQL Server.
• Executes a parameterized SELECT query to retrieve client data.
• Returns results in JSON format for easy processing.
Visual: Code snippets side-by-side with a diagram of the connection flow.

Slide 6: Example 2 - Transaction Management with PostgreSQL
Objective: Insert a new record into a PostgreSQL database with transaction control to ensure data consistency.


C# Example

using Multilink;

class Program
{
static void Main()
{
POSTGRESQL_CLIENT.CONFIGURE("localhost", 15432, "postgres", "123456", "postgres", "public");

if (POSTGRESQL_CLIENT.BEGIN_CONNECT())
{
if (POSTGRESQL_CLIENT.BEGIN_TRANSACTION())
{
POSTGRESQL_CLIENT.SET("@nome", "John Doe");
POSTGRESQL_CLIENT.SET("@email", "john@example.com");
bool inserted = POSTGRESQL_CLIENT.SQL_EXEC("INSERT INTO Clientes (Nome, Email) VALUES (@nome, @email)");

if (inserted)
{
POSTGRESQL_CLIENT.COMMIT_TRANSACTION(true);
Console.WriteLine("Insert successful!");
}
else
{
POSTGRESQL_CLIENT.ROLLBACK_TRANSACTION();
Console.WriteLine("Error: " + POSTGRESQL_CLIENT.MSG);
}
}
POSTGRESQL_CLIENT.END_CONNECT();
}
else
{
Console.WriteLine("Error: " + POSTGRESQL_CLIENT.MSG);
}
}
}


WLanguage Example


POSTGRESQL_CLIENT.CONFIGURE("localhost", 15432, "postgres", "123456", "postgres", "public")
IF POSTGRESQL_CLIENT.BEGIN_CONNECT() THEN
IF POSTGRESQL_CLIENT.BEGIN_TRANSACTION() THEN
POSTGRESQL_CLIENT.SET("@nome", "John Doe")
POSTGRESQL_CLIENT.SET("@email", "john@example.com")
atualizado is boolean = POSTGRESQL_CLIENT.SQL_EXEC("INSERT INTO Clientes (Nome, Email) VALUES (@nome, @email)")
IF atualizado THEN
POSTGRESQL_CLIENT.COMMIT_TRANSACTION(True)
Info("Insert successful!")
ELSE
POSTGRESQL_CLIENT.ROLLBACK_TRANSACTION()
Info(POSTGRESQL_CLIENT.MSG)
END
END
POSTGRESQL_CLIENT.END_CONNECT()
ELSE
Info(POSTGRESQL_CLIENT.MSG)
END


Explanation:
• Establishes a connection to a PostgreSQL database.
• Uses a transaction to ensure the INSERT operation is atomic.
• Commits the transaction on success or rolls back on failure.
Visual: Flowchart of transaction process (BEGIN → EXEC → COMMIT/ROLLBACK).

Slide 7: Example 3 - Email Notifications
Objective: Update a record and send an email notification to the client using Multilink’s email functionality.

C# Example

using Multilink;

class Program
{
static void Main()
{
MSSQL_CLIENT.CONFIGURE("server", "user", "password", "database", true, true);
if (MSSQL_CLIENT.BEGIN_CONNECT())
{
MSSQL_CLIENT.SET("Status", "Shipped");
MSSQL_CLIENT.SET("PedidoID", 1000);
MSSQL_CLIENT.SQL_EXEC("UPDATE Pedidos SET Status = @Status WHERE PedidoID = @PedidoID");

// Send email notification
EMAIL_CLIENT.CONFIGURE("smtp.server.com", 587, true, "user@server.com", "password");
EMAIL_CLIENT.TEXT_EMAIL("cliente@exemplo.com", "Order Shipped", "Your order has been shipped.");
Console.WriteLine(MSSQL_CLIENT.MSG);
MSSQL_CLIENT.END_CONNECT();
}
else
{
Console.WriteLine("Error: " + MSSQL_CLIENT.MSG);
}
}
}


WLanguage Example

MultilinkConfigure("server", "user", "password", "database", True, True)
IF MultilinkBeginConnect() THEN
MultilinkSet("Status", "Shipped")
MultilinkSet("PedidoID", 1000)
MultilinkSQLExec("UPDATE Pedidos SET Status = @Status WHERE PedidoID = @PedidoID")

MultilinkEmailConfigure("smtp.server.com", 587, True, "user@server.com", "password")
MultilinkEmailText("cliente@exemplo.com", "Order Shipped", "Your order has been shipped.")
Info(MultilinkMSG())
MultilinkEndConnect()
ELSE
Info(MultilinkMSG())
END


Explanation:
• Updates the status of an order in the database.
• Sends a text-based email notification to the client.
• Demonstrates Multilink’s ability to handle both database operations and email communication.
Visual: Diagram showing database update followed by email dispatch.

Slide 8: Example 4 - Oracle Database Connection
Objective: Connect to an Oracle database using SID and retrieve data.

C# Example

using Multilink;

class Program
{
static void Main()
{
ORACLE_CLIENT.ConfigureWithSID("myServer", "1521", "mySID", "myUser", "myPassword");

if (ORACLE_CLIENT.BEGIN_CONNECT())
{
Console.WriteLine("Connected to Oracle database!");
ORACLE_CLIENT.SQL_QUERY("SELECT * FROM Employees WHERE DepartmentID = :deptID");
ORACLE_CLIENT.SET_PARAM("deptID", "10");
Console.WriteLine(ORACLE_CLIENT.DATA); // Results in JSON
ORACLE_CLIENT.END_CONNECT();
}
else
{
Console.WriteLine("Error: " + ORACLE_CLIENT.MSG);
}
}
}


WLanguage Example

ConfigureWithSID("myServer", "1521", "mySID", "myUser", "myPassword")
IF ORACLE_CLIENT:BEGIN_CONNECT() THEN
Info("Connected to Oracle database!")
ORACLE_CLIENT:SQL_QUERY("SELECT * FROM Employees WHERE DepartmentID = :deptID")
ORACLE_CLIENT:SET_PARAM("deptID", "10")
Info(ORACLE_CLIENT.DATA)
ORACLE_CLIENT:END_CONNECT()
ELSE
Info(ORACLE_CLIENT.MSG)
END


Explanation:
• Configures a connection to an Oracle database using SID.
• Executes a parameterized query to retrieve employee data.
• Returns results in JSON format.
Visual: Oracle logo with a connection flow diagram.

Slide 9: Example 5 - Complex Transaction with Multiple Tables
Objective: Insert a client, order, items, and taxes in a single transaction.

C# Example

using Multilink;

class Program
{
static void Main()
{
MSSQL_CLIENT.CONFIGURE("server", "user", "password", "database", true, true);
if (MSSQL_CLIENT.BEGIN_CONNECT() && MSSQL_CLIENT.BEGIN_TRANSACTION())
{
try
{
// Insert client
MSSQL_CLIENT.SET("Nome", "Cliente Exemplo");
MSSQL_CLIENT.SET("Endereco", "Rua Exemplo, 123");
if (!MSSQL_CLIENT.SQL_EXEC("INSERT INTO Clientes (Nome, Endereco) VALUES (@Nome, @Endereco)"))
throw new Exception(MSSQL_CLIENT.MSG);

MSSQL_CLIENT.SQL_QUERY("SELECT SCOPE_IDENTITY() AS ClienteID");
int clienteID = Convert.ToInt32(MSSQL_CLIENT.DATA);

// Insert order
MSSQL_CLIENT.SET("ClienteID", clienteID);
MSSQL_CLIENT.SET("DataPedido", DateTime.Now);
if (!MSSQL_CLIENT.SQL_EXEC("INSERT INTO Pedidos (ClienteID, DataPedido) VALUES (@ClienteID, @DataPedido)"))
throw new Exception(MSSQL_CLIENT.MSG);

MSSQL_CLIENT.SQL_QUERY("SELECT SCOPE_IDENTITY() AS PedidoID");
int pedidoID = Convert.ToInt32(MSSQL_CLIENT.DATA);

// Insert items
MSSQL_CLIENT.SET("PedidoID", pedidoID);
MSSQL_CLIENT.SET("ProdutoID1", 101);
MSSQL_CLIENT.SET("Quantidade1", 2);
MSSQL_CLIENT.SET("ProdutoID2", 102);
MSSQL_CLIENT.SET("Quantidade2", 5);
if (!MSSQL_CLIENT.SQL_EXEC("INSERT INTO Pedidos_Itens (PedidoID, ProdutoID, Quantidade) VALUES (@PedidoID, @ProdutoID1, @Quantidade1), (@PedidoID, @ProdutoID2, @Quantidade2)"))
throw new Exception(MSSQL_CLIENT.MSG);

// Insert taxes
MSSQL_CLIENT.SET("ImpostoID1", 1);
MSSQL_CLIENT.SET("Valor1", 50);
MSSQL_CLIENT.SET("ImpostoID2", 2);
MSSQL_CLIENT.SET("Valor2", 30);
if (!MSSQL_CLIENT.SQL_EXEC("INSERT INTO Impostos (PedidoID, ImpostoID, Valor) VALUES (@PedidoID, @ImpostoID1, @Valor1), (@PedidoID, @ImpostoID2, @Valor2)"))
throw new Exception(MSSQL_CLIENT.MSG);

MSSQL_CLIENT.COMMIT_TRANSACTION();
Console.WriteLine("Transaction successful!");
}
catch (Exception ex)
{
MSSQL_CLIENT.ROLLBACK_TRANSACTION();
Console.WriteLine("Error: " + ex.Message);
}
MSSQL_CLIENT.END_CONNECT();
}
}
}


WLanguage Example

MultilinkConfigure("server", "user", "password", "database", True, True)
IF MultilinkBeginConnect() AND MultilinkBeginTransaction() THEN
clienteQuery is string = "INSERT INTO Clientes (Nome, Endereco) VALUES (@Nome, @Endereco)"
MultilinkSet("Nome", "Cliente Exemplo")
MultilinkSet("Endereco", "Rua Exemplo, 123")
IF NOT MultilinkSQLExec(clienteQuery) THEN
ERROR("Erro ao inserir cliente: " + MultilinkMSG())
END

MultilinkSQLQuery("SELECT SCOPE_IDENTITY() AS ClienteID")
clienteID is int = Num(MultilinkDATA())

pedidoQuery is string = "INSERT INTO Pedidos (ClienteID, DataPedido) VALUES (@ClienteID, @DataPedido)"
MultilinkSet("ClienteID", clienteID)
MultilinkSet("DataPedido", Today())
IF NOT MultilinkSQLExec(pedidoQuery) THEN
ERROR("Erro ao inserir pedido: " + MultilinkMSG())
END

MultilinkSQLQuery("SELECT SCOPE_IDENTITY() AS PedidoID")
pedidoID is int = Num(MultilinkDATA())

itensQuery is string = "INSERT INTO Pedidos_Itens (PedidoID, ProdutoID, Quantidade) VALUES (@PedidoID, @ProdutoID1, @Quantidade1), (@PedidoID, @ProdutoID2, @Quantidade2)"
MultilinkSet("PedidoID", pedidoID)
MultilinkSet("ProdutoID1", 101)
MultilinkSet("Quantidade1", 2)
MultilinkSet("ProdutoID2", 102)
MultilinkSet("Quantidade2", 5)
IF NOT MultilinkSQLExec(itensQuery) THEN
ERROR("Erro ao inserir itens: " + MultilinkMSG())
END

impostosQuery is string = "INSERT INTO Impostos (PedidoID, ImpostoID, Valor) VALUES (@PedidoID, @ImpostoID1, @Valor1), (@PedidoID, @ImpostoID2, @Valor2)"
MultilinkSet("ImpostoID1", 1)
MultilinkSet("Valor1", 50)
MultilinkSet("ImpostoID2", 2)
MultilinkSet("Valor2", 30)
IF NOT MultilinkSQLExec(impostosQuery) THEN
ERROR("Erro ao inserir impostos: " + MultilinkMSG())
END

MultilinkCommitTransaction()
Info("Transaction successful!")
ELSE
MultilinkRollbackTransaction()
Info("Erro ao conectar ou iniciar transação: " + MultilinkMSG())
END
MultilinkEndConnect()


Explanation:
• Performs a complex transaction involving multiple tables (Clientes, Pedidos, Pedidos_Itens, Impostos).
• Uses batch inserts for efficiency.
• Ensures data consistency with transaction management.
Visual: ER diagram of the tables involved and a transaction flowchart.

Slide 10: Real-World Applications
• E-Commerce:
◦ Manage orders, customers, and inventory across multiple databases.
◦ Send automated email notifications for order updates.
• Enterprise Systems:
◦ Integrate with ERP/CRM systems for unified data management.
◦ Handle large-scale transactions with performance optimization.
• Reporting:
◦ Generate JSON-based reports for analytics and dashboards.
◦ Export data in CSV/XML formats for external use.
Visual: Case study examples or screenshots of a dashboard using Multilink data.

Slide 11: Best Practices
• Security:
◦ Always use parameterized queries to prevent SQL injection.
◦ Enable SSL for secure connections.
• Performance:
◦ Use batch operations for multiple inserts/updates.
◦ Leverage SQL_QUERY_SEQ for large datasets to reduce memory usage.
• Connection Management:
◦ Always close connections with END_CONNECT to prevent database locks.
◦ Implement proper transaction handling to ensure data integrity.
• Error Handling:
◦ Check MSG property for detailed error messages.
◦ Use try-catch blocks in C# or conditional checks in WLanguage.
Visual: Checklist of best practices with icons.

Slide 12: Resources and Support
• Official Website: https://multilinkdb.com.br
• Download: Multilink Driver
• Manual: PC SOFT Forum
• Community Support:
◦ Engage with the PC SOFT community for tips and troubleshooting.
◦ Contact Adriano José Boller (adrianoboller@gmail.com, +55 (41) 99949-1800) for official support.
Visual: Screenshots of the website and forum, plus contact details.

Slide 13: Conclusion
• Why Choose Multilink?
◦ Simplifies multi-database integration with a unified, secure, and efficient API.
◦ Supports a wide range of databases and development environments.
◦ Ideal for businesses seeking scalability and developers needing flexibility.
• Next Steps:
◦ Download and try Multilink for your next project.
◦ Explore the manual and community resources for advanced use cases.
◦ Contact WX Soluções for tailored support.
Visual: Call-to-action graphic with a “Get Started” button linking to the download page.

Slide 14: Q&A
• Open floor for questions.
• Provide live demo if feasible (e.g., running one of the code examples).
Visual: Interactive Q&A slide with a prompt like “Ask Away!”.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/