VistA-BMXNET_RPMS_dotNET_UT.../cs/bmx_0200scr/BMX2/BMXNet/BMXNetCommand.cs

344 lines
9.9 KiB
C#

using System;
using System.Data;
using System.Data.Common;
namespace IndianHealthService.BMXNet
{
public class BMXNetCommand : System.Data.Common.DbCommand, IDbCommand
{
BMXNetConnection m_connection;
BMXNetTransaction m_txn;
string m_sCmdText;
UpdateRowSource m_updatedRowSource = UpdateRowSource.None;
BMXNetParameterCollection m_parameters = new BMXNetParameterCollection();
// the default constructor
public BMXNetCommand()
{
}
// other constructors
public BMXNetCommand(string cmdText)
{
m_sCmdText = cmdText;
}
public BMXNetCommand(string cmdText, BMXNetConnection connection)
{
m_sCmdText = cmdText;
m_connection = connection;
}
public BMXNetCommand(string cmdText, BMXNetConnection connection, BMXNetTransaction txn)
{
m_sCmdText = cmdText;
m_connection = connection;
m_txn = txn;
}
/****
* IMPLEMENT THE REQUIRED PROPERTIES.
****/
override public string CommandText
{
get { return m_sCmdText; }
set { m_sCmdText = value; }
}
override public int CommandTimeout
{
/*
* BMXNet does not support a command time-out. As a result,
* for the get, zero is returned because zero indicates an indefinite
* time-out period. For the set, throw an exception.
*/
get { return 0; }
set { if (value != 0) throw new NotSupportedException(); }
}
override public CommandType CommandType
{
/*
* BMXNet only supports CommandType.Text.
*/
get { return CommandType.Text; }
set { if (value != CommandType.Text) throw new NotSupportedException(); }
}
protected override DbConnection DbConnection
{
get
{
return m_connection;
}
set
{
if (m_connection != value)
this.Transaction = null;
m_connection = (BMXNetConnection)value;
}
}
new public IDbConnection Connection
{
/*
* The user should be able to set or change the connection at
* any time.
*/
get { return m_connection; }
set
{
/*
* The connection is associated with the transaction
* so set the transaction object to return a null reference if the connection
* is reset.
*/
if (m_connection != value)
this.Transaction = null;
m_connection = (BMXNetConnection)value;
}
}
new public BMXNetParameterCollection Parameters
{
get { return m_parameters; }
}
IDataParameterCollection IDbCommand.Parameters
{
get { return m_parameters; }
}
override protected DbParameterCollection DbParameterCollection
{
get
{
throw new Exception("The method or operation is not implemented.");
}
}
new public IDbTransaction Transaction
{
/*
* Set the transaction. Consider additional steps to ensure that the transaction
* is compatible with the connection, because the two are usually linked.
*/
get { return m_txn; }
set { m_txn = (BMXNetTransaction)value; }
}
override protected DbTransaction DbTransaction
{
/*
* Set the transaction. Consider additional steps to ensure that the transaction
* is compatible with the connection, because the two are usually linked.
*/
get
{
throw new Exception("The method or operation is not implemented.");
}
set
{
throw new Exception("The method or operation is not implemented.");
}
}
override public bool DesignTimeVisible
{
get
{return false ; }
set { ;}
}
override public UpdateRowSource UpdatedRowSource
{
get { return m_updatedRowSource; }
set { m_updatedRowSource = value; }
}
/****
* IMPLEMENT THE REQUIRED METHODS.
****/
override public void Cancel()
{
// BMXNet does not support canceling a command
// once it has been initiated.
throw new NotSupportedException();
}
new public IDbDataParameter CreateParameter()
{
return (IDbDataParameter)(new BMXNetParameter());
}
override protected DbParameter CreateDbParameter()
{
throw new Exception("The method or operation is not implemented.");
}
override public int ExecuteNonQuery()
{
/*
* ExecuteNonQuery is intended for commands that do
* not return results, instead returning only the number
* of records affected.
*/
// There must be a valid and open connection.
if (m_connection == null || m_connection.State != ConnectionState.Open)
throw new InvalidOperationException("Connection must valid and open");
// Execute the command.
RPMSDb.RPMSDbResultSet resultset;
m_connection.RPMSDb.Execute(m_sCmdText, out resultset);
// Return the number of records affected.
return resultset.recordsAffected;
}
new public IDataReader ExecuteReader()
{
/*
* ExecuteReader should retrieve results from the data source
* and return a DataReader that allows the user to process
* the results.
*/
// There must be a valid and open connection.
if (m_connection == null || m_connection.State != ConnectionState.Open)
throw new InvalidOperationException("Connection must valid and open");
// Execute the command.
RPMSDb.RPMSDbResultSet resultset;
m_connection.RPMSDb.Execute(m_sCmdText, out resultset);
return new BMXNetDataReader(resultset);
}
new public IDataReader ExecuteReader(CommandBehavior behavior)
{
/*
* ExecuteReader should retrieve results from the data source
* and return a DataReader that allows the user to process
* the results.
*/
// There must be a valid and open connection.
if (m_connection == null || m_connection.State != ConnectionState.Open)
throw new InvalidOperationException("Connection must valid and open");
/*If SchemaOnly or KeyInfo behavior, Set BMXSchema flag
*execute the command, then unset the BMXSchema flag
*Otherwise, just Execute the command.
*/
RPMSDb.RPMSDbResultSet resultset;
if (((behavior & (CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo)) > 0))
{
m_connection.bmxNetLib.TransmitRPC("BMX SCHEMA ONLY", "TRUE");
m_connection.RPMSDb.Execute(m_sCmdText, out resultset);
m_connection.bmxNetLib.TransmitRPC("BMX SCHEMA ONLY", "FALSE");
}
else
{
m_connection.RPMSDb.Execute(m_sCmdText, out resultset);
}
/*
* The only CommandBehavior option supported by BMXNet
* is the automatic closing of the connection
* when the user is done with the reader.
*/
if (behavior == CommandBehavior.CloseConnection)
return new BMXNetDataReader(resultset, m_connection);
else
return new BMXNetDataReader(resultset);
}
override protected DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
{
throw new Exception("The method or operation is not implemented.");
}
override public object ExecuteScalar()
{
/*
* ExecuteScalar assumes that the command will return a single
* row with a single column, or if more rows/columns are returned
* it will return the first column of the first row.
*/
// There must be a valid and open connection.
if (m_connection == null || m_connection.State != ConnectionState.Open)
throw new InvalidOperationException("Connection must valid and open");
// Execute the command.
RPMSDb.RPMSDbResultSet resultset;
m_connection.RPMSDb.Execute(m_sCmdText, out resultset);
// Return the first column of the first row.
// Return a null reference if there is no data.
if (resultset.data.Length == 0)
return null;
return resultset.data[0, 0];
}
override public void Prepare()
{
// BMXNet Prepare is a no-op.
}
void IDisposable.Dispose()
{
this.Dispose(true);
System.GC.SuppressFinalize(this);
}
//private void Dispose(bool disposing)
//{
// /*
// * Dispose of the object and perform any cleanup.
// */
//}
/****
* IMPLEMENT BMX-Specific METHODS.
****/
public void BMXBuildUpdateCommand(DataTable dtSchema)
{
string sText = "UPDATE ";
sText += "@File, ";
sText += "@Record, ";
//Build Parameters array
BMXNetParameter[] parms = new BMXNetParameter[dtSchema.Rows.Count+2];
parms[0] = new BMXNetParameter("@File", DbType.String);
parms[0].SourceVersion = DataRowVersion.Original;
parms[0].SourceColumn = dtSchema.ExtendedProperties["BMXTable"].ToString();
Parameters.Add(parms[0]);
parms[1] = new BMXNetParameter("@Record", DbType.String);
parms[1].SourceVersion = DataRowVersion.Original;
parms[1].SourceColumn = dtSchema.ExtendedProperties["BMXKey"].ToString();;
Parameters.Add(parms[1]);
int i = 1;
foreach (DataRow r in dtSchema.Rows)
{
//Make a parameter for the Key Field and all non-ReadOnly fields
if ( ((bool) r["IsReadOnly"] == false) || ( (bool) r["IsKey"] == true ) )
{
i++;
parms[i] = new BMXNetParameter(r["ColumnName"].ToString(), DbType.String);
parms[i].SourceVersion = DataRowVersion.Current;
parms[i].SourceColumn = r["BaseColumnName"].ToString(); //FM FieldNumber
parms[i].IsKey = Convert.ToBoolean(r["IsKey"]);
Parameters.Add(parms[i]);
}
}
}
}
}