2

Microsoft.Data.SqlClient从(1.1.0 及更低版本)调用当前的 SQL Server 2019(15.0.2070.41)和本机编译的存储过程时,我遇到了巨大的问题。

使用 SQL Server 2017 或System.Data.SqlClient. 我在使用 JDBC 驱动程序的 Java 中也遇到了同样的问题。

显然,TdsParser它正在从 SQL Server 连接接收它不期望的数据,并且在解析期间引发异常。

System.InvalidOperationException:内部连接致命错误。

在 Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
在 Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
在 Microsoft.Data.SqlClient.SqlDataReader。 Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader 处的get_MetaData()
(SqlDataReader ds,RunBehavior runBehavior,字符串 resetOptionsString,布尔 isInternal,布尔 forDescribeParameterEncryption,布尔 shouldCacheForAlwaysEncrypted)
在 Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,布尔 isAsync,Int32 超时,任务和任务,布尔 asyncWrite,布尔 inRetry,SqlDataReader ds,布尔 describeParameterEncryptionRequest)
在 Microsoft.Data.SqlClient.SqlCommand。在 Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior
runBehavior , Boolean returnStream, String 方法)
在 Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为)
在 Microsoft.Data.SqlClient.SqlCommand.ExecuteReader()

应该重现问题的示例代码:

using System;
using System.Data;
using Microsoft.Data.SqlClient;

namespace SqlDbTest
{
    class Program
    {
        static void Main()
        {
            const string connString = "Server=localhost;Database=TestDb;Trusted_Connection=True";    
            const string prod = @"CREATE OR ALTER PROCEDURE dbo.NativeProdForTesting WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
                AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT,  LANGUAGE = N'us_english')
                    SELECT NULL AS testcol
                RETURN 0
                END";

            using (var con = new SqlConnection(connString))
            {
                using var createSp = con.CreateCommand();
                createSp.CommandText = prod;
                con.Open();
                createSp.ExecuteNonQuery();
            }

            try
            {
                using var con = new SqlConnection(connString);
                using var cmd = con.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "[dbo].[NativeProdForTesting]";
                cmd.Connection.Open();
                using var reader = cmd.ExecuteReader();
                Console.WriteLine("NO ERROR!");
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine(ex);
            }

        }
    }
}
4

0 回答 0