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);
}
}
}
}