2016-06-22 51 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列上執行轉換,則應該返回更有用的東西。

相關問題