MSSQL / VB.NET将数据插入到程序表中

时间:2016-07-16 13:03:55

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

我正在建立一个允许您将某些数据输入表格的系统。如果数据可能为空,则为某些字段。该过程返回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

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

请帮助我。

1 个答案:

答案 0 :(得分:0)

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

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

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