c# - 使用 oledb 的参数化 oracle 查询

标签 c# .net oracle oledb

只是想验证这是否是使用 oledb 在 oracle 中执行参数化查询的正确语法:

OleDbCommand command = new OleDbCommand("SELECT DocumentName FROM Documents WHERE DocID = ?", connection);
command.Parameters.AddWithValue("@docid", DocIdTextBox.Text.Trim()); 
command.ExecuteReader();
using (OleDbDataReader reader = command.ExecuteReader())
{
    if (reader.HasRows)
    {
        reader.Read();
        string docName = Convert.ToString(reader["DocumentName"]);
    }   
}

最佳答案

不推荐使用 OleDb 连接。 Microsoft 将弃用 OleDb。 Microsoft 建议使用供应商提供的 native 数据库连接,如果是 Oracle,则为 Odp.net。您安装 Oracle 客户端,然后进入安装目录并找到文件夹 odp.net。在那里你可以找到 Oracle.DataAccess.dll。将此文件复制到您的目录并从您的项目中引用。该库包含大量特定于 Oracle 的对象,当您使用 ODP.net 连接时,您将获得所有优化,包括在您的情况下使用绑定(bind)变量执行参数化查询。

OleDbCommand command = new OleDbCommand("SELECT DocumentName FROM Documents WHERE DocID = ?",  connection);
command.Parameters.AddWithValue("@docid", DocIdTextBox.Text.Trim()); 

如果与 odp.net 一起使用,您可以使用 :1 而不是 ? 和 调用 command.Parameters.Add(new OracleDataParameter...。在代码中差异不大,不同之处在于 Odp.net 与 OleDb 如何解释这些调用。这实际上很有趣并且更容易看出差异Oledb vs SqlClient 因为你可以轻松分析 SqlServer。Oracle 没有给你这样简单的选项。你会看到在 SQLServer 上使用 OleDb 进行参数化会创建 declare... 但使用 SqlClient 它会执行 sp_ExecuteSql ,这是一种更好的方法。

// command.ExecuteReader(); - this line not needed

另一个问题是,在这里您需要一个单一的值,您可以使用 ExecuteScalar 而不是创建更昂贵的 reader

using (OleDbDataReader reader = command.ExecuteReader())
{
    if (reader.HasRows)
    {
        reader.Read();
        string docName = Convert.ToString(reader["DocumentName"]);
    }   
}

除了我在这里的评论,你的语法看起来还不错。

关于c# - 使用 oledb 的参数化 oracle 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16429197/

相关文章:

c# - 如何使用 HttpClient 在 Web api 中传递 header 值

c# - IsDisposed 是如何工作的?

.net - 部署通过 app.config 中的 RSAProtectedConfigurationProvider 加密的连接字符串

oracle - 如何使用 Oracle sql 查询获取数组

c# - Visual Studio 2013 ADO.net 实体模型没有 Oracle 数据源

c# - 如何从 WPF 中的数据网格中获取单元格的值?

c# - 来自 WCF 服务的响应对象

java - 挣扎着用spring SimpleJdbcCall调用Oracle函数

c# - HTML解析器

c# - 在 Azure 上部署的 .net Web 应用程序中存储和执行二进制文件的最佳方式