#c# #asp.net #.net #oracle #ado.net
#c# #asp.net #.net #Oracle #ado.net
Вопрос:
Как вызвать следующую функцию oracle в ADO.NET использование asp.net с#
CREATE FUNCTION AuthenticateUser(UserName IN VARCHAR2,Password IN VARCHAR2)
RETURN NUMBER
IS
Counts NUMBER;
rval Number;
BEGIN
SELECT COUNT(USERNAMES)
INTO Counts
FROM tblUsers WHERE USERNAMES = UserName AND PASSWORDS = Password;
IF Counts = 1 THEN
rval:=1;
ELSE
rval:=-1;
END IF;
RETURN(rval);
END;
Ответ №1:
Сначала вам понадобится Oracle ADO.NET библиотека (что-то вроде Oracle.DataAccess.dll
?), И я не уверен, где вы могли бы это получить, но Oracle должна быть в состоянии помочь с этим. Как только у вас это будет, вы будете использовать объекты, которые он предоставляет, для выполнения запросов. Например, если вы хотите заполнить a DataSet
из запроса, это может выглядеть так:
using (var connection = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleDB"].ConnectionString))
using (var command = new OracleCommand(query, connection))
using (var dataAdapter = new OracleDataAdapter(command))
using (var dataSet = new DataSet())
{
connection.Open();
dataAdapter.Fill(dataSet);
connection.Close();
return dataSet;
}
Обратите внимание на объекты, подобные OracleConnection
и OracleCommand
которые поступают из этой библиотеки. Пока у вас есть допустимая строка подключения Oracle, эти объекты должны работать нормально:
<add name="OracleDB" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=some.host.name)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=DEV)));User Id=username;Password=password;"
providerName="Oracle" />
Ответ №2:
Я думаю, это должно сработать. Это предполагает, что вы правильно настроили свое соединение с объектом «conn».
OracleCommand cmd = new OracleCommand(@"select AuthenticateUser(:USER, :PASS) "
"from dual", conn);
cmd.Parameters.Add(new OracleParameter("USER", OracleDbType.VarChar));
cmd.Parameters.Add(new OracleParameter("PASS", OracleDbType.VarChar));
cmd.Parameters[0].Value = "yoda";
cmd.Parameters[1].Value = "jed1!";
int result = (int)cmd.ExecuteNonQuery();
Кроме того, я знаю, что встроенный SQL не рекомендуется, но я надеялся, что это продемонстрирует концепцию.
Комментарии:
1. можете ли вы рассказать мне о insql? и ваш приведенный выше код является встроенным sql
2. Я просто имею в виду, что обычно (хотя и не повсеместно) плохой практикой является помещение вашего буквального SQL (в кавычки) так, как я это делал, когда создавал объект cmd. В данном случае я действительно не думаю, что это так уж плохо, и это упрощает пример и демонстрирует суть. По правде говоря, я бы, вероятно, оставил код таким. Если ваш SQL содержит 100 строк, эта методология оставляет желать лучшего, и есть лучшие способы сделать это.
3. Я почти уверен, что если у вас есть объект connection и введите правильного пользователя и пароль, это сработает.
4. Что вы используете для oracle OPD. ЧИСТЫЙ или ADO.NET для oracle
5. ODP.net . dotConnect от devArt также будет работать. Я неравнодушен к dotConnect, но ODP.net определенно получает доступ ко всем классным низкоуровневым функциям Oracle DB