如何在运行时指定 login\password 以在 C# 中通过 EF6 连接 Oracle?

How can I specify a login\password at runtime to connect Oracle via EF6 in C#?

我正在登录 window 以从我的应用程序连接 Oracle(C# Entity Framework 来自现有数据库的代码优先)。我想让用户能够设置自己的 username\password 来连接数据库。我试图更改我的 DbContext 中的连接字符串,但它不起作用。连接字符串似乎已更改,但提供程序 returns 无效 login\password 异常。当我尝试将数据库与已存储的连接字符串连接时,一切正常。我认为这种行为有一些安全原因。如何在运行时正确更改连接字符串? 我正在使用 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 //没有错username\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)
    {

    }

您需要登录才能更改密码(类似于大多数网站首先要求您提供当前密码的方式)。

所以让他们使用现有密码登录,之后您可以通过您的连接对象运行执行以下命令:

"alter user MY_USER identified by TheirNewPassword"

问题已解决。问题出在我在项目中使用的 EF 探查器。我禁用了它,现在一切正常。我的天啊

所有Oracle 数据库配置我希望对任何人有所帮助。谢谢

public 静态 OracleConnection 连接;

    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;
        }
    }