2016-06-22 54 views
2

我已经创建了一个基本的.Net Core控制台测试应用程序,以连接到本地Sql Server实例并检索数据。面向.NET 4.6.1,但不针对对.NET核心时,当相同的代码工作正常:在CoreFx上使用System.Data.SqlClient时UDT不支持的令牌问题

using System; 
using System.Collections.Generic; 
using System.Data.SqlClient; 
using System.Dynamic; 
using System.Linq; 
using System.Text; 

namespace SqlServerTests 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      try 
      { 
       StringBuilder statement = new StringBuilder("SELECT * FROM calendars as i WHERE i.Id='[id]"); 

       SqlConnection sqlConnection = new SqlConnection("[Connection works fine]"); 

       sqlConnection.Open(); 

       SqlCommand sqlCommand = new SqlCommand(statement.ToString(), sqlConnection); 
       SqlDataReader sqlReader = sqlCommand.ExecuteReader(); 

       if (!sqlReader.HasRows) 
        Console.WriteLine("No data found"); ; 

       List<dynamic> dataSet = new List<dynamic>(); 

       if (sqlReader.HasRows) 
        while (sqlReader.Read()) 
        { 
         dynamic dataObject = new ExpandoObject(); 
         var data = dataObject as IDictionary<string, object>; 

         for (int i = 0; i < sqlReader.FieldCount; i++) 
          data[sqlReader.GetName(i)] = !sqlReader.IsDBNull(i) ? sqlReader.GetValue(i) : null; 

         dataSet.Add(data); 
        } 

       Console.WriteLine(dataSet.FirstOrDefault()); 

       sqlConnection.Close(); 
      } 
      catch(Exception exception) 
      { 
       //Exception code omitted 
      } 
     } 
    } 
} 

连接正常(另一个应用程序使用相同的连接来保存数据),并运行SQL Server Profiler中时查询按预期执行(数据也被检索粘贴查询到SQL Server管理Studio时如预期),但在控制台应用程序,我收到以下消息调用的ExecuteReader时:

服务器正在尝试使用某项功能这不是 在此平台上受支持。收到不受支持的令牌“Udt”,而 从服务器读取数据。 在System.Data.SqlClient.TdsParser.TryCommonProcessMetaData(TdsParserStateObject stateObj,_SqlMetaData COL)处 System.Data.SqlClient的 System.Data.SqlClient.TdsParser.TryProcessMetaData(的Int32 cColumns, TdsParserStateObject stateObj,_SqlMetaDataSet &元数据)。 TdsParser.TryRun(runBehavior runBehavior, 的SqlCommand cmdHandler,SqlDataReader的数据流, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布尔& dataReady)在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()在 System.Data.SqlClient.SqlDataReader.get_MetaData ()在 System.Data.SqlClient。 SqlCommand.FinishExecuteReader(SqlDataReader的DS, RunBehavior runBehavior,字符串resetOptionsString)在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,布尔 异步,的Int32超时,任务&任务,布尔asyncWrite, SqlDataReader的 DS)在 System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior 行为,字符串方法)在 System.Data.SqlClient.SqlCommand.ExecuteReader()在 SqlServerTests.Program.Main(字串[] args)在...

我假设我在.Net核心应用程序中使用此代码时错过了某些内容,但我无法找到。

任何帮助将不胜感激,

约翰

+0

嗨咸,谢谢你的回复,你对UDT是正确的。该表的地理数据类型为列,根据您的建议,我通过将其转换为varchar(CONVERT(varchar(100),[Location])并将查询结果加载为预期来选择此选项。 –

+0

我也卡住了在同样的问题中,你能否详细说明你的答案或者可能是代码片段 – Janak

+0

我想通了。谢谢:) – Janak

回答

1

望着SqlClient中的源代码,它会出现的UDT仍然非常不支持。在我的情况下,我试图插入一个包含HierarchyId列的记录。我收到'服务器试图使用此平台不支持的功能'。来自TdsParser。

类是(目前)这里: https://github.com/dotnet/corefx/blob/master/src/System.Data.SqlClient/src/System/Data/SqlClient/TdsParser.cs

如果你搜索SQLUDT你会发现类似下面的条目:

case TdsEnums.SQLUDT: 
    throw SQL.UnsupportedFeatureAndToken(_connHandler, SqlDbType.Udt.ToString()); 

这是MyGet包:System.Data .SqlClient 4.1。1-beta-24222-02

更新:我能够通过在字符串表示中发送HierarchyId来获得简单的插入语句,以便通过Dapper工作。在这个阶段SqlBulkCopy仍然是一个不行。从读取的角度来看,如果我引用SELECT语句中的HierarchyId列,则会收到不受支持的异常。但是,在SQL查询中使用SQL转换CONVERT(varchar(8000), [HierarchyColumn])至少会成功返回字符串表示。

它是有道理的,它不像我们有权访问现有的UDT类,如SqlHierarchyId。

如果更改原始StringBuilder statement = new StringBuilder("SELECT * FROM calendars as i WHERE i.Id='[id]");,以便SELECT语句显式引用列并在UDT列上执行转换,则应该返回更有用的东西。

相关问题