Я делаю два файла сборки, используя NAnt. Первый направлен на автоматическую компиляцию форм и отчетов Oracle 6i, а второй - на составление форм и отчетов Oracle 9i / 10g. В задачу NAnt входит скрипт C #, который запрашивает у разработчика учетные данные базы данных (имя пользователя, пароль, база данных) для составления форм и отчетов. Затем я хочу запустить эти учетные данные для соответствующей базы данных, чтобы убедиться, что введенные учетные данные верны, и, если это не так, предложить пользователю повторно ввести свои учетные данные. Мой скрипт в настоящее время выглядит следующим образом:
class GetInput
{
public static void ScriptMain(Project project)
{
Console.Clear();
Console.WriteLine("===================================================================");
Console.WriteLine("Welcome to the Compile and Deploy Oracle Forms and Reports Facility");
Console.WriteLine("===================================================================");
Console.WriteLine();
Console.WriteLine("Please enter the acronym of the project to work on from the following list:");
Console.WriteLine();
Console.WriteLine("--------");
Console.WriteLine("- BCS");
Console.WriteLine("- COPEN");
Console.WriteLine("- FCDD");
Console.WriteLine("--------");
Console.WriteLine();
Console.Write("Selection: ");
project.Properties["project.type"] = Console.ReadLine();
Console.WriteLine();
Console.Write("Please enter username: ");
string username = Console.ReadLine();
project.Properties["username"] = username;
string password = ReturnPassword();
project.Properties["password"] = password
Console.WriteLine();
Console.Write("Please enter database: ");
string database = Console.ReadLine();
project.Properties["database"] = database
Console.WriteLine();
//Call method to verify user credentials
Console.WriteLine();
Console.WriteLine("Compiling files...";
}
public static string ReturnPassword()
{
Console.Write("Please enter password: ");
string password = "";
ConsoleKeyInfo nextKey = Console.ReadKey(true);
while (nextKey.Key != ConsoleKey.Enter)
{
if (nextKey.Key == ConsoleKey.Backspace)
{
if (password.Length > 0)
{
password = password.Substring(0, password.Length - 1);
Console.Write(nextKey.KeyChar);
Console.Write(" ");
Console.Write(nextKey.KeyChar);
}
}
else
{
password += nextKey.KeyChar;
Console.Write("*");
}
nextKey = Console.ReadKey(true);
}
return password;
}
}
Проведя небольшое исследование, я обнаружил, что вы можете подключиться к базам данных Oracle, используя пространство имен System.Data.OracleClient clicky . Однако, как упоминалось в ссылке, Microsoft прекращает поддержку этого, поэтому это нежелательное решение. Я также считаю, что Oracle предоставляет свои собственные классы для подключения к базам данных Oracle clicky . Однако кажется, что это только поддерживает подключение к Oracle 9 или более новым базам данных ( clicky ), поэтому это неосуществимое решение, поскольку мне также необходимо подключиться к базам данных Oracle 6i.
Я мог бы добиться этого, вызвав скрипт bat из скрипта C #, но для простоты я бы предпочел иметь один файл сборки. В идеале я хотел бы выполнить ряд команд, таких как содержится в следующем сценарии .bat:
rem -- Set Database SID --
set ORACLE_SID=%DBSID%
sqlplus -s %nameofuser%/%password%@%dbsid%
set cmdsep on
set cmdsep '"'; --"
set term on
set echo off
set heading off
select '========================================' || CHR(10) || 'Have checked and found both Password and ' || chr(10) || 'Database Identifier are valid, continuing ...' || CHR(10) || '========================================' from dual;
выход;
Это требует, чтобы я установил переменную среды ORACLE_SID, а затем запустил sqlplus в режиме без вывода сообщений (-s), после чего последовал ряд команд sql set (set x), собственно оператор select и команда exit. Могу ли я добиться этого в сценарии c # без вызова сценария bat, или я вынужден вызывать сценарий bat? Заранее спасибо!