Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在infopath表单中从vb.net调用Sql过程_Vb.net - Fatal编程技术网

在infopath表单中从vb.net调用Sql过程

在infopath表单中从vb.net调用Sql过程,vb.net,Vb.net,我正在尝试执行以下代码以使用vb.net从infopath表单调用sql过程,我调试并检查了错误,但代码执行正确,在检索执行过程后收到的输出消息时遇到问题 请帮助我尽快解决这些问题 谢谢 Try Dim con As New SqlConnection("Data Source= XXXX;Initial Catalog= XXXXX;Integrated Security=true") Dim cmd As New SqlCommand D

我正在尝试执行以下代码以使用vb.net从infopath表单调用sql过程,我调试并检查了错误,但代码执行正确,在检索执行过程后收到的输出消息时遇到问题

请帮助我尽快解决这些问题

谢谢

Try
         Dim con As New SqlConnection("Data Source= XXXX;Initial Catalog= XXXXX;Integrated Security=true")
         Dim cmd As New SqlCommand
         Dim dr As SqlDataReader
         con.Open()
         cmd.CommandType = Data.CommandType.StoredProcedure
         cmd.CommandText = "Procedure Name"
         cmd.Parameters.Add(New SqlParameter("@Name", SqlDbType.VarChar, 50)).Value = "XXX" 
         cmd.Parameters.Add(New SqlParameter("@CustID", SqlDbType.VarChar, 20)).Value = "XXX"  
         cmd.Connection = con
         dr = cmd.Executereader()
         dr.Read()
         If dr.HasRows Then
             MessageBox.Show(dr.GetString(0))
         End If
                con.Close()
Catch ex As Exception
         MessageBox.Show(ex.Message)
End Try
我的Sql过程:

enter code here

Create procedure Test_Infopath

@Name varchar(50),
@CustID Varchar(20)
      AS 

      Declare @Condition INT
      SELECT @Condition = CustID FROM temp_infopath WHERE CustID = @CustID
      IF @CustID= @Condition
      BEGIN 
                Print 'Customer ID already Exists'
      END
      Else 
                Print 'Submit the form to insert the data'

因此,您希望在存储过程中返回消息,而不是记录。
但是,SqlDataReader和ADO.NET的其他方法被认为是返回记录而不是消息字符串。
我建议你这样改变你的程序

ALTER PROCEDURE Test_Infopath
    @Name varchar(50),
    @CustID Varchar(20)
    AS 

    Declare @Condition INT
    SELECT @Condition = CustID FROM temp_infopath WHERE CustID = @CustID

    IF @CustID= @Condition
        SELECT 'Customer ID already Exists'
    Else 
        SELECT 'Submit the form to insert the data'
现在,SqlDataReader将看到消息作为SELECT返回的记录
顺便说一句,当您返回由一行组成的单个记录时,编写此场景的常用方法是通过SqlCommand的ExecuteScalar方法,而不涉及像SqlDataReader这样的另一个对象实例

cmd.Connection = con
Dim message = cmd.ExecuteScalar().ToString()
MessageBox.Show(message)

是否确实有一个带空格的过程名,或者该名称只是一个占位符?ExecuteReader将返回存储过程中最后一条SELECT语句的结果。如果存在select(仅在尝试读取任何内容之前应用测试HasRows),则代码应该可以工作。如果HasRows返回false,则没有要读取的行。我认为您需要在问题中添加您认为正在返回“消息”的过程代码,但我的过程在尝试使用相同参数在sql窗口中返回消息,因此如何解决这些问题?我不理解您所说的“消息”是什么意思。要使
HasRows
返回true,您的过程应该返回通过SELECT(也称为记录)而不是一般字符串消息获得的行。SqlDataReaderthanks现在没有返回,工作正常,我可以从过程中检索消息,我的问题解决了。非常感谢您的帮助