你目前正处于脱机状态,正在等待 Internet 重新连接

"无效缓冲区接收从客户端的错误消息 SQL Server 日志时,使用 SQL Server.net 提供程序类中

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 827366
本文已归档。它按“原样”提供,并且不再更新。
症状
您在使用 Microsoft.net 框架 SqlClient 类时您在 Microsoft SQL Server 2000 错误日志中收到以下错误消息:
错误: 17805 严重性: 20,状态: 3
从客户接收的缓冲区无效。
在 Microsoft.net 框架客户端应用程序中收到下面的相应错误消息:
System.Data.SqlClient.SqlException: 当前命令发生了严重错误。在的结果如果任何,应被放弃
原因
如果下列情况之一为真,则会发生此行为:
  • Finalize 方法或 C# 析构函数中,您可以使用 SqlClient 类。
  • 当您创建一个 SqlParameter 对象时未指定显式 SQLDbType 枚举。当您不指定一个显式 SQLDbType 枚举 Microsoft.net Framework 数据提供程序为 SQL Server (SqlClient) 试图选择正确的 SQLDbType 枚举的基础传递的数据。SqlClient 将失败。
  • 您声明 SqlClient 类是 静态 在 C# 中,或无法 共享 Visual Basic 中的一个实例。可以从应用程序中的多个线程同时访问该实例。

    注意在 ASP.NET 环境中或在其他环境中的某些,并发访问是可能的即使在应用程序代码中显式创建的任何其他线程。
  • 在.net 框架的代码中显式指定的参数的大小大于最大大小以便您可以用它来在 SQL Server 数据类型。

    例如对于根据对 SQL Server 联机丛书,nvarchar 是的 n 个字符的可变长度 Unicode 字符数据。"n"必须是一个介于 1 到 4000。如果您指定一个大小,也就是多比为 nvarchar 参数 4000,您将收到"症状"部分中描述的错误消息。
下面的代码还演示了如何可能会出现这些错误:
Stored Procedure--------------------------CREATE PROCEDURE spParameterBug @myText Text AS            Insert Into ParameterBugTable (TextField) Values (@myText)Code-------static void Main(string[] args){       string dummyText=string.Empty;       for (int n=0; n < /*80*/ 3277; n++)   // change this to 80 to receive the second error that is mentioned earlier in this article.       {             dummyText += "0123456789";       }        // TO DO: Change data source to match your SQL Server:       SqlConnection con= new SqlConnection("data source=myserver;Initial Catalog=mydb;Integrated Security=SSPI;persist security info=True;packet size=16384");       SqlCommand cmd = new SqlCommand("SpParameterBug", con);      con.Open();           // Causes error 17805:      SqlParameter param2 =new SqlParameter("@myText", dummyText);      cmd.CommandType = CommandType.StoredProcedure;      cmd.Parameters.Add(param2);      try      {          cmd.ExecuteNonQuery();      }       catch (Exception err)      {         Console.WriteLine(err.ToString());      }      Console.ReadLine();}
解决方案
要解决这些错误,请确保您执行以下:
  • Finalize 方法或 C# 析构函数中,请不要使用 SqlClient 类。
  • 指定 SqlDbType 枚举 SqlParameter 对象,以便在没有推断出的类型。
  • 指定在该数据类型的限度内的参数大小。
参考
有关最大大小为不同的数据类型的详细信息,请访问以下 Microsoft 开发人员网络 (MSDN) 的网站:

警告:本文已自动翻译

属性

文章 ID:827366 - 上次审阅时间:12/08/2015 04:27:11 - 修订版本: 3.4

Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbprb KB827366 KbMtzh
反馈