Использование соединения 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.
Если вы намерены проверить: это работает? –
@Marc У меня нет доступа к db для тестирования. – Crackerjack