public static IntPtr MarshalManagedToNative(Charset charset, Descriptor descriptor)
    {
        var xsqlda = new XSQLDA
        {
            version = descriptor.Version,
            sqln    = descriptor.Count,
            sqld    = descriptor.ActualCount
        };

        var xsqlvar = new XSQLVAR[descriptor.Count];

        for (var i = 0; i < xsqlvar.Length; i++)
        {
            xsqlvar[i] = new XSQLVAR
            {
                sqltype    = descriptor[i].DataType,
                sqlscale   = descriptor[i].NumericScale,
                sqlsubtype = descriptor[i].SubType,
                sqllen     = descriptor[i].Length
            };


            if (descriptor[i].HasDataType() && descriptor[i].DbDataType != DbDataType.Null)
            {
                var buffer = descriptor[i].DbValue.GetBytes();
                xsqlvar[i].sqldata = Marshal.AllocHGlobal(buffer.Length);
                Marshal.Copy(buffer, 0, xsqlvar[i].sqldata, buffer.Length);
            }
            else
            {
                xsqlvar[i].sqldata = Marshal.AllocHGlobal(0);
            }

            xsqlvar[i].sqlind = Marshal.AllocHGlobal(Marshal.SizeOf <short>());
            Marshal.WriteInt16(xsqlvar[i].sqlind, descriptor[i].NullFlag);

            xsqlvar[i].sqlname        = GetStringBuffer(charset, descriptor[i].Name);
            xsqlvar[i].sqlname_length = (short)descriptor[i].Name.Length;

            xsqlvar[i].relname        = GetStringBuffer(charset, descriptor[i].Relation);
            xsqlvar[i].relname_length = (short)descriptor[i].Relation.Length;

            xsqlvar[i].ownername        = GetStringBuffer(charset, descriptor[i].Owner);
            xsqlvar[i].ownername_length = (short)descriptor[i].Owner.Length;

            xsqlvar[i].aliasname        = GetStringBuffer(charset, descriptor[i].Alias);
            xsqlvar[i].aliasname_length = (short)descriptor[i].Alias.Length;
        }

        return(MarshalManagedToNative(xsqlda, xsqlvar));
    }
    public static IntPtr MarshalManagedToNative(XSQLDA xsqlda, XSQLVAR[] xsqlvar)
    {
        var size = ComputeLength(xsqlda.sqln);
        var ptr  = Marshal.AllocHGlobal(size);

        Marshal.StructureToPtr(xsqlda, ptr, true);

        for (var i = 0; i < xsqlvar.Length; i++)
        {
            var offset = ComputeLength(i);
            Marshal.StructureToPtr(xsqlvar[i], GetIntPtr(ptr, offset), true);
        }

        return(ptr);
    }