繁体   English   中英

Oracle DB 未从 C# 控制台应用程序在 Visual Studio Code 中构建在 net6.0 上

[英]Oracle DB not connecting from C# Console App built on net6.0 in Visual Studio Code

确实在很长一段时间后我才开始接触 C#.NET,并意识到发生了很多变化。 此外,我别无选择,只能使用 Visual Studio Code 来开发应用程序。 用例很容易开始; 但是,我一开始就遇到了障碍。

问题:调试器返回ORA-01017:用户名/密码无效; 尽管使用了正确的凭据、格式正确的 TNS 连接字符串和正确的程序集 ( Oracle.ManagedDataAccess.Core ),但登录被拒绝消息。 该项目是一个 SDK 风格的项目,其中程序集由编译器动态注入。

到目前为止我已经尝试过:

  1. 通过使用 SQL Developer 和 DBeaver 连接来验证凭据。
  2. 使用了 Oracle 网站上的 ODP.NET 和 ODP Net Core 官方教程。
  3. 在这里和那里搜索了无数的文章。
  4. 诉诸 System.Data 和较旧的程序集,但他们不允许我编译应用程序等。

我现在正在考虑使用混合方法; ie I'll spin up a Java spring application using JDBC drivers and then invoke the .NET app to parse the complex payloads and return control back to the java layer. 这绝对是一个搞砸的解决方案,使情况变得更糟。 我什至不知道我是否可以重新设计它以便稍后在 AWS Lambda 上运行,尽管我希望将所有内容都写在 C# 中。 太遗憾了。 真的很沮丧。

为什么我首先选择了.NET? 除了 System.Reflection,我还需要 Expando 和 Type Dynamic 库; 虽然反射在 Java 中可用,但前者不是因此没有选择。 我不想逐个编写/维护解析器和 XSD,我想要一个动态解决方案,其中一种方法可以完成所有工作。

有更好的选择吗? 请不要将我指向 Python,鉴于目前的时间表,我没有足够的带宽来学习新的语言。

这是代码片段。

var conStringUser = new OracleConnectionStringBuilder() 
{
    DataSource = "(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = xxww.db.abc.com)(PORT = 1521)))(CONNECT_DATA =(SID=something)))",
        UserID = "xxxxyyyzzz",
        Password = "zzzssaaxx",
}.ConnectionString;

using(OracleConnection con = new OracleConnection(conStringUser)) 
{
    using(OracleCommand cmd = con.CreateCommand()) 
    {
        try
        {
            con.Open();
            Console.WriteLine("Successfully connected to Oracle Database");
            Console.WriteLine();
            con.Close();
        } 
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

多年来,我一直在使用 Oracle DB 和.Net Core 和旧版本,这没有什么秘密,不好的一面只是 Oracle 配置本身哈哈

但这里有一些提示:

不要使用 ODP.NET,而是选择Oracle.ManagedDataAccess.Core ,它由 Oracle 维护,就像任何其他数据库一样即插即用,ODP.NET 是一个糟糕的选择,我是根据经验来告诉你的:)

此外,我一直将这种语法用于 Oracle 连接字符串:

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=User;Password=Password;

只需提前 go 并使用此连接字符串创建一个新的OracleConnection并保证它会正常工作

这是一个要测试的控制台应用程序示例:

using System;
using Oracle.ManagedDataAccess.Client;

namespace SimpleDataAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {

                var connectionString = @"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=User;Password=Password;";
                
                using (var conn = new OracleConnection(connectionString))
                {
                    conn.Open();

                    using (var cmd = new OracleCommand(@"select sysdate from dual", conn))
                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Console.WriteLine("Date: " + Convert.ToDateTime(reader["sysdate"]));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM