【问题标题】:Querying data from SQL Server 2012从 SQL Server 2012 查询数据
【发布时间】:2014-08-01 17:20:41
【问题描述】:

我正在尝试将 SQL Server 支持添加到我们产品之一的 Mono(在 Linux 上,而不是 Android)版本中。

我有一个在 Windows 上运行良好的代码库,但在 Mono 下,它不正常。我们使用的是 SQL 身份验证,而不是 NT。

我能够取回一个表名列表,所以我知道它正在与数据库“对话”,但是当我尝试从表中查询行时,我得到了:

[错误] 致命的未处理异常:System.Exception:未知数据包类型 129
在 Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacketHeader () [0x00000] 中:0
在 Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacket () [0x00000] in :0
在 Mono.Data.Tds.Protocol.TdsComm.Peek () [0x00000] in :0
在 Mono.Data.Tds.Protocol.Tds.NextResult () [0x00000] in :0
在 System.Data.SqlClient.SqlCommand.ExecuteScalar () [0x00000] in :0
在 OpenNETCF.ORM.SQLStoreBase`1[OpenNETCF.ORM.SqlEntityInfo].ExecuteScalar (System.String sql) [0x00000] in :0
在 OpenNETCF.ORM.SqlServerDataStore.get_ServerVersion () [0x00000] 中:0
在 OpenNETCF.ORM.SqlServerDataStore.Fetch (System.String entityName, Int32 fetchCount, Int32 firstRowOffset, System.String sortField, FieldSearchOrder sortOrder, OpenNETCF.ORM.FilterCondition filter, Boolean fillReferences) [0x00000] in :0
在 SolutionFamily.Storage.DataEntityProvider.GetEntityInstances (System.String entityName, Int32 skipNumber, Int32 retrieveNumber) [0x00000] in :0
{更多调用堆栈省略}

所以看起来 Mono 中的 TDS 版本很旧,也许吧? Packet type 129 looks like it’s a “result” packet from version 7.0 on,所以据我所知,这并不是什么新鲜事。它从 SQL Server 7 开始就一直在使用,而它本身离“最近”还很远。

所以我想我的问题是:

  • 从 Mono 应用程序连接到 SQL Server 2012 数据库是否受支持?
  • 有没有人成功连接到“现代”版本的 SQL Server?
  • 是否有更新版本的 TDS on System.Data.* 可用以增加支持?
  • 关于如何继续(除了调试 Mono 并尝试自己实现这些东西)有什么想法吗?

【问题讨论】:

  • 你有没有得出这个结论? Mono 是否支持 Sql Server 2012?
  • 我的结论在下面接受的答案中概述 - 不要尝试致电SELECT SERVERPROPERTY。从那时起它可能已经改变了,但我只是围绕它工作了代码,再也不用回去了。

标签: c# mono sql-server-2012


【解决方案1】:

我不确定我在这里查看的页面是否正确,但您咨询过this吗?

不管 DTS 问题如何。即使你设法解决了这个问题,如果 SQL Server 2012 真的不受支持,我认为你会遇到更多问题。

【讨论】:

  • 是的,我看过那个页面。不幸的是,许多 Mono 文档页面已经过时,没有“有效日期”来知道它们的年龄,甚至这个页面在不同的地方也自相矛盾。
【解决方案2】:

看来我的代码中有问题的 SQL 语句是这样的:

SELECT SERVERPROPERTY('productversion')

我尝试将呼叫从 ExecuteScalar() 更改为 ExecuteReader(),然后读取第一行的第一列,但这也爆炸了。 TDS 不喜欢该语句(或者更可能是 SQL Server 从中返回的结果)的某些内容。

幸运的是,我们只使用生成的版本来确定要运行哪些类型的查询(我们对支持它们的较新服务器有更快的查询)并且只是恢复为“旧”似乎仍然允许所有其余代码运行,所以我将调用者修改为如下所示:

public Version ServerVersion 
{
    get
    {
        // Mono doesn't like selecting SERVERPROPERTY, at least not from SQL 2012
        if (Environment.OSVersion.Platform == PlatformID.Unix)
        {
            return new Version(1, 0);
        }

        if (m_version == null)
        {
            var v = this.ExecuteScalar("SELECT  SERVERPROPERTY('productversion')");
            m_version = new Version(v.ToString());
        }

        return m_version;
    }
}

显然这里的版本号不是特别正确,但它适用于我的 ORM,然后选择“旧”查询样式,一切照常进行。它仍然需要对任何其他故障进行更多测试,但到目前为止,使用 Mono.SqlClient 在 SQL Server 2012 机器上创建表和插入数据似乎工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多