"无效缓冲区接收从客户端的错误消息 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) 的网站:
http://msdn2.microsoft.com/en-us/library/aa276823(SQL.80).aspx
http://msdn2.microsoft.com/en-us/library/aa258271(SQL.80).aspx

属性

文章编号: 827366 - 最后修改: 2007年4月18日 - 修订: 3.4
这篇文章中的信息适用于:
  • Microsoft .NET Framework 1.0
关键字:?
kbmt kbprb KB827366 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 827366
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com