ODBC连接到SQL Server 2016,错误为-155未知数据类型

时间:2018-09-28 12:00:42

标签: c# odbc sql-server-2016 datetimeoffset

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

中使用ODBC
driver = {ODBC Driver 13 for SQL Server}

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

OdbcDataAdapter adapter = new OdbcDataAdapter(queryString, con);

您有什么想法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

不要使用ODBC。对SQL Server使用System.Data.SqlClient中的类,对于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"); 
    }
}

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