使用oledb参数化oracle查询

时间:2013-05-07 21:55:48

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

1 个答案:

答案 0 :(得分:1)

建议不要使用OleDb连接。 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没有为您提供这样的EASY选项。你会看到在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"]);
    }   
}

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