小编Jef*_*f G的帖子

使用Postgres中的IEnumerable参数进行IN查询的Dapper AddDynamicParams

首先,我遇到了所讨论的同样的问题,据称大约在两年前修复了.有关该问题,请参阅以下问题:

带有"动态"参数名称的IN语句的Dapper AddDynamicParams

我遇到的问题是,当我SELECT * FROM MyTable WHERE MyId IN @myIds对Postgres 9.3数据库执行类似的查询()时,我收到以下异常:

Npgsql.NpgsqlException : ERROR: 42883: operator does not exist: integer = integer[]
Run Code Online (Sandbox Code Playgroud)

我执行此查询的代码如下:

List<MyTable> result;

var query = "SELECT * FROM MyTable WHERE MyId IN @myIds";
var queryParams = new Dictionary<string, object> {
    { "myIds", new [] { 5, 6 } }
};

var dynamicParams = new DynamicParameters(queryParams);
using (var connection = new NpgsqlConnection(connectionString)) {
    result = connection.Query<MyTable>(query, dynamicParams).ToList();
}

return result;
Run Code Online (Sandbox Code Playgroud)

相反,我在行上的Dapper(v1.29)SqlMapper.PackListParameters函数中放置了一个断点,if (FeatureSupport.Get(command.Connection).Arrays)并手动将执行移动到else部分,然后查询运行并返回预期结果.

我注意到该 …

c# dapper postgresql-9.3

6
推荐指数
1
解决办法
2157
查看次数

如何将 Postgres 外键模拟到分区表中

我有一个分区表(称为 A),其串行主键被另一个表(称为 B)引用。我知道我实际上无法创建从一个到另一个的外键(因为我不知道数据实际存储在哪个分区),因此,我尝试使用 check 来模拟外键的行为限制。像下面这样:

CREATE TABLE A (
    MyKey SERIAL PRIMARY KEY
);

CREATE TABLE B (
    AKey INT, -- Should have: REFERENCES A (MyKey),
              -- but can't due to Postgres limitations
);

CREATE TABLE APart1 (
    Field1 INT,
    PRIMARY KEY (MyKey)
) INHERITS (A);

CREATE TABLE APart2 (
    Field2 INT,
    PRIMARY KEY (MyKey)
) INHERITS (A);

CREATE FUNCTION ValidateKeyInA(aKey INT) RETURNS BOOL AS $$
    BEGIN
        PERFORM * FROM A WHERE MyKey = aKey;
        IF FOUND THEN …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-keys database-partitioning postgresql-9.3

5
推荐指数
1
解决办法
2565
查看次数

PostgreSQL JDBC错误代码枚举

是JDBC驱动程序随附的PostgreSQL错误代码的枚举,还是我们必须自己创建该枚举?在JDBC文档中找不到关于错误代码的任何信息。

开始编辑

为了澄清我在寻找什么,这是我现有的代码:

catch (final SQLException e) {
    if ("23514".equals(e.getSQLState())) {
        // check_violation
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得大多数程序员都会在那条线上引起人们的注意,因为它既不能自我记录也不能重复使用。每次开发人员需要确定异常原因时,都会被迫在线查找错误代码,并将魔术数字硬编码为条件代码。相反,我更喜欢编写如下代码:

catch (final SQLException e) {
    if (PGErrors.check_violation.equals(e.getSQLState())) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这样的枚举PostgreSQL错误代码的类是否已经存在?

postgresql jdbc java-8 postgresql-9.5

5
推荐指数
1
解决办法
1280
查看次数

隐藏 Sphinx 重组文本中的标题级别

我继承了一个现有的 RST 文档,其结构如下:

DocTitle
========

Heading2
--------

Heading1
========
Run Code Online (Sandbox Code Playgroud)

请注意,Heading1是一个比 更大的标题Heading2。由于我现在要将此文档添加到目录中,因此我希望它能够正确缩进。这意味着将标题更改为新标题,如下所示:

DocTitle
########

Heading2
--------

Heading1
========
Run Code Online (Sandbox Code Playgroud)

问题是上面的结果Heading2大于Heading1。有没有某种方法可以定义标题样式而不向页面添加实际标题?例如,我想做类似的事情:

DocTitle
########

.. hidden::
   Heading1
   ========

Heading2
--------

Heading1
========
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在 RST 文件中实现此结果吗?

相关问题: 跳过 reStructuredText 中的标题级别

这个问题的答案是“否”,但我想知道是否有一种方法可以定义从结果输出中隐藏的标题。

restructuredtext python-sphinx

5
推荐指数
1
解决办法
1110
查看次数

如何在 Java 9+ 中运行 XJC

我下载了JAXB 2.3.0.1JavaBeans Activation Framework (JAF) 1.2.0(基于此问题的答案)。我将所有 JAR 文件提取到同一目录,然后在该目录中运行以下命令:

java -cp jaxb-api.jar;jaxb-core.jar;jaxb-impl.jar;javax.activation-1.2.0.jar
    -jar jaxb-xjc.jar [xjc-arguments]
Run Code Online (Sandbox Code Playgroud)

上述命令失败并显示以下消息:

java.lang.NoClassDefFoundError:javax/activation/DataSource
    ...
引起:java.lang.ClassNotFoundException:javax.activation.DataSource

我已验证该类存在于 javax.activation-1.2.0.jar 文件中。我还尝试使用新的(Java 9+)参数-p . --add-modules java.activation,但失败并显示以下错误消息:

初始化引导层
java.lang.modules.ResolutionException时发生错误:模块jaxb.core和jaxb.impl导出包com.sun.xml.bind.marshaller到模块java.activation

如果我尝试组合-cp--add-modules,我会收到不同的引导层初始化错误。有谁知道如何让 XJC 使用 Java 9+ 平台运行?

我的具体用例是 Windows 上的 OpenJDK 11。

java jaxb xjc java-11

5
推荐指数
1
解决办法
6149
查看次数

C++ countof 成员数组的实现

我正在尝试使用 C++ 模板创建与 Visual Studio _countof 宏等效的内容。以下是我建议的定义:

\n\n
template<typename T, size_t N>\ninline constexpr size_t countof(T const (&array)[N]) {\n    return N;\n}\ntemplate<typename T, typename U, size_t N>\ninline constexpr size_t countof(T const (U::&array)[N]) {\n    return N;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的第二个声明是尝试修复以下代码,该代码在 g++ 9 中生成编译时错误,并显示消息:“错误:无效使用非静态数据成员 \xe2\x80\x98foo::bar\xe2\ x80\x99":

\n\n
struct foo {\n    int const bar[4];\n    static_assert(countof(bar) == 4);\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我添加第二个定义并将断言更改为 use 时foo::bar,g++ 生成错误:“错误:\xe2\x80\x98template constexpr const size_t countof\xe2\x80\x99 与先前的声明冲突”。

\n\n

我可以更改代码以使用指向成员的指针(而不是对成员的引用),但这似乎是不必要的。有谁知道一种方法来制作countof仅在传递数组时才编译的版本,并且以合理的方式适用于自由数组和成员变量数组?

\n

c++ templates g++ c++14

5
推荐指数
1
解决办法
688
查看次数

如何使用 Java 的 ByteBuffer.arrayOffset() 方法

ByteBuffer.arrayOffset的 Java API 文档指出:

返回缓冲区第一个元素在此缓冲区的后备数组中的偏移量(可选操作)

我不知道如何arrayOffset()返回一个非零值。有谁知道如何更改调用该ByteBuffer.arrayOffset()方法的结果?

java buffer nio

4
推荐指数
1
解决办法
2916
查看次数

从JNI运行时,Java ShutdownHook无法加入主线程

我有一些Java代码可以创建一个关闭钩子,以便当客户端按ctrl + C时可以干净地退出:

private static void shutdownHandler(Thread mainThread) {
    try {
        mainThread.join(30000);
    } catch (InterruptedException e) {
    }
}

public static void main(String[] args) {
    final Thread mainThread = Thread.currentThread();
    Thread shutdownThread = new Thread(() -> shutdownHandler(mainThread));
    Runtime.getRuntime().addShutdownHook(shutdownThread);
}
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行此命令时,它可以按预期工作(主线程退出并几乎立即返回到命令提示符)。但是,如果我编写了一个JNI包装器,而使用以下C ++代码调用了该包装器:

JavaVMInitArgs vm_args;
// Populate vm_args

JavaVM *jvm;
JNIEnv *env;
JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &vm_args);

jclass mainClass = env->FindClass("path/to/my/class");
jmethod mainMethod = env->GetStaticMethodID(mainClass, "main", "([L" STRING_CLASS ";)V");

jclass stringClass = env->FindClass(STRING_CLASS);
jobjectArray mainArgs = env->NewObjectArray(0, stringClass, NULL);

env->CallStaticVoidMethod(mainClass, mainMethod, mainArgs);
jvm->DestroyJavaVM();
Run Code Online (Sandbox Code Playgroud)

然后,该 …

java java-native-interface multithreading shutdown-hook java-11

4
推荐指数
1
解决办法
339
查看次数

Java运行系统命令和忽略输出

是否有任何理智的方法从Java运行忽略STDOUT和STDERR的系统命令?例如,当我尝试以下操作时:

Process p = Runtime.getRuntime().exec("some_executable_path param1 param2 >NUL 2>&1");
Run Code Online (Sandbox Code Playgroud)

Java尝试解析命令,并最终转义参数(例如,阻止输出被重定向).如果我不重定向STDOUT/STDERR,缓冲区将填满并阻止系统调用退出.以下是我想要的,但是非常麻烦并且创建昂贵的资源只是为了抛弃系统调用的输出:

ProcessBuilder pb = new ProcessBuilder("some_executable_path", "param1", "param2");
pb.redirectErrorStream(true);
final Process p = pb.start();
final Thread redirectToNull = new Thread(() -> {
        final InputStream stdout = process.getInputStream();
        try {
            while (stdout.read() != -1);
        } catch (final Exception e) {
            // Don't care
        }
    }, "Output Consumer Thread");
redirectToNull.setDaemon(true);
redirectToNull.start();
Run Code Online (Sandbox Code Playgroud)

我知道Java设计团队被称为自虐,但这很荒谬.我更愿意提供一个批处理或Perl脚本,用我的应用程序包装系统调用,而不是使用上面的代码.必须有一种更简单的方法来实现这一目标.

所以问题是,是否有任何理智的方法从Java中运行系统命令并忽略打印到STDOUT/STDERR的输出?

java

3
推荐指数
1
解决办法
1129
查看次数

C++ 使用 CRTP 模板-模板基类中的构造函数

从奇怪的递归模板模式(CRTP)模板-模板基类继承构造函数的语法是什么?

template<typename T, template<typename> typename U>
struct Base {
    Base(int) { }
};

template<typename T>
struct Derived : public Base<T, Derived> {
    using Base<T, Derived>::Base;
};

int main(int argc, char *argv[]) {
    Derived<double> foo(4);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在VS2019中,上述代码会出现以下错误:

错误 C3210: 'Base<double, Derived<double> >': 成员 using-declaration 只能应用于基类成员
错误 C3881: 只能从直接基类继承构造函数

使上述代码正常工作所需的语法是什么?

c++ templates using template-templates visual-studio

3
推荐指数
1
解决办法
397
查看次数