public static void SetParameter(this IDataParameter dataContainer, string name, object paramValue, int length, int decimals) { RfcErrorInfo errorInfo; var type = paramValue.GetType(); switch (SnwTypeConverter.ToRfcType(type)) { case RfcType.Char: { var value = (char[])paramValue; UnsafeNativeMethods.RfcSetChars(dataContainer.DataHandle(), name, value, value.Length, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Num: { var value = (SnwNumeric)paramValue; if ((length > 0) && (value.Length > length)) { throw new SnwConnectorException(Messages.MaxParameterLengthError, length); } UnsafeNativeMethods.RfcSetNum(dataContainer.DataHandle(), name, value.ToChar(), value.Length, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.String: { var value = (string)paramValue; UnsafeNativeMethods.RfcSetString(dataContainer.DataHandle(), name, value, value.Length, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Date: { var value = (SnwDate)paramValue; UnsafeNativeMethods.RfcSetDate(dataContainer.DataHandle(), name, value.ToChar(), out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Time: { var time = (SnwTime)paramValue; UnsafeNativeMethods.RfcSetTime(dataContainer.DataHandle(), name, time.ToChar(), out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Byte: { var value = (byte[])paramValue; UnsafeNativeMethods.RfcSetBytes(dataContainer.DataHandle(), name, value, value.Length, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Int: { UnsafeNativeMethods.RfcSetInt(dataContainer.DataHandle(), name, (int)paramValue, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Int1: { UnsafeNativeMethods.RfcSetInt1(dataContainer.DataHandle(), name, (byte)paramValue, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Int2: { UnsafeNativeMethods.RfcSetInt2(dataContainer.DataHandle(), name, (short)paramValue, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.Float: { UnsafeNativeMethods.RfcSetFloat(dataContainer.DataHandle(), name, (double)paramValue, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.DecF16: { UnsafeNativeMethods.RfcSetDecF16(dataContainer.DataHandle(), name, (decimal)paramValue, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.DecF34: { UnsafeNativeMethods.RfcSetDecF34(dataContainer.DataHandle(), name, (decimal)paramValue, out errorInfo); errorInfo.IfErrorThrowException(); } break; case RfcType.XString: { var value = (SnwXString)paramValue; UnsafeNativeMethods.RfcSetXString(dataContainer.DataHandle(), name, value.ToByteArray(), value.Length, out errorInfo); errorInfo.IfErrorThrowException(); } break; default: { throw new SnwConnectorException(string.Format(CultureInfo.InvariantCulture, Messages.TypeNotHandled, type)); } } }
public static T GetParameter <T>(this IDataParameter dataContainer, string name, int length, int decimals, RfcType rfcType) { RfcErrorInfo errorInfo; object result; switch (rfcType) { case RfcType.Char: { var buffer = new StringBuilder(length); UnsafeNativeMethods.RfcGetChars(dataContainer.DataHandle(), name, buffer, buffer.Length, out errorInfo); errorInfo.IfErrorThrowException(); result = buffer; } break; case RfcType.Num: { var buffer = new char[length]; UnsafeNativeMethods.RfcGetNum(dataContainer.DataHandle(), name, buffer, buffer.Length, out errorInfo); errorInfo.IfErrorThrowException(); result = new SnwNumeric(new string(buffer)); } break; case RfcType.String: { int stringLength = 200; //UnsafeNativeMethods.RfcGetStringLength(dataContainer.DataHandle(), name, out stringLength, out errorInfo); //errorInfo.IfErrorThrowException(); var stringBuffer = new StringBuilder(stringLength + 1); int retlength; UnsafeNativeMethods.RfcGetString(dataContainer.DataHandle(), name, stringBuffer, stringBuffer.Capacity, out retlength, out errorInfo); errorInfo.IfErrorThrowException(); result = stringBuffer.ToString(); } break; case RfcType.Date: { var date = new char[8]; UnsafeNativeMethods.RfcGetDate(dataContainer.DataHandle(), name, date, out errorInfo); errorInfo.IfErrorThrowException(); result = new SnwDate(new string(date)); } break; case RfcType.Time: { var time = new char[6]; UnsafeNativeMethods.RfcGetTime(dataContainer.DataHandle(), name, time, out errorInfo); errorInfo.IfErrorThrowException(); result = new SnwTime(new string(time)); } break; case RfcType.Byte: { var buffer = new byte[length]; UnsafeNativeMethods.RfcGetBytes(dataContainer.DataHandle(), name, buffer, buffer.Length, out errorInfo); errorInfo.IfErrorThrowException(); result = buffer; } break; case RfcType.Int: { int value; UnsafeNativeMethods.RfcGetInt(dataContainer.DataHandle(), name, out value, out errorInfo); errorInfo.IfErrorThrowException(); result = value; } break; case RfcType.Int1: { byte value; UnsafeNativeMethods.RfcGetInt1(dataContainer.DataHandle(), name, out value, out errorInfo); errorInfo.IfErrorThrowException(); result = value; } break; case RfcType.Int2: { short value; UnsafeNativeMethods.RfcGetInt2(dataContainer.DataHandle(), name, out value, out errorInfo); errorInfo.IfErrorThrowException(); result = value; } break; case RfcType.Float: { double value; UnsafeNativeMethods.RfcGetFloat(dataContainer.DataHandle(), name, out value, out errorInfo); errorInfo.IfErrorThrowException(); result = value; } break; case RfcType.DecF16: { decimal value; UnsafeNativeMethods.RfcGetDecF16(dataContainer.DataHandle(), name, out value, out errorInfo); errorInfo.IfErrorThrowException(); result = value; } break; case RfcType.DecF34: { decimal value; UnsafeNativeMethods.RfcGetDecF16(dataContainer.DataHandle(), name, out value, out errorInfo); errorInfo.IfErrorThrowException(); result = value; } break; case RfcType.XString: { var buffer = new byte[length]; int outLength; UnsafeNativeMethods.RfcGetXString(dataContainer.DataHandle(), name, buffer, buffer.Length, out outLength, out errorInfo); errorInfo.IfErrorThrowException(); result = new SnwXString(buffer); } break; case RfcType.Structure: { IntPtr structureHandle; UnsafeNativeMethods.RfcGetStructure(dataContainer.DataHandle(), name, out structureHandle, out errorInfo); errorInfo.IfErrorThrowException(); var structure = new SnwStructure(structureHandle); result = typeof(T).GetConstructor(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public, null, new[] { typeof(SnwStructure) }, null).Invoke(new object[] { structure }); } break; case RfcType.Table: { IntPtr tableHandle; UnsafeNativeMethods.RfcGetTable(dataContainer.DataHandle(), name, out tableHandle, out errorInfo); errorInfo.IfErrorThrowException(); var table = new SnwTable <SnwStructure>(tableHandle); result = typeof(T).GetConstructor(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public, null, new[] { typeof(SnwTable <SnwStructure>) }, null).Invoke(new object[] { table }); } break; default: { throw new SnwConnectorException(string.Format(CultureInfo.InvariantCulture, Messages.TypeNotHandled, typeof(T))); } } return((T)result); }