gpt4 book ai didi

coldfusion - 复制数据时querySetCell为NULL?

转载 作者:行者123 更新时间:2023-12-02 02:01:53 25 4
gpt4 key购买 nike

这是我的情况。

我必须处理一些遗留代码。此代码返回一个查询对象,我必须向其追加一些行。基本上,我需要将 1 行复制 N 次(N 不是常数),然后手动调整一些数据。

现在,至少在 IMO 看来,我所做的确实不是正确的做事方式。我宁愿返回一个不需要在 CF 端修改的查询对象,并在数据库上生成正确的数据集。但是,唉,我无法访问原始查询:(

所以这是我的破解方法。我决定编写一个复制查询行的通用函数,然后在附加副本后我可以手动设置我需要的任何单元格。

请看下面:

private function duplicateQueryRow(
required query originalQuery,
required numeric rowNum
) {
queryAddRow(arguments.originalQuery, 1);
for (local.i = 1; local.i LTE listLen(originalQuery.columnList); local.i += 1) {
columnName = listGetAt(originalQuery.columnlist, i);
querySetCell(originalQuery, columnName, originalQuery[columnName][rowNum], originalQuery.recordcount);
}
}

问题:

假设某些列为 NULL。例如,假设列 ACOLUMN 的值在第 5 行为 NULL。当我这样做时,由于 CF 不处理 NULL,最后一行的 ACOLUMN 值将为“”。现在如果我做 select distinct ACOLUMN from QUERY_NAME我将获得第 5 行和自 NULL <> [empty string] 以来的最新行.

我确实有一个解决方案,它在下面:

private function duplicateQueryRow(
required query originalQuery,
required numeric rowNum
) {
queryAddRow(arguments.originalQuery, 1);
for (local.i = 1; local.i LTE listLen(originalQuery.columnList); local.i += 1) {
columnName = listGetAt(originalQuery.columnlist, i);
if (originalQuery[columnName][rowNum] NEQ "") {
querySetCell(originalQuery, columnName, originalQuery[columnName][rowNum], originalQuery.recordcount);
}
}
}

目前可行,因为 NULL 不会被复制,但我只是不确定这是正确的....

想知道是否有人有更好的解决方案?或者至少看看这个函数是否有问题。我想的要求是对于给定查询和要复制的 rowNumber 的函数将返回查询,并在末尾包含查询的 rowNumber 行的副本。

提前致谢!

最佳答案

Or at the least see if something might be problematic with this function.

想到的一个明显问题是它不区分实际的空字符串和 null。因此,根据该逻辑,包含实际空字符串的列将被视为 null

我环顾四周,不幸的是找不到任何适合这种情况的内置函数。我以为IsNull可能会这样做,但它似乎没有按照您预期的方式处理查询列。如果您传入查询列:

        isNull( queryName["columnName"][ rowNumber ] ) 

.. 它总是返回“NO”。很可能是因为查询引用的计算结果为空字符串,而不是实际值,即 null

但是,您可以使用一些未记录 的功能。 (我通常不会推荐它,但在这种情况下我看不到任何替代方案)。 CF 查询对象有一个名为 getField(rowIndex, columnIndex) 的内部方法,它返回基础查询值。如果您使用该值,而不是使用关联数组表示法获得的值,它应该保留空值。

   targetRow = queryAddRow(originalQuery, 1);
columnNames = originalQuery.getColumnList();

// note: colIndex refers to the position within the original SQL
for (colIndex = 1; colIndex <= arrayLen(columnNames); colIndex++) {
realValue = originalQuery.getField( sourceRow, columnIndex );
originalQuery[ columnNames[colIndex] ][ targetRow ] = realValue;
}

关于coldfusion - 复制数据时querySetCell为NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16844270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com