public void Attach(ServiceParameterBuffer spb, string dataSource, int port, string service)
		{
			GenericResponse response = null;

			lock (this)
			{
				try
				{
					_database.XdrStream.Write(IscCodes.op_service_attach);
					_database.XdrStream.Write(0);
					_database.XdrStream.Write(service);
					_database.XdrStream.WriteBuffer(spb.ToArray());
					_database.XdrStream.Flush();

					response = _database.ReadGenericResponse();

					_handle = response.ObjectHandle;
				}
				catch (IOException ex)
				{
					_database.Detach();
					throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex);
				}
			}
		}
		public void Attach(ServiceParameterBuffer spb, string dataSource, int port, string service)
		{
			GenericResponse response = null;

			lock (this)
			{
				try
				{
					this.database.Write(IscCodes.op_service_attach);
					this.database.Write(0);
					this.database.Write(service);
					this.database.WriteBuffer(spb.ToArray());
					this.database.Flush();

					response = this.database.ReadGenericResponse();

					this.handle = response.ObjectHandle;
				}
				catch (IOException)
				{
					this.database.Detach();

					throw new IscException(IscCodes.isc_net_write_err);
				}
			}
		}
		public void Attach(ServiceParameterBuffer spb, string dataSource, int port, string service)
		{
			lock (this)
			{
				try
				{
					if (this.connection == null)
					{
						this.connection = new GdsConnection();
					}

					this.connection.Connect(dataSource, port, 8192, Charset.DefaultCharset);

					this.connection.Send.Write(IscCodes.op_service_attach);
					this.connection.Send.Write(0);
					this.connection.Send.Write(service);
					this.connection.Send.WriteBuffer(spb.ToArray());
					this.connection.Send.Flush();

					try
					{
						this.handle = this.connection.ReadGenericResponse().ObjectHandle;
					}
					catch (IscException)
					{
						try
						{
							this.Detach();
						}
						catch
						{
						}

						throw;
					}
				}
				catch (IOException)
				{
					this.connection.Disconnect();

					throw new IscException(IscCodes.isc_net_write_err);
				}
			}
		}
		public void Attach(ServiceParameterBuffer spb, string dataSource, int port, string service)
		{
			int[] statusVector = ExtConnection.GetNewStatusVector();
			int svcHandle = this.Handle;

			SafeNativeMethods.isc_service_attach(
				statusVector,
				(short)service.Length,
				service,
				ref	svcHandle,
				(short)spb.Length,
				spb.ToArray());

			// Parse status	vector
			this.ParseStatusVector(statusVector);

			// Update status vector
			this.handle = svcHandle;
		}
		public void Attach(ServiceParameterBuffer spb, string dataSource, int port, string service)
		{
			// Clear the status vector
			this.ClearStatusVector();

			int svcHandle = this.Handle;

			fbClient.isc_service_attach(
				this.statusVector,
				(short)service.Length,
				service,
				ref	svcHandle,
				(short)spb.Length,
				spb.ToArray());

			// Parse status	vector
			this.ParseStatusVector(this.statusVector);

			// Update status vector
			this.handle = svcHandle;
		}
		public void Query(
			ServiceParameterBuffer	spb,
			int						requestLength,
			byte[]					requestBuffer,
			int						bufferLength,
			byte[]					buffer)
		{
			lock (this)
			{
				try
				{
					this.database.Write(IscCodes.op_service_info);	//	operation
					this.database.Write(this.Handle);				//	db_handle
					this.database.Write(0);										//	incarnation
					this.database.WriteBuffer(spb.ToArray(), spb.Length);		//	Service parameter buffer
					this.database.WriteBuffer(requestBuffer, requestLength);	//	request	buffer
					this.database.Write(bufferLength);				//	result buffer length

					this.database.Flush();

					GenericResponse response = this.database.ReadGenericResponse();

					int responseLength = bufferLength;

					if (response.Data.Length < bufferLength)
					{
						responseLength = response.Data.Length;
					}

					Buffer.BlockCopy(response.Data, 0, buffer, 0, responseLength);
				}
				catch (IOException)
				{
					throw new IscException(IscCodes.isc_network_error);
				}
			}
		}
		public void Start(ServiceParameterBuffer spb)
		{
			lock (this)
			{
				try
				{
					this.database.Write(IscCodes.op_service_start);
					this.database.Write(this.Handle);
					this.database.Write(0);
					this.database.WriteBuffer(spb.ToArray(), spb.Length);
					this.database.Flush();

					try
					{
						this.database.ReadResponse();
					}
					catch (IscException)
					{
						throw;
					}
				}
				catch (IOException)
				{
					throw new IscException(IscCodes.isc_net_write_err);
				}
			}
		}
		public void Start(ServiceParameterBuffer spb)
		{
			int[] statusVector = ExtConnection.GetNewStatusVector();
			int svcHandle = this.Handle;
			int reserved = 0;

			SafeNativeMethods.isc_service_start(
				statusVector,
				ref	svcHandle,
				ref	reserved,
				(short)spb.Length,
				spb.ToArray());

			// Parse status	vector
			this.ParseStatusVector(statusVector);
		}
		public void Query(
			ServiceParameterBuffer spb,
			int requestLength,
			byte[] requestBuffer,
			int bufferLength,
			byte[] buffer)
		{
			int[] statusVector = ExtConnection.GetNewStatusVector();
			int svcHandle = this.Handle;
			int reserved = 0;

			SafeNativeMethods.isc_service_query(
				statusVector,
				ref	svcHandle,
				ref	reserved,
				(short)spb.Length,
				spb.ToArray(),
				(short)requestLength,
				requestBuffer,
				(short)buffer.Length,
				buffer);

			// Parse status	vector
			this.ParseStatusVector(statusVector);
		}
		public void Query(
			ServiceParameterBuffer spb,
			int requestLength,
			byte[] requestBuffer,
			int bufferLength,
			byte[] buffer)
		{
			// Clear the status vector
			this.ClearStatusVector();

			int svcHandle = this.Handle;
			int reserved = 0;

			fbClient.isc_service_query(
				this.statusVector,
				ref	svcHandle,
				ref	reserved,
				(short)spb.Length,
				spb.ToArray(),
				(short)requestLength,
				requestBuffer,
				(short)buffer.Length,
				buffer);

			// Parse status	vector
			this.ParseStatusVector(this.statusVector);
		}
		public void Start(ServiceParameterBuffer spb)
		{
			// Clear the status vector
			this.ClearStatusVector();

			int svcHandle = this.Handle;
			int reserved = 0;

			fbClient.isc_service_start(
				this.statusVector,
				ref	svcHandle,
				ref	reserved,
				(short)spb.Length,
				spb.ToArray());

			// Parse status	vector
			this.ParseStatusVector(this.statusVector);
		}
		public void Start(ServiceParameterBuffer spb)
		{
			lock (this)
			{
				try
				{
					_database.XdrStream.Write(IscCodes.op_service_start);
					_database.XdrStream.Write(Handle);
					_database.XdrStream.Write(0);
					_database.XdrStream.WriteBuffer(spb.ToArray(), spb.Length);
					_database.XdrStream.Flush();

					try
					{
						_database.ReadResponse();
					}
					catch (IscException)
					{
						throw;
					}
				}
				catch (IOException ex)
				{
					throw IscException.ForErrorCode(IscCodes.isc_net_write_err, ex);
				}
			}
		}
		public void Query(
			ServiceParameterBuffer	spb,
			int						requestLength,
			byte[]					requestBuffer,
			int						bufferLength,
			byte[]					buffer)
		{
			lock (this)
			{
				try
				{
					this.connection.Send.Write(IscCodes.op_service_info);	//	operation
					this.connection.Send.Write(this.Handle);				//	db_handle
					this.connection.Send.Write((int)0);						//	incarnation					
					this.connection.Send.WriteTyped(
						IscCodes.isc_spb_version, spb.ToArray());			//	Service parameter buffer
					this.connection.Send.WriteBuffer(
						requestBuffer, requestLength);						//	request	buffer
					this.connection.Send.Write(bufferLength);				//	result buffer length

					this.connection.Send.Flush();

					GdsResponse r = this.connection.ReadGenericResponse();

					Buffer.BlockCopy(r.Data, 0, buffer, 0, bufferLength);
				}
				catch (IOException)
				{
					throw new IscException(IscCodes.isc_network_error);
				}
			}
		}