2

只是想验证这是否是使用 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"]);
    }   
}
4

1 回答 1

1

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

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

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

于 2013-07-16T19:24:35.280 回答