![]() |
#5 |
Участник
|
Экспериментальный код:
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(); } Табличный метод insert может быть перекрыт. Решайте сами нужно ли выполнять этот код. Аналогичная ситуация со ставкой записи в ЖБД X++: new Application().logInsert(_common); |
|
|
За это сообщение автора поблагодарили: trud (5), AfterEarth (1). |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|