Как я могу указать логин \ пароль во время выполнения для подключения Oracle через EF6 в C #? - PullRequest
0 голосов
/ 08 ноября 2019

Я создаю окно входа в систему для подключения к Oracle из моего приложения (C # Entity Framework Code First из существующей базы данных). Я хочу, чтобы пользователь мог установить свое имя пользователя и пароль для связи с БД. Я попытался изменить строку подключения в моем DbContext, но это не работает. Кажется, что строка подключения изменена, но провайдер возвращает недопустимое исключение логин \ парольКогда я пытаюсь подключить БД с помощью строки подключения, в которой хранится пароль, все в порядке. Я думаю, что есть некоторые причины безопасности для этого поведения. Как я могу корректно изменить строку подключения во время выполнения? Я использую VS 2017, Entity Framework 6, Oracle.ManagedDataAccess 18.3, сервер Oracle 11.2.

App.config

name="ConnStrPass" connectionString="DATA SOURCE=titan;PASSWORD=REALPASS;PERSIST SECURITY INFO=True;USER ID=BEE" providerName="Oracle.ManagedDataAccess.Client"

name="ConnStrNoPass" connectionString="DATA SOURCE=titan;PASSWORD=QWERTY;PERSIST SECURITY INFO=True;USER ID=BEE" providerName="Oracle.ManagedDataAccess.Client"

DBDemoModel.cs

public partial class DBDemoModel : DbContext
{
    public DBDemoModel()
        : base("name=ConnStrPass")
    {
    }

    //overriding constructor DBDemoModel to change pass in ConnectionString

    public DBDemoModel(string pass)
            : base("name=ConnStrNoPass")
    {

        this.Database.Connection.ConnectionString = this.Database.Connection.ConnectionString.Replace("QWERTY", pass);

    }

AbonentsFinder.cs // работает нормально

    public List<ABONENTS> SelectAbonentsByName(string textToFind)
    {
        using (DBDemoModel db = new DBDemoModel())
        {
            var cont = db.ABONENTS.Where(a => a.OWNER.Contains(textToFind));
            var abon = cont.ToList();
            return new List<ABONENTS>(abon);
        }            
    }

AbonentsFinder.cs // не работает неверное имя пользователя \ login

    public List<ABONENTS> SelectAbonentsByName(string textToFind, string pass)
    {
        using (DBDemoModel db = new DBDemoModel(pass))
        {
            var cont = db.ABONENTS.Where(a => a.OWNER.Contains(textToFind));
            var abon = cont.ToList();  //exception
            return new List<ABONENTS>(abon);
        }            
    }

DBDemoModel.cs //System.NotSupportedException

    public DBDemoModel(string pass)
            : base(new OracleConnection("DATA SOURCE=titan; PASSWORD="+pass+";USER ID=BEE"), true)
    {

    }

Ответы [ 3 ]

0 голосов
/ 14 ноября 2019

Проблема решена. Проблема была с профилировщиком EF, который я использовал в своем проекте. Я отключил его, и теперь все работает нормально. OMG.

0 голосов
/ 14 ноября 2019

Все настройки базы данных Oracle, я надеюсь, что помощь для всех. спасибо

public static OracleConnection Connection;

    public static bool GetConnection()
    {
        String connectionString = "Data Source=Test;User ID=Test;Password=Test;";
        try
        {
            Connection = new OracleConnection(connectionString);
            //Connection.Open();
            return true;
        }
        catch (OracleException ww)
        {
            MessageBox.Show(ww.ToString());
            return false;
        }
    }

    public static int ExecuteStatement(string query)
    {
        if (fncOpenConnection(false))
        {
            try
            {
                OracleCommand cmd = new OracleCommand(query, Connection);
                int rowCount = cmd.ExecuteNonQuery();
                return rowCount;
            }
            catch (Exception ex)
            {
                GlobalApp.ErrorMsg = ex.ToString();
                return -1;
            }
        }
        else return -1;

    }

    public static int ExecuteStatement_TXN(string query)
    {
        if (fncOpenConnection(false))
        {
            OracleTransaction txn;
            txn = Connection.BeginTransaction();
            try
            {


                OracleCommand cmd = new OracleCommand(query, Connection);
                int rowCount = cmd.ExecuteNonQuery();
                txn.Commit();
                return rowCount;

            }
            catch (Exception er)
            {
                GlobalApp.ErrorMsg = er.ToString();
                txn.Rollback();
                return -1;
            }
        }
        else return -1;

    }




    public static OracleDataReader GetReader(string query)
    {
        fncOpenConnection(false);
        OracleDataReader dr = null;
        try
        {
            OracleCommand cmd = new OracleCommand(query, Connection);
            dr = cmd.ExecuteReader();
            return dr;
        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message);
            return dr;

        }
    }


    public static DataTable GetTable(string query, int[] primaryKeyCol = null)
    {
        DataTable dt = null;
        try
        {
            dt = new DataTable();
            OracleDataAdapter oadp = new OracleDataAdapter(query, Connection);


            oadp.Fill(dt);


            if (primaryKeyCol != null)
            {
                DataColumn[] keyColumns = new DataColumn[primaryKeyCol.Count()];
                int iCount = 0;
                foreach (int x in primaryKeyCol)
                {
                    keyColumns[iCount] = dt.Columns[x];
                    iCount = iCount + 1;
                }
                dt.PrimaryKey = keyColumns;
            }



            return dt;
        }
        catch (Exception)
        {
            return dt;
        }
    }
0 голосов
/ 08 ноября 2019

Вам необходимо войти в систему, чтобы изменить свой пароль (аналогично тому, как большинство веб-сайтов сначала запрашивают у вас ваш ТЕКУЩИЙ пароль).

Поэтому позвольте им войти в систему со своим существующим паролем, после чеговы можете выполнить следующую команду через ваш объект подключения:

"изменить пользователя MY_USER, идентифицированного по их имени для нового пароля"

...