Показать сообщение отдельно
Старый 13.07.2017, 16:32   #7  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
265 / 808 (27) +++++++
Регистрация: 23.10.2012
Экспериментальный код:
X++:
void insertToDB(Common _common)
{
    Common                                          commonOrig;
    System.Data.SqlClient.SqlCommand                sqlCommand;
    System.Data.SqlClient.SqlConnection             sqlConnection;
    System.Data.SqlClient.SqlParameterCollection    parameterCollection;
    System.Data.SqlClient.SqlParameter              sqlParameter;
    System.Byte[]                                   bytes;
    SysSQLSystemInfo                                SQLSystemInfo = SysSQLSystemInfo::construct();
    DictTable                                       dictTable;
    int                                             j;
    DictField                                       dictField;
    str                                             fieldsStr,
                                                    valuesStr,
                                                    parameterId;
    Map                                             valuesMap,
                                                    sizeMap;
    AnyTypeValue                                    AnyTypeValue;
    MapEnumerator                                   valuesMapEnumerator;
    System.IO.MemoryStream                          memStream;
    RecId                                           ret;
    TreeNode                                        treeNode;
    str                                             insertStr;
    #AOT
    ;

    dictTable = new DictTable(_common.TableId);
    valuesMap = new Map(Types::Integer, Types::Class);
    sizeMap   = new Map(Types::Integer, Types::Integer);

    for (j = 1; j <= dictTable.fieldCnt(); j++)
    {
        dictField = new DictField(_common.TableId, dictTable.fieldCnt2Id(j));

        if (!dictField.isSql() || !_common.(dictField.id()))
        {
            continue;
        }

        if (dictField)
        {
            if (dictField.baseType() == Types::String)
            {
                sizeMap.insert(j, dictField.stringLen());
            }

            if (fieldsStr)
            {
                fieldsStr += strFmt(',[%1]', dictField.name(DbBackend::Sql));
                valuesStr += strFmt(',@FLD%1', j);
            }
            else
            {
                fieldsStr = strFmt('[%1]', dictField.name(DbBackend::Sql));
                valuesStr = strFmt('@FLD%1', j);
            }

            AnyTypeValue = new AnyTypeValue(_common.(dictField.id()));

            if (dictField.name() == identifierStr(RecId))
            {
                ret = AnyTypeValue.value();
            }

            valuesMap.insert(j, AnyTypeValue);
        }
    }

    sqlConnection = new System.Data.SqlClient.SqlConnection(strFmt("Data Source=%1;Initial Catalog=%2;Integrated Security=True",
                                                                   SQLSystemInfo.getLoginServer(),
                                                                   SQLSystemInfo.getloginDatabase()));

    sqlCommand    = new System.Data.SqlClient.SqlCommand(strFmt('INSERT INTO %1 (%2) VALUES (%3)', dictTable.name(DbBackend::Sql), fieldsStr, valuesStr), sqlConnection);



    parameterCollection = sqlCommand.get_Parameters();

    valuesMapEnumerator = valuesMap.getEnumerator();

    while (valuesMapEnumerator.moveNext())
    {
        parameterId  = strFmt('@FLD%1', valuesMapEnumerator.currentKey());
        AnyTypeValue = valuesMapEnumerator.currentValue();

        switch (AnyTypeValue.typeOf())
        {
            case Types::Enum    :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::Int);
                sqlParameter.set_Value(enum2int(AnyTypeValue.value()));
                break;

            case Types::Time    :
            case Types::Integer :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::Int);
                sqlParameter.set_Value(AnyTypeValue.value());
                break;

            case Types::Int64    :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::BigInt);
                sqlParameter.set_Value(AnyTypeValue.value());
                break;

            case Types::Guid    :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::UniqueIdentifier);
                sqlParameter.set_Value(AnyTypeValue.value());
                break;

            case Types::Real    :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::Real);
                sqlParameter.set_Value(AnyTypeValue.value());
                break;

            case Types::Date        :
            case Types::UtcDateTime :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::DateTime);
                sqlParameter.set_Value(AnyTypeValue.value());
                break;

            case Types::String    :
                if (sizeMap.exists(valuesMapEnumerator.currentKey()))
                {
                    sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::NVarChar, sizeMap.lookup(valuesMapEnumerator.currentKey()));
                }
                else
                {
                    sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::NVarChar, -1);
                }

                sqlParameter.set_Value(AnyTypeValue.value());
                break;

            case Types::BLOB :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::VarBinary);
                memStream = Binary::constructFromContainer(AnyTypeValue.value()).getMemoryStream();
                bytes = memStream.ToArray();
                memStream.Close();
                sqlParameter.set_Value(bytes);
            case Types::Container :
                sqlParameter = parameterCollection.Add(parameterId, System.Data.SqlDbType::VarBinary);
                memStream = Binary::constructFromContainer(new ContainerClass(AnyTypeValue.value()).toBlob()).getMemoryStream();
                bytes = memStream.ToArray();
                memStream.Close();
                sqlParameter.set_Value(bytes);
                break;
            default :
                sqlParameter = parameterCollection.Add(parameterId, AnyTypeValue.value());
                break;
        }
    }

    if (memStream)
    {
        memStream.Dispose();
    }

    sqlConnection.Open();

    sqlCommand.ExecuteNonQuery();
    sqlCommand.Dispose();

    sqlConnection.Close();
    sqlConnection.Dispose();
}
На вход принимает xRecord объект с проинициализированными значениями полей, вставляет запись в БД.
Табличный метод insert может быть перекрыт. Решайте сами нужно ли выполнять этот код.
Аналогичная ситуация со ставкой записи в ЖБД
X++:
new Application().logInsert(_common);
За это сообщение автора поблагодарили: trud (5), AfterEarth (1).