Dataset Queries (Reference) enable SQL-based data operations including SELECT, INSERT, UPDATE, DELETE statements and stored procedure execution. Dataset Queries provide:
- SQL statement execution
- Real-time parameter embedding
- Tag-to-column mapping
- Stored procedure support
- Synchronous/asynchronous execution
- Result set visualization
Queries connect to configured DBs and can embed tag values dynamically in SQL statements.
Configuration Properties
| Property | Description | Required |
|---|---|---|
| Name | Unique query identifier (no spaces) | Yes |
| DB | Target database connection | Yes |
| SqlStatement | SQL query or stored procedure | Yes |
| Mapping | Tag-to-column assignments | No |
| MappingDateTime | Time interpretation (UTC/Local) | No |
| Description | Documentation text | No |
Creating Queries
- Navigate to Datasets → Queries
- Click Plus icon
- Configure:
- Name: Unique identifier (use underscores)
- DB: Select database
- Description: Documentation
- Click OK
- Double-click SqlStatement to open editor
SQL Statement Configuration
Static Queries
sql
SELECT * FROM Production WHERE Status = 1
UPDATE Inventory SET Count = 100 WHERE ID = 5
DELETE FROM TempData WHERE Age > 30Dynamic Parameters
Embed tag values using double curly braces:
sql
SELECT * FROM Production
WHERE BatchID = {{Tag.Production/Batch_ID}}
AND Temperature > {{Tag.TankFarm/Tank1/Temp}}
AND Status = {{Tag.Equipment/MotorRunning}}DateTime Format
Default format: yyyy-MM-dd HH:mm:ss (ISO 8601)
sql
SELECT * FROM History
WHERE Timestamp > '{{Tag.StartDate}}'Tag Mapping
Configure result set mapping to tags:
- Click Mapping ellipsis (...)
- Assign columns to tags:
| Column | Tag | Direction |
|---|---|---|
| ProductID | Tag.Production_ID | Output |
| Count | Tag.Production_Count | Output |
| BatchID | Tag.Batch_ID | Input/Output |
Mapping Options
- Output: Column value → Tag
- Input: Tag → Query parameter
- Input/Output: Bidirectional
Stored Procedures
Configuration
sql
-- Simple execution
EXEC GetProductionData @Date = '{{Tag.QueryDate}}'
-- With output parameters
EXEC TestOutput
@return_Value = {{Tag.ReturnValue}} RETURN_VALUE,
@vcrPrefix = @null@,
@intNextNumber = {{Tag.NextNumber}} OUTPUT,
@vcrFullLicense = {{Tag.NextLicense}} OUTPUTNull Parameters
Use @null@ syntax for null values:
sql
EXEC UpdateBatch @ID = {{Tag.BatchID}}, @Notes = @null@Execution Methods
Asynchronous Execution (Default)
Trigger: Property changes (Select, Insert, Update, Delete)
Flow:
- Property triggered (screen/script)
- Request propagated to server
- Dataset Module receives request
- TServer executes database operation
- Results returned to Dataset Module
- Tags mapped and updated
- Execution continues in parallel
Advantages:
- Non-blocking operation
- Better performance
- Prevents UI freezing
- Allows parallel operations
Use Cases:
- Display queries
- Background updates
- Report generation
- Real-time monitoring
Synchronous Execution
Trigger: Method calls (SelectCommand, ExecuteCommand)
Flow:
- Method called
- Execution PAUSES
- Dataset Module calls TServer
- Database operation completes
- Results returned
- Tags mapped
- Execution RESUMES
Advantages:
- Guaranteed completion
- Sequential logic
- Immediate results
- Transaction support
Risks:
- Can freeze UI if called from screen
- Blocks thread execution
- Performance bottlenecks
Use Cases:
- Script tasks
- Sequential operations
- Transaction requirements
- Data validation
Code Examples
Asynchronous (Properties):
csharp
// Trigger query execution
@Dataset.Query.MyQuery.SqlStatement = "SELECT * FROM Data";
@Dataset.Query.MyQuery.Select = true;
// Check status
if (@Dataset.Query.MyQuery.ExecutionStatus == "OK")
{
// Process results
}Synchronous (Methods):
csharp
// Execute and wait for results
DataTable result = @Dataset.Query.MyQuery.SelectCommand();
// With status check
string status;
@Dataset.Query.MyQuery.ExecuteCommandWithStatus(out status);Script Example
csharp
public void ExecuteQuery()
{
// Build dynamic query
string sql = string.Format(
"SELECT * FROM Production WHERE Line = '{0}'",
@Tag.ProductionLine
);
@Dataset.Query.ProductionQuery.SqlStatement = sql;
// Execute with status
string status;
@Dataset.Query.ProductionQuery.ExecuteCommandWithStatus(out status);
if (status == "OK")
{
@Tag.QueryResult = "Success";
}
}Diagnostic Properties
Monitor query execution with these properties:
@Dataset.Query.Query1.Error // Last error message
@Dataset.Query.Query1.ExecutionTime // Query duration
@Dataset.Query.Query1.RowCount // Result sizeQuery Editor
Built-in SQL editor features:
- Syntax highlighting
- Auto-completion
- Schema browsing
- Parameter validation
Access via:
- Double-click SqlStatement column
- Right-click → Edit Query
Visual Query Builder
Graphical query construction:
- Navigate to Datasets → DBs
- Click Visual Query Builder
- Drag tables to canvas
- Connect fields visually
- Generate SQL automatically
Testing Queries
Data Explorer
- Go to Data Explorer → SQL Queries
- Select query from list
- Set parameter values
- Click Execute
- Review results in grid
Runtime Testing
csharp
// Test mode execution
@Dataset.Query.TestQuery.SqlStatement =
"SELECT COUNT(*) FROM Production";
@Dataset.Query.TestQuery.Select = true;Performance Optimization
Query Optimization
sql
-- Use parameters to prevent recompilation
SELECT * FROM Table WHERE ID = @id
-- Limit result sets
SELECT TOP 100 * FROM LargeTable
-- Use appropriate indexes
CREATE INDEX idx_timestamp ON Data(Timestamp)Asynchronous Patterns
csharp
// Good: Asynchronous from screen
@Dataset.Table.MyTable.SelectCommand = "SELECT * FROM Data";
// Bad: Synchronous from screen (blocks UI)
@Dataset.Table.MyTable.SelectCommandWithStatus();Batch Operations
- Group multiple operations
- Use transactions for consistency
- Minimize round trips
sql
-- Use transactions
BEGIN TRANSACTION
UPDATE Table1...
UPDATE Table2...
COMMITBest Practices Checklist
? Use parameters - Prevent SQL injection ? Name meaningfully - ProductionData not Query1 ? Document queries - Use description field ? Test thoroughly - Use Data Explorer ? Handle errors - Check execution status ? Optimize performance - Index, limit results ? Use appropriate execution - Async for UI ? Prefer asynchronous - Use properties over methods ? Avoid UI blocking - No synchronous calls from screens
Troubleshooting
Query not executing:
- Verify DB connection
- Check SQL syntax
- Confirm tag names
- Review permissions
Slow queries:
- Check execution plan
- Add appropriate indexes
- Reduce result set size
- Use asynchronous execution
Mapping issues:
- Verify column names
- Check tag types
- Review data types
- Confirm tag existence
- Verify domain selection
- Review mapping configuration
- Confirm execution context
Thread blocking:
- Avoid synchronous in UI
- Use Script Tasks
- Implement async patterns
- Monitor thread pool
Related Documentation
- Datasets DBs (Reference)
- Datasets Tables (Reference)
- Datasets Engine (Reference)
In this section...