使用 oledb 的参数化的 oracle 查询

标签: oledb .Net Oracle C#
发布时间: 2017/4/14 21:05:45
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

只被想确认一下这是否在 oracle 中使用 oledb 执行参数化的查询的正确语法︰

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"]);
    }   
}

解决方法 1:

不推荐使用 OleDb 连接。OleDb 将由微软被否决。Microsoft 建议使用本机 db 连接,供应商,是在 Oracle Odp.net 提供的。您安装 Oracle 客户端,然后进入安装目录,找到文件夹 odp.net。在那里你可以找到 Oracle.DataAccess.dll。将此文件复制到您的目录和从您的项目引用。此库包含广泛的特定于 oracle 的对象,当您使用 ODP.net 连接你得到所有的优化,包括,你的情况,执行 parametarized 查询使用绑定变量。

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 将这些调用 vs OleDb 的解释。这是实际上有趣和更容易看到的 Oledb vs SqlClient 的区别,因为你可以轻松配置 SqlServer。Oracle 不给你这种简单的选择。您将看到该参数与 OleDb 对 SQLServer 创建 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"]);
    }   
}

除了评论在这里好吗,你的语法看上去很好。

赞助商