首页 > 解决方案 > ODBC 连接到 SQL Server 2016 时出现错误未知数据类型 -155

问题描述

我在整个网站上进行了搜索,发现了类似的问题,但使用的是 python而不是 C#。此外,该帖子中的解决方法(避免使用 DateTimeOffset 数据类型查询列)对我没有帮助,因为我的应用程序略有不同。我的 MVC Web 应用程序需要动态列出 SQL Server 2016 数据库中的所有表。然后用户可以从该列表中选择 1 个表并在网格中显示所有列及其值。我正在使用 ODBC

driver = {ODBC Driver 13 for SQL Server}

连接到 SQL Server 2016 数据库。与数据库的连接成功。尽管Microsoft 的这篇文章提到了对 ODBC 日期和时间增强的数据类型支持,特别是 DataTimeOffset,但我无法访问包含 DateTimeOffSet 数据类型列的表。以下代码返回错误消息“未知数据类型 --155”。

OdbcDataAdapter adapter = new OdbcDataAdapter(queryString, con);

你有什么想法?

谢谢。

标签: c#odbcsql-server-2016datetimeoffset

解决方案


不要使用 ODBC。使用System.Data.SqlClient用于 SQL Server 的类和用于 Oracle 的ODP.NET。两个命名空间中的类都实现了命名空间中的相应接口System.Data——因此您可以以相同方式使用它们——您所需要的只是一个简单的工厂,它将返回您需要使用的任何接口的 SQLClient 实现或 ODP.NET 实现- 像这样:

public enum rdbmsTypes
{
    SQLServer,
    Oracle
}

public class ADONetFactory
{
    private rdbmsTypes _dbType;
    private string _connectionString;
    public ADONetFactory (rdbmsTypes dbType, string connectionString)
    {
        _dbType = dbType;
        _connectionString = connectionString;
    }

    public System.Data.IDbConnection GetConnecion()
    {
        switch(_dbType)
        {
            case rdbmsTypes.SQLServer:
                return new System.Data.SqlClient.SqlConnection(_connectionString);
            case rdbmsTypes.Oracle:
                return new Oracle.DataAccess.Client.OracleConnection(_connectionString);
        }
        ThrowNotSupportedException();
    }

    public System.Data.IDbCommand GetCommand()
    {
        switch (_dbType)
        {
            case rdbmsTypes.SQLServer:
                return new System.Data.SqlClient.SqlCommand();
            case rdbmsTypes.Oracle:
                return new Oracle.DataAccess.Client.OracleCommand();
        }
        ThrowNotSupportedException();
    }

    private void ThrowNotSupportedException()
    {
        throw new NotSupportedException("The RDBMS type " + Enum.GetName(typeof(rdbmsTypes), _dbType) + " is not supported"); 
    }
}

那么您应该已经内置了对两个数据库中所有数据类型的支持。


推荐阅读