It is often necessary to import data from and export data to a SQL Server database. There are multiple times at which this import and export may be useful. For example, when a form opens on a Windows device, it may be useful to query a data source for picklist items. A similar use case is through the use of the ServerContacted API in iOS/Android targeted forms. Many forms may also wish to export their data to a SQL Server as a customized data export.
The examples below (and attached) are designed to show the concept of how to connect to a SQL server for data import/export through .NET script code.
First, let's examine how to query data. In the attached example, a field is used as a filter to query from a single table as so:
Function ImportFromSQL() As Boolean Using myConnection As New System.Data.SqlClient.SqlConnection(DBCONNECTION_STRING) ' Open a DB connection Try If (myConnection Is Nothing) Then _SQLStatus.Value = "Failed to open database." Return False End If myConnection.Open() Catch ex As System.Exception _SQLStatus.Value = ex.Message Return False End Try ' Construct and run the query Try Dim strSQL As String = String.Format("SELECT EmployeeID, FirstName, LastName FROM Employees WHERE LastName LIKE '{0}%'", _FirstLetter.Value) Using myCmd As New System.Data.SqlClient.SqlCommand(strSQL, myConnection) Using xreader As System.Data.SqlClient.SqlDataReader = myCmd.ExecuteReader() ' Read just the first record -- simple example If (Not xreader.HasRows) Then _FirstName.Value = "" _LastName.Value = "" _EmployeeID.Value = "" xreader.Close() _SQLStatus.Value = "No records found" Return False End If xreader.Read() ' Populate Mi-Forms fields based on the query _EmployeeID.Value = xreader(0).ToString() _FirstName.Value = xreader(1).ToString() _LastName.Value = xreader(2).ToString() xreader.Close() ' Indicate that we were successful _SQLStatus.Value = "Success quering database" Return True End Using End Using Catch ex As System.Exception _SQLStatus.Value = ex.Message Return False Finally myConnection.Close() End Try End Using End Function
The general pattern is to open a database connection, construct a query, read the results of that query and then populate fields.
To export data to a database, we can use code such as that shown below. In the attached example this is done in response to a hotspot, but similar code could be used in AfterDatapathsRun as part of a custom export:
Function ExportToSQL() As Boolean Using myConnection = New System.Data.SqlClient.SqlConnection(DBCONNECTION_STRING) ' Open a DB connection Try If (myConnection Is Nothing) Then _SQLStatus.Value = "Failed to open database" Return False End If myConnection.Open() Catch ex As System.Exception _SQLStatus.Value = ex.Message Return False End Try Dim addRecord As Boolean = True ' First query to see if this ID exists. If it does, then we'll update, otherwise add Try Dim strSQL As String = String.Format("SELECT EmployeeID FROM Employees WHERE EmployeeID = '{0}'", _EmployeeID.Value) Using myCmd As New System.Data.SqlClient.SqlCommand(strSQL, myConnection) Using xreader As System.Data.SqlClient.SqlDataReader = myCmd.ExecuteReader() If xreader.HasRows Then addRecord = False End If xreader.Close() End Using End Using Catch ex As Exception _SQLStatus.Value = ex.Message Return False End Try ' Construct and run the update Try Dim strSQL As String If addRecord Then strSQL = String.Format("INSERT INTO Employees (FirstName, LastName, EmployeeID) VALUES ('{0}', '{1}', '{2}')", _FirstName.Value, _LastName.Value, _EmployeeID.Value) Else strSQL = String.Format("UPDATE Employees SET FirstName='{0}', LastName='{1}' WHERE EmployeeID={2}", _FirstName.Value, _LastName.Value, _EmployeeID.Value) End If Using myCmd As New System.Data.SqlClient.SqlCommand(strSQL, myConnection) Dim nRows As Integer = myCmd.ExecuteNonQuery() If addRecord Then _SQLStatus.Value = "Success inserting into database" Else _SQLStatus.Value = "Success updating database" End If Return True End Using Catch ex As System.Exception _SQLStatus.Value = ex.Message Return False Finally myConnection.Close() End Try End Using End Function
In this case the pattern is to open a DB connection, query to see if a record already exists, and then either update or insert a new record as appropriate.
The attached form implements this SQL import and export. There is additionally a .sql file attached that constructs the expected database.