TThhoommaass
Programmer
Hi,
I am trying to read data from a REST API from ESRI ArcGIS rest services, but I get the following error message when I try this:
SystemNullReferenceException: Object reference not set to an instance of an object. at ScriptMain.<CreateNewoutputRows>d__0.MoveNext()
I can read the array that gets back from the rest api, I can step thought all the data with a for loop and a messagebox for example, but when I try to put this in the OutputBuffer, it won't work.
Here is the code (the used website is password protected):
#region Help: Introduction to the Script Component
/* The Script Component allows you to perform virtually any operation that can be accomplished in
* a .Net application within the context of an Integration Services data flow.
*
* Expand the other regions which have "Help" prefixes for examples of specific ways to use
* Integration Services features within this script component. */
#endregion
#region Namespaces
using System;
using System.Data;
using System.Threading.Tasks;
using System.Windows.Forms;
using Esri.ArcGISRuntime.Http;
using Esri.ArcGISRuntime.Security;
using Esri.ArcGISRuntime.Tasks.Query;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
#endregion
/// <summary>
/// This is the class to which to add your code. Do not change the name, attributes, or parent
/// of this class.
/// </summary>
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPoint]
public class ScriptMain : UserComponent
{
#region Help: Using Integration Services variables and parameters
/* To use a variable in this script, first ensure that the variable has been added to
* either the list contained in the ReadOnlyVariables property or the list contained in
* the ReadWriteVariables property of this script component, according to whether or not your
* code needs to write into the variable. To do so, save this script, close this instance of
* Visual Studio, and update the ReadOnlyVariables and ReadWriteVariables properties in the
* Script Transformation Editor window.
* To use a parameter in this script, follow the same steps. Parameters are always read-only.
*
* Example of reading from a variable or parameter:
* DateTime startTime = Variables.MyStartTime;
*
* Example of writing to a variable:
* Variables.myStringVariable = "new value";
*/
#endregion
#region Help: Using Integration Services Connnection Managers
/* Some types of connection managers can be used in this script component. See the help topic
* "Working with Connection Managers Programatically" for details.
*
* To use a connection manager in this script, first ensure that the connection manager has
* been added to either the list of connection managers on the Connection Managers page of the
* script component editor. To add the connection manager, save this script, close this instance of
* Visual Studio, and add the Connection Manager to the list.
*
* If the component needs to hold a connection open while processing rows, override the
* AcquireConnections and ReleaseConnections methods.
*
* Example of using an ADO.Net connection manager to acquire a SqlConnection:
* object rawConnection = Connections.SalesDB.AcquireConnection(transaction);
* SqlConnection salesDBConn = (SqlConnection)rawConnection;
*
* Example of using a File connection manager to acquire a file path:
* object rawConnection = Connections.Prices_zip.AcquireConnection(transaction);
* string filePath = (string)rawConnection;
*
* Example of releasing a connection manager:
* Connections.SalesDB.ReleaseConnection(rawConnection);
*/
#endregion
#region Help: Firing Integration Services Events
/* This script component can fire events.
*
* Example of firing an error event:
* ComponentMetaData.FireError(10, "Process Values", "Bad value", "", 0, out cancel);
*
* Example of firing an information event:
* ComponentMetaData.FireInformation(10, "Process Values", "Processing has started", "", 0, fireAgain);
*
* Example of firing a warning event:
* ComponentMetaData.FireWarning(10, "Process Values", "No rows were received", "", 0);
*/
#endregion
public async override void CreateNewOutputRows()
{
/*
Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer".
For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput".
*/
SignOn();
// Query task initialization
var url = "
QueryTask queryTask = new QueryTask(new Uri(url));
//queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;
//queryTask.Failed += QueryTask_Failed;
// Query task parameters. Return geometry, state, and population density.
var timeWindow = new Esri.ArcGISRuntime.Data.TimeExtent(DateTime.Now.Subtract(new TimeSpan(0, 5, 0, 0)), DateTime.Now);
Query query = new Query(timeWindow);
query.Where = "1=1";
query.OutFields.AddRange(new string[] { "OBJECTID", "FIRSTNAME", "LASTNAME" });
// Use textbox text as query condition.
//query.Where = QueryTextBox.Text;
MyOutputBuffer.AddRow();
MyOutputBuffer.OBJECTID = 1;
MyOutputBuffer.LASTNAME = "Hoog";
MyOutputBuffer.FIRSTNAME = "Thomas";
MessageBox.Show("after addrow");
//for (int i = 1; i <= 100; i++)
//{
// MyOutputBuffer.AddRow();
// MyOutputBuffer.OBJECTID = i;
// MyOutputBuffer.FIRSTNAME = "Ram " + i.ToString();
//}
try
{
QueryResult queryResult = await queryTask.ExecuteAsync(query);
Esri.ArcGISRuntime.Data.FeatureSet resultFeatures = queryResult.FeatureSet;
MessageBox.Show(resultFeatures.Features.Count.ToString());
foreach (Esri.ArcGISRuntime.Data.Feature f in resultFeatures.Features)
{
//MessageBox.Show("test");
MessageBox.Show(f.Attributes["FIRSTNAME"]?.ToString()
+ f.Attributes["LASTNAME"]?.ToString()
+ f.Attributes["OBJECTID"].ToString());
MyOutputBuffer.AddRow();
MyOutputBuffer.OBJECTID = int.Parse(f.Attributes["OBJECTID"].ToString());
MyOutputBuffer.FIRSTNAME = f.Attributes["FIRSTNAME"]?.ToString();
MyOutputBuffer.LASTNAME = f.Attributes["LASTNAME"]?.ToString();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
MessageBox.Show("exceptions");
}
MessageBox.Show("einde");
}
public async Task<Credential> CreateHardCodedCredentialAsync(CredentialRequestInfo requestInfo)
{
var opts = new GenerateTokenOptions();
opts.TokenAuthenticationType = TokenAuthenticationType.ArcGISToken;
var cred = await IdentityManager.Current.GenerateCredentialAsync(
" "*****",
"*****", opts);
return cred;
}
public void SignOn()
{
try
{
var myChallenger = new Esri.ArcGISRuntime.Security.ChallengeHandler
(this.CreateHardCodedCredentialAsync);
IdentityManager.Current.ChallengeHandler = myChallenger;
}
catch (ArcGISWebException webExp)
{
MessageBox.Show("Unable to authenticate with ArcGIS Server at PLEDoc: " + webExp.Message);
}
catch (Exception exp)
{
MessageBox.Show("Unable to load secured layer: " + exp.Message);
}
}
}
I am trying to read data from a REST API from ESRI ArcGIS rest services, but I get the following error message when I try this:
SystemNullReferenceException: Object reference not set to an instance of an object. at ScriptMain.<CreateNewoutputRows>d__0.MoveNext()
I can read the array that gets back from the rest api, I can step thought all the data with a for loop and a messagebox for example, but when I try to put this in the OutputBuffer, it won't work.
Here is the code (the used website is password protected):
#region Help: Introduction to the Script Component
/* The Script Component allows you to perform virtually any operation that can be accomplished in
* a .Net application within the context of an Integration Services data flow.
*
* Expand the other regions which have "Help" prefixes for examples of specific ways to use
* Integration Services features within this script component. */
#endregion
#region Namespaces
using System;
using System.Data;
using System.Threading.Tasks;
using System.Windows.Forms;
using Esri.ArcGISRuntime.Http;
using Esri.ArcGISRuntime.Security;
using Esri.ArcGISRuntime.Tasks.Query;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
#endregion
/// <summary>
/// This is the class to which to add your code. Do not change the name, attributes, or parent
/// of this class.
/// </summary>
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPoint]
public class ScriptMain : UserComponent
{
#region Help: Using Integration Services variables and parameters
/* To use a variable in this script, first ensure that the variable has been added to
* either the list contained in the ReadOnlyVariables property or the list contained in
* the ReadWriteVariables property of this script component, according to whether or not your
* code needs to write into the variable. To do so, save this script, close this instance of
* Visual Studio, and update the ReadOnlyVariables and ReadWriteVariables properties in the
* Script Transformation Editor window.
* To use a parameter in this script, follow the same steps. Parameters are always read-only.
*
* Example of reading from a variable or parameter:
* DateTime startTime = Variables.MyStartTime;
*
* Example of writing to a variable:
* Variables.myStringVariable = "new value";
*/
#endregion
#region Help: Using Integration Services Connnection Managers
/* Some types of connection managers can be used in this script component. See the help topic
* "Working with Connection Managers Programatically" for details.
*
* To use a connection manager in this script, first ensure that the connection manager has
* been added to either the list of connection managers on the Connection Managers page of the
* script component editor. To add the connection manager, save this script, close this instance of
* Visual Studio, and add the Connection Manager to the list.
*
* If the component needs to hold a connection open while processing rows, override the
* AcquireConnections and ReleaseConnections methods.
*
* Example of using an ADO.Net connection manager to acquire a SqlConnection:
* object rawConnection = Connections.SalesDB.AcquireConnection(transaction);
* SqlConnection salesDBConn = (SqlConnection)rawConnection;
*
* Example of using a File connection manager to acquire a file path:
* object rawConnection = Connections.Prices_zip.AcquireConnection(transaction);
* string filePath = (string)rawConnection;
*
* Example of releasing a connection manager:
* Connections.SalesDB.ReleaseConnection(rawConnection);
*/
#endregion
#region Help: Firing Integration Services Events
/* This script component can fire events.
*
* Example of firing an error event:
* ComponentMetaData.FireError(10, "Process Values", "Bad value", "", 0, out cancel);
*
* Example of firing an information event:
* ComponentMetaData.FireInformation(10, "Process Values", "Processing has started", "", 0, fireAgain);
*
* Example of firing a warning event:
* ComponentMetaData.FireWarning(10, "Process Values", "No rows were received", "", 0);
*/
#endregion
public async override void CreateNewOutputRows()
{
/*
Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer".
For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput".
*/
SignOn();
// Query task initialization
var url = "
QueryTask queryTask = new QueryTask(new Uri(url));
//queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;
//queryTask.Failed += QueryTask_Failed;
// Query task parameters. Return geometry, state, and population density.
var timeWindow = new Esri.ArcGISRuntime.Data.TimeExtent(DateTime.Now.Subtract(new TimeSpan(0, 5, 0, 0)), DateTime.Now);
Query query = new Query(timeWindow);
query.Where = "1=1";
query.OutFields.AddRange(new string[] { "OBJECTID", "FIRSTNAME", "LASTNAME" });
// Use textbox text as query condition.
//query.Where = QueryTextBox.Text;
MyOutputBuffer.AddRow();
MyOutputBuffer.OBJECTID = 1;
MyOutputBuffer.LASTNAME = "Hoog";
MyOutputBuffer.FIRSTNAME = "Thomas";
MessageBox.Show("after addrow");
//for (int i = 1; i <= 100; i++)
//{
// MyOutputBuffer.AddRow();
// MyOutputBuffer.OBJECTID = i;
// MyOutputBuffer.FIRSTNAME = "Ram " + i.ToString();
//}
try
{
QueryResult queryResult = await queryTask.ExecuteAsync(query);
Esri.ArcGISRuntime.Data.FeatureSet resultFeatures = queryResult.FeatureSet;
MessageBox.Show(resultFeatures.Features.Count.ToString());
foreach (Esri.ArcGISRuntime.Data.Feature f in resultFeatures.Features)
{
//MessageBox.Show("test");
MessageBox.Show(f.Attributes["FIRSTNAME"]?.ToString()
+ f.Attributes["LASTNAME"]?.ToString()
+ f.Attributes["OBJECTID"].ToString());
MyOutputBuffer.AddRow();
MyOutputBuffer.OBJECTID = int.Parse(f.Attributes["OBJECTID"].ToString());
MyOutputBuffer.FIRSTNAME = f.Attributes["FIRSTNAME"]?.ToString();
MyOutputBuffer.LASTNAME = f.Attributes["LASTNAME"]?.ToString();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
MessageBox.Show("exceptions");
}
MessageBox.Show("einde");
}
public async Task<Credential> CreateHardCodedCredentialAsync(CredentialRequestInfo requestInfo)
{
var opts = new GenerateTokenOptions();
opts.TokenAuthenticationType = TokenAuthenticationType.ArcGISToken;
var cred = await IdentityManager.Current.GenerateCredentialAsync(
" "*****",
"*****", opts);
return cred;
}
public void SignOn()
{
try
{
var myChallenger = new Esri.ArcGISRuntime.Security.ChallengeHandler
(this.CreateHardCodedCredentialAsync);
IdentityManager.Current.ChallengeHandler = myChallenger;
}
catch (ArcGISWebException webExp)
{
MessageBox.Show("Unable to authenticate with ArcGIS Server at PLEDoc: " + webExp.Message);
}
catch (Exception exp)
{
MessageBox.Show("Unable to load secured layer: " + exp.Message);
}
}
}