C# 从SQL Server 2012查询数据

C# 从SQL Server 2012查询数据,c#,mono,sql-server-2012,C#,Mono,Sql Server 2012,我正在尝试将SQL Server支持添加到我们的一款产品的Mono(在Linux上,而不是Android上,如果有必要的话)版本中 我有一个在Windows上运行良好的代码库,但在Mono下,它不起作用。我们使用的是SQL身份验证,而不是NT 我能够返回表名列表,因此我知道它正在与数据库“对话”,但当我尝试从表中查询行时,我得到以下结果: [错误]致命的未处理异常:系统。异常:未知数据包类型129 位于:0中的Mono.Data.Tds.Protocol.TdsComm.GetPhysicalP

我正在尝试将SQL Server支持添加到我们的一款产品的Mono(在Linux上,而不是Android上,如果有必要的话)版本中

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

我能够返回表名列表,因此我知道它正在与数据库“对话”,但当我尝试从表中查询行时,我得到以下结果:

[错误]致命的未处理异常:系统。异常:未知数据包类型129
位于:0中的Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacketHeader()[0x00000] 位于:0中的Mono.Data.Tds.Protocol.TdsComm.GetPhysicalPacket()[0x00000] 在:0中的Mono.Data.Tds.Protocol.TdsComm.Peek()[0x00000]处 在:0中的Mono.Data.Tds.Protocol.Tds.NextResult()[0x00000]处 位于:0中的System.Data.SqlClient.SqlCommand.ExecuteScalar()[0x00000] 在OpenNETCF.ORM.SQLStoreBase`1[OpenNETCF.ORM.SqlEntityInfo].ExecuteScalar(System.String sql)[0x00000]中: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]中:0
在SolutionFamily.Storage.DataEntityProvider.GetEntityInstances(System.String entityName、Int32 skipNumber、Int32 RetrievenNumber)[0x00000]中:0
{省略了更多调用堆栈}

所以看起来单声道的TDS版本很旧,也许吧,据我所知,这不是什么新鲜事。它从SQLServer7开始使用,而SQLServer7本身离“最近”还很远

我想我的问题是:

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

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


不管DTS问题如何。即使您设法解决了这一问题,但如果SQL Server 2012真的不受支持,我认为您在这一过程中还会遇到更多问题。

我的代码中令人不快的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计算机上创建表和插入数据似乎工作正常。

是的,我查看了该页面。不幸的是,许多Mono文档页面已经过时,上面没有“有效截止日期”来确定它们的年代,甚至这一页在不同的地方也自相矛盾。你有没有得出结论?Sql Server 2012是否受Mono支持?我的结论在下面已被接受的答案中列出-不要尝试调用
SELECT SERVERPROPERTY
。从那时起它可能已经改变了,但我只是围绕着它工作了代码,再也不用回去了。