The following CRUD operations can be done using the data access API. Let's say we have a table called “data” with the fields id (Unique identifier Primary key) and name (varchar (200)).

Here's what the data within the table looks like:

To use the Data Access API, use the namespace FlowWright.DataAccess as shown below:

Let's select all the users from the data table
string connStr = "Data Source=COBRA;Initial Catalog=FlowWright10;User ID=sa;Password=xxx";
string sSQL = "Select * from data";
DataTable oDT = FWDataAccess.GetDataTable(connStr, sSQL, out string sError);
After running the above code, the resulting data table has the following data:

Insert new record
You can insert a record using 2 ways, using SQL or a built-in function, let's do the SQL method first:
sSQL = "INSERT INTO data(id, name) VALUES(?,?)";
OrderedDictionary oParms = new();
oParms["id"] = Guid.NewGuid().ToString();
oParms["name"] = "Jackson";
bool status = FWDataAccess.NonQuery(connStr, sSQL, out sError, oParms);
Note: The above code uses (?) parameterized SQL query to avoid SQL injection issues.
You can also use the following method to insert also:
Hashtable oParms = new();
oParms["id"] = Guid.NewGuid().ToString();
oParms["name"] = "Jackson";
bool status = FWDataAccess.InsertRecord(connStr, "data", oParms);
Read a record
Read a record using an SQL statement
sSQL = "Select * from Data Where name LIKE 'Bob'";
DataTable oDT = FWDataAccess.GetDataTable(connStr, sSQL, out sError);
Read a single value using a type
string name = FWDataAccess.GetScalarValue<string>(connStr, sSQL, out sError, oParms);
Update a record
You can update a record using the following parameterized SQL query:
OrderedDictionary oParms = new();
oParms["name"] = "Dolly";
oParms["id"] = "e20cb694-a754-4448-8301-70cdf0d02711";
sSQL = "Update data set name=? where id like ?";
bool status = FWDataAccess.NonQuery(connStr, sSQL, out sError, oParms);
You can also use the direct methods to update, as shown below:
Hashtable oParms = new();
oParms["name"] = "Dolly";
oParms["id"] = "e20cb694-a754-4448-8301-70cdf0d02711";
FWDataAccess.UpdateRecord(connStr, "data", oParms, "id");
Delete a record
Delete a record using SQL parameterized query:
OrderedDictionary oParms = new();
oParms["id"] = "e20cb694-a754-4448-8301-70cdf0d02711";
sSQL = "Delete From data Where id=?";
bool status = FWDataAccess.NonQuery(connStr, sSQL, out sError, oParms);
Delete a record using the API method:
FWDataAccess.DeleteRecord(connStr, "data", "name", "bob");
Upsert a record
The Upsert method will insert the data if the record does not exist; otherwise, it will update the existing record
Hashtable oParms = new();
oParms["id"] = "e20cb694-a754-4448-8301-70cdf0d02711";
oParms["name"] = "Dale";
bool status = FWDataAccess.UpsertRecord(connStr, "data", oParms, "id");
Transactions
Multiple SQL calls can be called within a transaction, committed if successful, and rolled back if unsuccessful. The following code shows how to perform transactions:
OrderedDictionary oParms = new();
oParms["id"] = Guid.NewGuid().ToString();
oParms["name"] = "Dale";
sSQL = "INSERT INTO data(id, name) VALUES(?,?)";
OrderedDictionary oParms2 = new();
oParms2["id"] = Guid.NewGuid().ToString();
oParms2["name"] = "Jen";
FWDataAccess oDA = new FWDataAccess(connStr);
oDA.BeginTransaction();
try
{
oDA.NonQuery(sSQL, oParms);
oDA.NonQuery(sSQL, oParms2);
oDA.CommitTransaction();
}
catch
{
oDA.RollbackTransaction();
}
oDA.Disconnect();