PRB:在使用 Visual Basic .NET 添加参数之前调用 Command.Prepare 时 SQL Server 7.0 出错

文章翻译 文章翻译
文章编号: 310368 - 查看本文应用于的产品
本文的发布号曾为 CHS310368
本文已归档。它按“原样”提供,并且不再更新。
有关本文的 Microsoft Visual C# .NET 版本,请参见 311348

本文引用下面的 Microsoft .NET 框架类库名称空间:
  • System.Data.OleDb
  • System.Data.SqlClient
展开全部 | 关闭全部

本文内容

症状

在针对 Microsoft SQL Server 7.0 创建参数化命令时,如果在向该命令添加参数之前调用 Prepare 方法,则会收到以下错误信息:
An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in system.data.dll.
Additional information: System error.
此问题不会在 SQL Server 2000 中出现。

原因

此问题出现在 SQL Server 7.0 中,这是由于按照设计,您不能在添加参数之前运行 Prepare 方法。多数数据库系统都有这一情况。

SQL Server 2000 不出现上述异常,这是由于它在执行第一个命令之前不运行 Prepare。这一优化可防止在后面不接着执行命令的情况下由 Prepare 带来的开销。

解决方案

若要解决此问题,请不要在添加参数之前调用 Prepare 方法。

更多信息

再现现象的步骤

下面的示例代码使用罗斯文 (Northwind) 示例数据库的 Region 表。
  1. 启动 Microsoft Visual Studio .NET。
  2. 新建一个 Visual Basic Windows 应用程序项目。默认情况下会将 Form1 添加到项目中。
  3. 确保您的项目包含一个对 System.Data 名称空间的引用,如果未包含,请添加一个对此名称空间的引用。
  4. 在 Form1 上放置一个按钮控件。将按钮的 Name 属性更改为 btnTest,将 Text 属性更改为 Test
  5. SystemSystem.Data.OleDb System.Data.SqlClient 名称空间上使用 Imports 语句,这样,以后就不需要在代码中限定这些名称空间中的声明了。将下面的代码添加到 Form1 的"General Declarations"一节:
    Imports System
    Imports System.Data.OleDb
    Imports System.Data.SqlClient
  6. 将下面的代码添加到"代码"窗口中"Windows 窗体设计器生成的代码"区域之后:
    Private Sub btnTest_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnTest.Click
    Dim myConnString As String = _
    "User ID=sa;password=sa;Initial Catalog=Northwind;Data Source=myServer"
    Dim id As Integer = 25
    Dim desc As String = "myFirstRegion"
    Dim rConn As SqlConnection = New SqlConnection(myConnString)
    rConn.Open()
    Dim command As SqlCommand = New SqlCommand("", rConn)
    command.CommandText = "insert into Region (RegionID, RegionDescription)" & _
    "values (@id, @desc)"
    
    'SQL Server 7.0 throws an exception here.
    'Comment the following line to resolve this problem against SQL Server 7.0.
    command.Prepare() 
    
    command.Parameters.Add("@id", SqlDbType.Int, 4)
    command.Parameters.Add("@desc", SqlDbType.Char, 50)
    'You can call Prepare after you set up CommandText and parameters.
    command.Prepare() 
    
    command.Parameters(0).Value = id
    command.Parameters(1).Value = desc
    command.ExecuteNonQuery()
    MessageBox.Show("Updated Successfully")
    End Sub
  7. 根据您的环境相应地修改连接字符串 (myConnString)。
  8. 保存项目。在调试菜单上,单击开始以运行您的项目。
  9. 单击测试。如果是与 SQL Server 7.0 数据库相连,则该代码将生成上述异常。

    如果是与 SQL Server 2000 数据库相连,则该代码将正常运行,并出现"Updated Successfully"(已成功更新)消息框。
  10. 若要针对 SQL Server 7.0 解决此问题,则注释掉对 command.Prepare (位于添加参数的代码之前)的调用,然后再次运行该项目。

参考

有关 ADO.NET 对象和语法的更多信息,请参阅以下 Microsoft .NET 框架软件开发工具包 (SDK) 文档:
使用 ADO.NET 访问数据
http://msdn2.microsoft.com/en-us/library/e80y5yhx(vs.71).aspx

属性

文章编号: 310368 - 最后修改: 2014年2月24日 - 修订: 1.1
这篇文章中的信息适用于:
  • Microsoft ADO.NET(随 .NET 框架提供)
  • Microsoft Visual .NET 2002 标准版
  • Microsoft SQL Server 7.0 标准版
关键字:?
kbnosurvey kbarchive kbnofix kbsqlclient kbsystemdata kbprb kbgrpdsvbdb kboledb kbgrpdsmdac KB310368
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