Dataset Queries (Reference) enable SQL-based data operations including SELECT, INSERT, UPDATE, DELETE statements and stored procedure execution. Dataset Queries provide:
Queries connect to configured DBs and can embed tag values dynamically in SQL statements.
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 |
sql
SELECT * FROM Production WHERE Status = 1
UPDATE Inventory SET Count = 100 WHERE ID = 5
DELETE FROM TempData WHERE Age > 30
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}}
Default format: yyyy-MM-dd HH:mm:ss
(ISO 8601)
sql
SELECT * FROM History
WHERE Timestamp > '{{Tag.StartDate}}'
Configure result set mapping to tags:
Column | Tag | Direction |
---|---|---|
ProductID | Tag.Production_ID | Output |
Count | Tag.Production_Count | Output |
BatchID | Tag.Batch_ID | Input/Output |
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}} OUTPUT
Use @null@
syntax for null values:
sql
EXEC UpdateBatch @ID = {{Tag.BatchID}}, @Notes = @null@
Trigger: Property changes (Select, Insert, Update, Delete)
Flow:
Advantages:
Use Cases:
Trigger: Method calls (SelectCommand, ExecuteCommand)
Flow:
Advantages:
Risks:
Use Cases:
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);
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";
}
}
Monitor query execution with these properties:
@Dataset.Query.Query1.Error // Last error message
@Dataset.Query.Query1.ExecutionTime // Query duration
@Dataset.Query.Query1.RowCount // Result size
Built-in SQL editor features:
Access via:
Graphical query construction:
csharp
// Test mode execution
@Dataset.Query.TestQuery.SqlStatement =
"SELECT COUNT(*) FROM Production";
@Dataset.Query.TestQuery.Select = true;
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)
csharp
// Good: Asynchronous from screen
@Dataset.Table.MyTable.SelectCommand = "SELECT * FROM Data";
// Bad: Synchronous from screen (blocks UI)
@Dataset.Table.MyTable.SelectCommandWithStatus();
sql
-- Use transactions
BEGIN TRANSACTION
UPDATE Table1...
UPDATE Table2...
COMMIT
? 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
Query not executing:
Slow queries:
Mapping issues:
Thread blocking: