Экспериментальный код:
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);