You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core API连接Oracle失败:无效参数排查求助

问题

在ASP.NET Core API中连接Oracle数据库时遇到错误:failed to connect to server - an invalid argument was supplied。

配置与代码信息

  1. appsettings.json中的连接字符串:
"ConnectionString": "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=nvedwsgt-ih.xyz.com:1999)(PORT=1999)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=NVEDWSTG)));User Id =NVDS_XXXXXX;Password=ABC1234;"
  1. 连接数据库的C#函数:
public static DataTable GetDataTableOracle(string SQL, string strParameter1, object objParameter1)
{
    var cntNV = GetNvisonConnectionString();

    DataTable dt = new DataTable();

    using (OracleConnection conn = new OracleConnection(cntNV))
    {
        conn.Open();

        using (OracleCommand cmd = conn.CreateCommand())
        {
            cmd.BindByName = true;
            cmd.CommandText = SQL;

            if (!string.IsNullOrEmpty(strParameter1))
            {
                cmd.Parameters.Add(strParameter1, objParameter1);
            }

            using (OracleDataReader reader = cmd.ExecuteReader())
            {
                dt.Load(reader);
            }
        }
    }

    return dt;
}

排查情况

  • 已确认相同用户名和密码可通过Oracle SQL Developer正常连接,SQL语句执行正常。
  • 堆栈跟踪提示无效IP地址,具体信息如下:

Oracle.ManagedDataAccess.Client.OracleException (0x80004005): Oracle Communication: Failed to connect to server or failed to parse connect string
---> OracleInternal.Network.NetworkException (0x80004005): Oracle Communication: Failed to connect to server or failed to parse connect string
---> System.FormatException: An invalid IP address was specified.
---> System.Net.Sockets.SocketException (10022): An invalid argument was supplied.
--- End of inner exception stack trace ---
at System.Net.IPAddressParser.Parse(ReadOnlySpan1 ipSpan, Boolean tryParse) at System.Net.IPAddress.Parse(String ipString) at OracleInternal.Network.TcpTransportAdapter.Connect(ConnectionOption conOption) at OracleInternal.Network.OracleCommunication.ConnectViaCO(ConnectionOption connOption, AddressResolution addrRes) at OracleInternal.Network.OracleCommunication.DoConnect(String tnsDescriptor) at OracleInternal.Network.OracleCommunication.DoConnect(String tnsDescriptor) at OracleInternal.Network.OracleCommunication.Connect(String tnsDescriptor, Boolean doNAHandshake, String IName, ConnectionOption CO) at OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(ConnectionString cs, Boolean bOpenEndUserSession, OracleConnection connRefForCriteria, String instanceName) at OracleInternal.ConnectionPool.PoolManager3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)
at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
at NEDWebService2.DAL.Abstract.GetDataTableOracle(String SQL, String strParameter1, Object objParameter1) in C:\Users\watersja\source\repos\NEDWebService2_4_8_2024\NEDWebService2\DAL\Abstract.cs:line 91
at NEDWebService2.DAL.NED_NV.FindPersonByNIHUserNameALL(String nihSSOUsername) in C:\Users\watersja\source\repos\NEDWebService2_4_8_2024\NEDWebService2\DAL\NED_NV.cs:line 28
at NEDWebService2.Service._NED_NV.FindPersonByNIHUserNameALL(String UserName) in C:\Users\watersja\source\repos\NEDWebService2_4_8_2024\NEDWebService2\Service_NED_NV.cs:line 32
at NEDWebService2.Controllers.NVisionController.GetNEDRecordByNIHUsername(String UserName) in C:\Users\watersja\source\repos\NEDWebService2_4_8_2024\NEDWebService2\Controllers\NVisionController.cs:line 23
at lambda_method2(Closure, Object, Object[])
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

期望API能正常连接Oracle数据库并执行SQL查询,但始终失败,请问哪个参数无效?

解决方案

问题出在连接字符串的HOST字段格式错误——你把端口号:1999写在了HOST的值里,导致Oracle驱动在解析时把整个nvedwsgt-ih.xyz.com:1999当作IP/主机名去解析,进而抛出无效IP地址的错误。

修正后的连接字符串

将HOST部分的端口移除,保留单独的PORT字段即可:

"ConnectionString": "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=nvedwsgt-ih.xyz.com)(PORT=1999)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=NVEDWSTG)));User Id=NVDS_XXXXXX;Password=ABC1234;"

另外注意去掉User Id和=之间的空格,避免不必要的解析问题(虽然多数情况下不影响,但规范写法更稳妥)。

其他确认点

你的C#代码逻辑没有问题,因为SQL Developer能正常连接说明用户名、密码、服务名、端口这些核心信息都是正确的,仅需修正连接字符串的格式即可。

内容的提问来源于stack exchange,提问作者Jim Waters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:45:04