ODBC-соединение с SQL Server 2016 с ошибкой Неизвестный тип данных -155 - PullRequest
0 голосов
/ 28 сентября 2018

Я искал по всему сайту и обнаружил похожую проблему, но с питоном , а не с C #.Более того, обходной путь в этом посте (чтобы избежать запросов к столбцам с типом данных DateTimeOffset) не помог мне, так как мое приложение немного отличается.Мое веб-приложение MVC должно динамически перечислять все таблицы в базе данных 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);

У вас есть идеи?

Спасибо.

1 Ответ

0 голосов
/ 04 октября 2018

Не используйте ODBC.Используйте классы в System.Data.SqlClient для SQL Server и ODP.NET для Oracle.Классы в обоих пространствах имен реализуют соответствующие интерфейсы в пространстве имен 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"); 
    }
}

Тогда вы должны иметь встроенную поддержку для всех типов данных в обеих базах данных.

...