Datasets Tables (Reference) provide direct table-level database operations with automatic CRUD functionality and tag mapping. DatasetTable enables:
Tables simplify database interactions by eliminating manual SQL for common operations.
Property | Description | Required |
---|---|---|
Name | Unique table identifier (no spaces) | Yes |
DB | Database connection | Yes |
TableName | Actual database table name | Yes |
WhereCondition | Filter clause for operations | No |
Access | Permission level (Read/Insert/ReadWrite/Unrestricted) | Yes |
Mapping | Tag-to-column assignments | No |
MappingDateTime | Time interpretation (UTC/Local) | No |
Description | Documentation text | No |
Level | Permissions | Use Case |
---|---|---|
Read | SELECT only | Viewing data |
Insert | INSERT only | Adding records |
ReadWrite | SELECT, INSERT, UPDATE, DELETE | Full CRUD |
Unrestricted | All operations + ALTER | Development only |
Filter data using SQL WHERE syntax:
sql
Status = 1
Department = 'Production'
Timestamp > '2024-01-01'
sql
BatchID = {Tag.Production/Batch_ID}
Temperature > {Tag.TankFarm/Tank1/Temp}
Operator = '{Tag.Current_Operator}'
sql
Status IN (1, 2, 3)
AND Department = '{Tag.Department}'
AND Timestamp > {Tag.StartDate}
Column | Tag | Usage |
---|---|---|
ID | Tag.RecordID | Primary key |
Name | Tag.ProductName | Display value |
Count | Tag.Quantity | Numeric data |
Status | Tag.Status | State tracking |
csharp
// Trigger select
@Dataset.Table.ProductionTable.Select = true;
// Get all results
DataTable data = @Dataset.Table.ProductionTable.SelectCommand();
// Check row count
int rows = @Dataset.Table.ProductionTable.RowCount;
csharp
// Set values in mapped tags
@Tag.ProductName = "Widget-A";
@Tag.Quantity = 100;
@Tag.Status = 1;
// Execute insert
@Dataset.Table.ProductionTable.Insert = true;
csharp
// Modify mapped tags
@Tag.Quantity = 150;
@Tag.Status = 2;
// Execute update (uses WhereCondition)
@Dataset.Table.ProductionTable.Update = true;
csharp
// Set identifying values
@Tag.RecordID = 12345;
// Execute delete (uses WhereCondition)
@Dataset.Table.ProductionTable.Delete = true;
csharp
public void BatchUpdate()
{
DataTable table = @Dataset.Table.MyTable.SelectCommand();
foreach(DataRow row in table.Rows)
{
row["Status"] = "Processed";
row["ProcessDate"] = DateTime.Now;
}
// Update all modified rows
@Dataset.Table.MyTable.UpdateCommand(table);
}
csharp
// Change filter at runtime
@Dataset.Table.MyTable.WhereCondition =
string.Format("Date = '{0}'", DateTime.Today);
// Execute with new filter
@Dataset.Table.MyTable.Select = true;
csharp
try
{
@Dataset.BeginTransaction();
@Dataset.Table.Table1.Insert = true;
@Dataset.Table.Table2.Update = true;
@Dataset.CommitTransaction();
}
catch
{
@Dataset.RollbackTransaction();
}
Setting | Behavior | Use Case |
---|---|---|
Local | Convert to local time | User displays |
UTC | Keep as UTC | Server operations |
csharp
// Store as UTC, display as local
@Dataset.Table.EventLog.MappingDateTime = "UTC";
// Tag receives UTC, display converts
@Tag.EventTime = // Automatically converted
xml
<DataGrid DataSource="{Dataset.Table.ProductionTable}" />
csharp
// Fill combo with table data
@Display.ComboBox.DataSource =
@Dataset.Table.LookupTable.SelectCommand();
sql
-- Use indexed columns
ID = {Tag.ID} -- Good if ID is indexed
-- Avoid functions on columns
YEAR(Date) = 2024 -- Bad
Date >= '2024-01-01' AND Date < '2025-01-01' -- Good
csharp
// Instead of multiple single updates
for(int i = 0; i < 100; i++)
{
@Tag.ID = i;
@Dataset.Table.MyTable.Update = true; // Slow
}
// Use batch update
DataTable batch = PrepareData();
@Dataset.Table.MyTable.UpdateCommand(batch); // Fast
No data returned:
Insert/Update fails:
Mapping not working:
Performance issues: