zplCloud Blog
SQL Server como fonte de dados: o ciclo de exportação, eliminado
A string de conexão nunca sai da sua máquina. Filtros, ordenação e paginação rodam como T-SQL parametrizado no seu servidor.
O ciclo de exportação, e por que ele quebra
Os dados das etiquetas vivem em um ERP, um WMS ou um banco Azure SQL. O fluxo usual é exportar para CSV, corrigir os nomes das colunas, carregar, imprimir - e repetir amanhã, porque o CSV já está obsoleto.
O data hub zplCloud elimina a exportação. Um agente CLI dentro da sua rede detém a string de conexão SQL Server, a plataforma envia a ele uma descrição de consulta, e apenas as linhas de resultado voltam. O banco nunca é exposto à internet e as credenciais nunca são armazenadas no cloud.
Este post é a mecânica exata: o que roda onde, qual SQL é gerado e quais são os limites rígidos.
Arquitetura em um parágrafo
zplcloud proxy abre uma conexão TLS de saída para api.zplcloud.com (SignalR). Sem porta de entrada, sem regra NAT, sem VPN. Quando você abre uma fonte de dados na plataforma, o backend envia ao agente um objeto de solicitação - consulta base, filtro, ordenação, offset, limite - e o agente o transforma em T-SQL, executa contra seu SQL Server com seu usuário de banco, e retorna as linhas. A string de conexão existe apenas na memória do processo do agente e na sua configuração local.
Passo 1 - inicie o agente com um ou mais servidores
# Vários flags --sql são permitidos; o NOME é o que você escolhe na plataforma.
zplcloud proxy --agent "Lager" \
--sql PROD="Server=127.0.0.1;Database=erp;User Id=zplcloud;Password=…;Encrypt=True;TrustServerCertificate=True" \
--sql WAREHOUSE="Server=sql-wh.internal.lan,1433;Database=logistik;User Id=zplcloud;Password=…;Encrypt=True;TrustServerCertificate=True"
Equivalente sem colocar segredos na linha de comando (eles cairiam no histórico do shell):
# Windows PowerShell - uma variável por servidor, nome no meio
$env:ZPLCLOUD_SQL_PROD_CONNECTION = "Server=127.0.0.1;Database=erp;User Id=zplcloud;Password=…;Encrypt=True;TrustServerCertificate=True"
zplcloud proxy --agent "Lager"
O banner de inicialização lista o que encontrou: SQL servers: PROD, WAREHOUSE. A autenticação na plataforma usa --api-key <key> ou ZPLCLOUD_API_KEY.
Persista para operação não assistida:
- Windows:
setx ZPLCLOUD_SQL_PROD_CONNECTION "…", ouzplcloud proxy --agent "Lager" --service-install --api-key sk_zplcloud_… - Linux/Raspberry Pi: mesmo flag
--service-install; ele escreve uma unidade systemdzplcloud-agent.servicecomRestart=always - Arquivo em vez de env:
sqlservers.jsonao lado do binário ou em~/.zplcloud/, formato{ "sqlServers": { "PROD": "Server=…" } } - Docker:
ZPLCLOUD_SQL_PROD_CONNECTIONnodocker-compose.agent.yml
Notas sobre strings de conexão que custam uma hora às pessoas
Encrypt=True;TrustServerCertificate=Trueé o par pragmático para um servidor interno com certificado autoassinado. RemovaTrustServerCertificatequando tiver um certificado real.- Uma instância nomeada precisa de
Server=host\INSTANCE; uma porta não padrão éServer=host,1433- vírgula, não dois pontos. - Use um login SQL dedicado com
SELECTexatamente nas tabelas de que as etiquetas precisam. O agente executa tudo como esse usuário, então o banco é o limite de permissões - não a plataforma.
Passo 2 - crie a fonte de dados
Em Fontes de dados, o agente em execução aparece sob Remote SQL Server com um chip por nome configurado. Clicar em um chip pré-preenche o formulário.
| Campo | Valor |
|---|---|
| Nome | Lager-Artikel |
| Tipo | SQL Server |
| Servidor | PROD (o nome de --sql PROD=…) |
| Consulta | SELECT ean, name, price FROM artikel |
Testar executa SELECT 1 e retorna servidor · banco de dados. Campos lê os metadados das colunas via SELECT TOP 1 * com CommandBehavior.SchemaOnly - ele busca o esquema sem puxar dados. Se uma consulta muito aninhada não retornar esquema, o agente tenta novamente uma vez com SingleRow.
Passo 3 - o que o agente realmente executa
Sua consulta base é envolvida como subconsulta. Filtro, ordenação e paginação são adicionados pelo agente:
SELECT * FROM ( SELECT ean, name, price FROM artikel ) AS ds
WHERE ean LIKE @p0
ORDER BY name
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
Três coisas merecem ser lidas duas vezes:
1. Valores são parâmetros, nunca concatenação de strings. O construtor de filtros emite @p0, @p1, … e vincula os valores via SqlCommand.Parameters. Não há nenhum lugar onde um valor digitado pelo usuário se torna texto SQL.
2. A paginação é nativa. limit 10 vira FETCH NEXT 10 ROWS ONLY; o SQL Server faz o trabalho e retorna dez linhas pelo fio, não um milhão.
3. A contagem de linhas é uma consulta separada. Quando você pede o total, o agente executa SELECT COUNT(*) FROM (<base>) AS ds com o mesmo WHERE e os mesmos parâmetros.
Os limites rígidos (do código-fonte do agente)
| Limite | Valor | Onde se aplica |
|---|---|---|
| Linhas por solicitação | 1000 (RowCap) | limit é limitado a 1…1000; padrão quando não definido: 100 |
| Timeout de comando | 15 s | teste, describe, consulta e contagem |
| Tipo de instrução | somente SELECT | a consulta base é validada; instruções múltiplas são rejeitadas |
| Colunas de ordenação/filtro | identificadores validados | não passadas como SQL livre |
Se você precisar de mais de 1000 linhas em uma visão - impressão em lote, um catálogo completo - a plataforma pagina pelo conjunto de resultados com OFFSET crescente. Cada página é sua própria solicitação de 1000 linhas contra seu servidor, então a memória permanece plana independentemente do total.
Um timeout de 15 segundos é deliberado. Se sua consulta base não consegue responder em 15 segundos, ela pertence a uma view indexada ou a uma tabela com o índice certo, não a uma fonte de dados de etiquetas.
Passo 4 - use no designer e nas Print Views
- Designer → aba Dados Teste → Fonte de dados: escolha a fonte de dados e pressione Carregar. Os bindings de campos são renderizados com linhas reais em vez de texto de espaço reservado, então você vê os comprimentos reais dos campos antes que qualquer coisa chegue a uma impressora.
- Print Views → configuração → Fonte de dados (data hub): a visualização da visão e sua impressão usam a consulta ao vivo. O operador vê dados atuais; ninguém recarrega um CSV.
Modos de falha e o que significam
| Sintoma | Causa |
|---|---|
| O agente inicia, mas nenhum chip aparece | nome --sql ausente, ou o agente autenticou com uma chave de outro workspace |
Testar falha instantaneamente | string de conexão errada (instância, porta, credenciais) - o erro é repassado do SQL Server |
Testar trava e depois falha | timeout de 15 s: servidor inacessível da máquina do agente, ou um firewall descarta o pacote silenciosamente |
Campos não retorna nada | a consulta base está aninhada demais para SchemaOnly; o agente cai para SingleRow, que precisa de pelo menos uma linha existente |
| A consulta funciona, a Print View está vazia | a visão está vinculada a outra fonte de dados, ou o filtro exclui todas as linhas |
Plano
O data hub (fontes de dados SQL Server e MongoDB através do agente CLI) faz parte do plano Pro. Detalhes na página de preços.