如何执行包含INSERT和SELECT两个语句的存储过程

时间:2014-06-24 14:32:41

标签: .net ado.net executenonquery executescalar executereader

在我的存储过程中,首先执行INSERT查询,然后使用SELECT语句,如下所示:

        INSERT ()

        SELECT * FROM preferences WHERE ID=@ID

在ADO.NET中,我使用了 - datareader来执行此过程。

但是,它不返回SELECT值,甚至没有执行INSERT statemnt。

任何人都可以告诉我这里有什么问题吗?

CODE:

             strSPROC = "sproc_SaveAndRetrieve"
            Using cmd As New Data.SqlClient.SqlCommand
                cmd.CommandText = strSPROC
                cmd.CommandType = Data.CommandType.StoredProcedure
                cmd.Parameters.Clear()
                cmd.Parameters.AddWithValue("@tvp", CreateDatatableFromCollection(s, isValueOn))
                cmd.Parameters.AddWithValue("@GroupID", syGroupID)

                Using myReader As SqlDataReader = DBManager.GetDataReader(cmd)
                    If myReader.HasRows Then
                        NotFoundRecords= New List(Of String)
                        While myReader.Read()
                            NotFoundRecords.Add(DataHelper.GetString(myReader, "Student"))
                        End While
                    End If

                    Return NotFoundRecords
                    myReader.Close()
                End Using
            End Using

谢谢

从SQL SERVER手动执行时,过程正在运行文件。

1 个答案:

答案 0 :(得分:1)

如果这甚至没有执行插入,那么你需要捕获错误。

try 
{
    ...
}
catch (SqlException ex) 
{
    Debug.WriteLine(ex.message);
}
finally 
{
    // close connection
}

select应该在NextResultSet中,但需要先修复插入。

您不会显示DataHelper.GetString 该插入将返回一个整数而不是一个字符串 我不相信你的陈述,没有例外被抛出。
.NET将报告SQL错误 即使该插入影响0行,那么你应该得到0 如果失败那么你应该得到一个例外 如果它在SSMS中插入行但不在.NET中插入(并且不会抛出错误),那么您不会在.NET中执行相同的参数。

DataHelper.GetString(myReader,"学生"))做什么?
NotFoundRecords只是一个字符串列表。

这是非常可疑的 第一个语句应该返回一个int

While myReader.Read()
    NotFoundRecords.Add(DataHelper.GetString(myReader, "Student"))
End While

我希望这样的事情

myReader.Read()
int rowInserted = myReader.GetInt32()
myReader.NextResultSet()
while myReader.Read()
  string sss = myReader.GetString()
End While
myReader.Close()