【问题标题】:MSSQL/VB.NET INSERT DATA INTO TABLE WITH PROCEDUREMSSQL/VB.NET 使用过程将数据插入表中
【发布时间】:2016-07-16 13:03:54
【问题描述】:

我正在制作一个允许您将一些数据输入表格的系统。如果数据可能为空,则某些字段。该过程返回一个 IDENTITY 类型的值。下面是使用 VB.NET 输入数据的子程序:

Public Sub ownersWithReturn(ByVal fName As String)
        SqlConn.ConnectionString = Server
        Command = New SqlCommand()
        Command.CommandType = CommandType.StoredProcedure
        Command.CommandText = "EnterIntoPetOwners"
        Command.Parameters.Add("@ownername", SqlDbType.VarChar).Value = Clinician.txtOName.Text.Trim
        Command.Parameters.Add("@clinicno", SqlDbType.Int).Value = Clinician.lblClinicNum.Text.Trim
        Command.Parameters.Add("@owneraddress", SqlDbType.VarChar).Value = Clinician.txtOAddress.Text.Trim
        Command.Parameters.Add("@insuno", SqlDbType.Int).Value = Clinician.txtInsuNum.Text.Trim
        Command.Parameters.Add("@insudets", SqlDbType.VarChar).Value = Clinician.txtInsurDetails.Text.Trim
        Command.Parameters.Add("@id", SqlDbType.Int).Direction = ParameterDirection.Output
        Command.Connection = SqlConn
        Try
            SqlConn.Open()
            Command.ExecuteNonQuery()
            Dim id As String = Command.Parameters("@id").Value.ToString()
            Clinician.lblOwnerNum.Text = id
            Clinician.lblOwnerNum.ForeColor = Color.Black
            Dim result As Integer
            If result = 1 Then
                correctMes(1)
                nullControls(fName)
            Else
                errorMes(1)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            SqlConn.Close()
        End Try
    End Sub

下面是用于插入数据的 MSSQL PROCEDURE:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[EnterIntoPetOwners]
      @ownername VARCHAR(255),
      @clinicno INT,
      @owneraddress VARCHAR(500),
      @insuno INT,
      @insudets VARCHAR(500),
      @id int output
AS
BEGIN
      SET NOCOUNT ON;
      INSERT INTO  Pet_Owners (Owner_Name,Clinic_No,Owner_Address,Insurance_No,Insurance_Details) 
      VALUES (@ownername,@clinicno,@owneraddress,@insuno,@insudets)
      SET @id=SCOPE_IDENTITY()
      RETURN  @id
END

可能为空的数据库变量是 VARCHAR 数据类型的“@insudets”和数据类型 INT 的“@insuno”。 使用表单输入数据时,当上述两个字段不为空时,不会发生错误,但当它们为空且没有数据可用时,会显示错误“Failed to convert parameter value from a string to Int32”。

请帮帮我。

【问题讨论】:

  • 看起来当您从表单字段中获取空值时,您正在向存储过程发送一个 emtpy 字符串作为参数。您应该发送 null,而不是空字符串,它们完全不同: ("@insuno", SqlDbType.Int).Value = Clinician.txtInsuNum.Text.Trim ) 。这似乎是我的问题。
  • 你不应该返回@id。当它是OUTPUT 参数时设置它的值就是您所需要的。 RETURN 用于传达执行状态 - 例如成功或失败。

标签: sql-server vb.net stored-procedures


【解决方案1】:

当您想在数据库中插入一个 NULL 值时,您需要为该参数传递 DBNull.Value。根据您的代码,如果两个文本框为空,您似乎希望将匹配字段设置为空。在这种情况下,您检查并选择要插入的值

Dim insuno = IF(string.IsNullOrWhiteSpace(Clinician.txtInsuNum.Text),
                DBNull.Value, Clinician.txtInsuNum.Text.Trim)
Dim insudets = IF(string.IsNullOrWhiteSpace(Clinician.txtInsurDetails.Text),
                DBNull.Value, Clinician.txtInsurDetails.Text.Trim)

....

Command.Parameters.Add("@insuno", SqlDbType.Int).Value = insuno
Command.Parameters.Add("@insudets", SqlDbType.VarChar).Value = insudets

如果没有这个检查,空字符串会进入数据库引擎,试图将其转换为数字。这会触发异常,因为空字符串无法转换为整数

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多