2013-05-07 2 views
2

Просто хотел убедиться в том, что это правильный синтаксис для выполнения параметризованных запросов в оракула, используя OLEDB:Параметризованная оракул запрос с использованием 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"]); 
    } 
} 
+0

Если вы намерены проверить: это работает? –

+0

@Marc У меня нет доступа к db для тестирования. – Crackerjack

ответ

1

Использование соединения OleDb не рекомендуется. Microsoft не рекомендует использовать OleDb. Корпорация Майкрософт рекомендует использовать встроенную db-связь, предоставляемую поставщиком, а именно Odp.net в случае Oracle. Вы устанавливаете клиент Oracle, затем заходите в каталог установки и находите папку odp.net. Там вы можете найти Oracle.DataAccess.dll. Скопируйте этот файл в свой каталог и ссылку из вашего проекта. Эта библиотека содержит обширные объекты, связанные с оракулом, и когда вы подключаетесь с помощью 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 vs SqlClient, потому что вы можете легко профилировать SqlServer. Oracle не дает вам такую ​​возможность EASY. Вы увидите, что параметризация с 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"]); 
    } 
} 

Другие, чем комментарии я здесь, ваш синтаксис выглядит Ok.

Смежные вопросы