C# 中的 Oracle、绑定变量和 ID IN (1, 2, 3) 等查询

2023-12-24

我正在寻找以下 Java 技术的 C# ODAC 改编,其中代码能够将数字数组(数组大小可以变化)绑定到非 PL/SQL 中SELECT语句,然后在 a 中使用结果数组WHERE ID IN (...)风格检查。

http://rafudb.blogspot.com/2011/10/variable-inlist.html http://rafudb.blogspot.com/2011/10/variable-inlist.html

下面是基于 OCI 的 C 程序中使用此技术的另一个示例:

Oracle OCI、绑定变量和 ID IN (1, 2, 3) 等查询 https://stackoverflow.com/questions/18603281/oracle-oci-bind-variables-and-queries-like-id-in-1-2-3

具体来说,我们想要执行如下查询

SELECT * FROM MyTable WHERE ID IN (SELECT * FROM TABLE(:1))

并将数字数组传入:1.


Code:

oraParam.UdtTypeName = "SYS.ODCINUMBERLIST";
VArray newArray = new VArray();
newArray.Array = new Int32[] {12,24,42};
oraParam.OracleDbType = OracleDbType.Array;
oraParam.Value = newArray;

string query = @"Select * from TABLE(:1) ";
OracleCommand command = new OracleCommand(query, MyConnection);
command.Parameters.Add(oraParam);
OracleDataReader reader;
var m_connection = new OracleConnection("The CONNECTION STRING");
m_connection.Open();
var reader = command.ExecuteReader();
reader.Close();
m_connection.Close();

接下来是以下辅助类:

class VArray : IOracleCustomType, INullable
{
    [OracleArrayMapping()]
    public Int32[] Array;

    private OracleUdtStatus[] m_statusArray;
    public OracleUdtStatus[] StatusArray
    {
        get
        {
            return this.m_statusArray;
        }
        set
        {
            this.m_statusArray = value;
        }
    }

    private bool m_bIsNull;

    public bool IsNull
    {
        get
        {
            return m_bIsNull;
        }
    }

    public static VArray Null
    {
        get
        {
            VArray obj = new VArray();
            obj.m_bIsNull = true;
            return obj;
        }
    }

    public void ToCustomObject(OracleConnection con, IntPtr pUdt)
    {
        object objectStatusArray = null;
        Array = (Int32[])OracleUdt.GetValue(con, pUdt, 0, out objectStatusArray);
        m_statusArray = (OracleUdtStatus[])objectStatusArray;
    }

    public void FromCustomObject(OracleConnection con, IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, 0, Array, m_statusArray);
    }

    public override string ToString()
    {
        if (m_bIsNull)
            return "VArray.Null";
        else
        {
            string rtnstr = String.Empty;
            if (m_statusArray[0] == OracleUdtStatus.Null)
                rtnstr = "NULL";
            else
                rtnstr = Array.GetValue(0).ToString();
            for (int i = 1; i < m_statusArray.Length; i++)
            {
                if (m_statusArray[i] == OracleUdtStatus.Null)
                    rtnstr += "," + "NULL";
                else
                    rtnstr += "," + Array.GetValue(i).ToString();
            }
            return "VArray(" + rtnstr + ")";
        }
    }
}

[OracleCustomTypeMapping("SYS.ODCINUMBERLIST")]
public class VArrayFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory
{
    // IOracleCustomTypeFactory
    public IOracleCustomType CreateObject()
    {
        return new VArray();
    }

    // IOracleArrayTypeFactory Interface
    public Array CreateArray(int numElems)
    {
        return new Int32[numElems];
    }

    public Array CreateStatusArray(int numElems)
    {
        // CreateStatusArray may return null if null status information 
        // is not required.
        return new OracleUdtStatus[numElems];
    }
}

描述:

总体思路是,与 OCI 示例类似,您必须将参数强制转换为 SYS.ODCINUMBERLIST(或其他有效类型)。默认情况下,C# OracleDBType 中未定义该类型,因此您必须使用 UdtTypeName 和自定义工厂/类才能成功绑定。

这是受到启发的以下关于定义自定义类型的文章 http://www.codeproject.com/Articles/33829/How-to-use-Oracle-11g-ODP-NET-UDT-in-an-Oracle-Sto.

Limits:

此精确解决方案仅适用于 INT/NUMBER 值,因为它搭载了 SYS.ODCINUMBERLIST 表类型。如果其他类型需要它,您可能需要查找/编写其他自定义表类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的 Oracle、绑定变量和 ID IN (1, 2, 3) 等查询 的相关文章

  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 更改表添加列并在同一条件 IF 语句中更新新列

    我正在尝试添加列并在同一 if 语句中更新它 BEGIN TRAN IF NOT EXISTS SELECT 1 FROM sys columns WHERE Name N Code AND Object ID Object ID N Te
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • 尝试生成预签名 url 链接以便用户可以下载 Amazon S3 对象,但收到无效请求

    我目前正在使用 Ruby aws sdk 版本 2 gem 以及服务器端客户提供的加密密钥 SSE C 我可以毫无问题地将对象从 Rails 表单上传到 Amazon S3 def s3 Aws S3 Object new bucket n
  • Gradle/Eclipse:使用相等时德语“Umlaute”的不同行为?

    在使用 Java 的相等性检查 直接或间接 时 我遇到了德语 Umlaute 的奇怪行为 从 Eclipse 运行 调试或测试时 一切都按预期工作 并且包含 Umlaute 的输入被视为相等或不按预期处理 然而 当我使用 Spring Bo
  • 如何使用R的pixmap包提取像素数据?

    如何使用R的pixmap包提取像素数据 所以我使用以下方法读取图像文件 图片 如何将像素数据提取到某个矩阵中 您可以通过以下方式获取灰度图像的 2 D 矩阵数据或彩色图像的 3 D 数组数据 getChannels gt x lt read
  • 使用 querySelector 获取包含某个类的所有元素

    为了改变我正在使用的类中的一些样式querySelector el querySelector fa fa car style display none 这对于一个元素来说效果很好 但如果有更多元素包含此类 并且我想将所有元素的显示更改为无
  • WooCommerce 无法从产品类别访问购物车

    我有一个自定义的 WooCommerce 产品类型 我需要从其中访问购物车 URL 看起来很简单 class WC Product My Product extends WC Product Simple public function s
  • 使用 PIL 更改 OpenCV Python 中的字体系列

    上面的答案没有解决我的问题 我在用cv2 putText 将文本放在视频上 这按预期工作 但我正在尝试使用不同的字体 在 OpenCV 中不可用 据我了解 OpenCV 仅限于cv2 FONT HERSHEY字体 所以我使用 PIL 和 O
  • 在渲染中传递参数 - Rails 3

    我看到了几个关于此的问题 但无法解决 我试图在渲染部分时传递参数 类似于domainname com memory books new fbookupload yes 现在 我使用这一行 在部分中 我尝试使用以下方式获取 fbookuplo
  • 如何使用 axios 重定向后获取登陆页面 URL

    使用 NodeJS 如果我使用 maxRedirects 5 的 axios 如果我输入将重定向到另一个 URL 的 URL 如何从最终登陆页面获取 URL 在 HTTP 标头中 当存在 HTTP 200 代码时 就没有着陆页的标头字段 示
  • Django:在保存之前修改模型的字段

    我有一个模型 course 与ImageField and FileField所以我想在用户每次创建课程时创建一个文件夹 我想我可以在保存模型之前执行此操作 所以这是我的问题 如何在方法中访问模型的字段 模型 py Class Course
  • 在 Objective C 中复制整数数组最有效的方法是什么?

    在 Objective C 中将 1000 个整数的数组从一个数组复制到另一个数组的最有效方法是什么 这将在 iPhone 上运行一些绘图代码 因此尽可能高效很重要 Thanks 如果关心的是效率 我假设这是一个 C 整数数组 如果是这样
  • 如何使用ConfigurationManager解析app.config?

    我正在使用某种方法来解析我的 app config 文件 然后我被告知使用 ConfigurationManager 更好 更简单 但问题是我不知道如何使用 ConfigurationManager 来做到这一点 我原来的代码是这样的 Xm
  • Angular 2 - 所有组件的全局变量

    我的 angular2 应用程序在许多不同的组件中使用我的后端 Laravel API 我一直在想 将来我需要更改 API URL 这意味着我必须在我对 API 使用 http get post 方法的所有地方 在所有组件中 更改我的 AP
  • SSL - 如何以及何时使用它

    我有一个客户需要 SSL 来保护在线捐赠 但我对于如何 何时使用 SSL 的经验有限 据我所知 在购买证书时 我将该证书分配给整个域 实际上是 IP 地址 有没有办法将加密隔离到网站的单个页面 或者我应该继续保护整个网站 即使只有一个页面需
  • 如何正确使用 scikit-learn 的高斯过程进行 2D 输入、1D 输出回归?

    在发帖之前我做了很多搜索并发现这个问题 https stackoverflow com questions 21320964 how to make a 2d gaussian process using gpml matlab for r
  • OpenCV 后台描述文件无效

    当我尝试使用此命令时 opencv createsamples img image jpg bg bg txt info info info lst pngoutput info num 2600它告诉我 无效的背景描述文件 我现在尝试 n
  • Android Webrtc 将流更改为 STREAM_MUSIC

    我已经创建了从一台设备到另一台设备的 WebRTC 会话 该设备应该能够控制音乐流的音量 但 WebRTC 最初设计用于传输 voice call 因此使用 voice call 通道并使用通话音量控制对于非通话应用程序 我尝试在 WebR
  • 设置seaborn图的x轴间隔

    我有一组子图要绘制 这里 我们如何设置第二行子图中x轴的间隔 即ax4 to ax6 目前 从 1 到 100 的所有值都会打印出来 如图所示 我试过ax4 set xticks range 1 100 5 但在那里 显示的范围是 1 到
  • 将控制台应用程序转换为 Windows 服务

    我正在尝试将生成 pdf 报告的控制台应用程序转换为 Windows 服务 我的代码如下 我的方向正确吗 我安装了此服务并且启动 停止工作正常 但没有生成报告 控制台应用程序本身就可以很好地生成 Output pdf 我的目标是在服务启动时
  • Java 11 应用程序作为轻量级 docker 镜像

    受到提问的启发为什么 Java 11 基础 Docker 镜像如此大 openjdk 11 jre slim https stackoverflow com questions 53375613 我发现这个话题在Java世界里还没有定论 A
  • C# 中的 Oracle、绑定变量和 ID IN (1, 2, 3) 等查询

    我正在寻找以下 Java 技术的 C ODAC 改编 其中代码能够将数字数组 数组大小可以变化 绑定到非 PL SQL 中SELECT语句 然后在 a 中使用结果数组WHERE ID IN 风格检查 http rafudb blogspot