Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
Sql server 在for each循环中调用vb.net webservice中的sql server存储过程_Sql Server_Vb.net_Web Services - Fatal编程技术网

Sql server 在for each循环中调用vb.net webservice中的sql server存储过程

Sql server 在for each循环中调用vb.net webservice中的sql server存储过程,sql-server,vb.net,web-services,Sql Server,Vb.net,Web Services,我有一个vb.net Web服务,它接收复杂对象的列表,循环对象,尝试连接到sql server以调用存储过程,并返回插入数据的id 这是我的web服务代码 Public Class MediSenseLog Public ID As Integer Public LogDate As String End Class <WebMethod()> _ Public Function Sample( ByVal logs As Med

我有一个vb.net Web服务,它接收复杂对象的列表,循环对象,尝试连接到sql server以调用存储过程,并返回插入数据的id

这是我的web服务代码

Public Class MediSenseLog
        Public ID As Integer
        Public LogDate As String

    End Class

<WebMethod()> _
    Public Function Sample( ByVal logs As MediSenseLog()) As String
        LSSID = "22"
        Dim numLogs As Integer = logs.Length ' number of logs received 
        Dim LogsSent(2, numLogs) As String ' set up a multidimensional array

        Dim cmd1 As New OdbcCommand

        Dim LSID As Int64
        Dim str As String = "" 'holds a built up string so that I can see what it is returning

        For i = 0 To numLogs - 1
            Dim log As MediSenseLog = logs(i)
            Try
                Using sqlconnect1 As New OdbcConnection(ConfigurationManager.ConnectionStrings("BasicConnectionString").ConnectionString)
                    sqlconnect1.Open()
                    cmd1.Connection = sqlconnect1
                    cmd1.CommandType = Data.CommandType.StoredProcedure
                    cmd1.CommandText = "{ CALL spInsertLogsSubmitted(?,?,?,?) }"

                    cmd1.Parameters.AddWithValue("@LSSID", Int64.Parse(LSSID))
                    cmd1.Parameters.AddWithValue("@MobileAppLogID", Int64.Parse(log.ID.ToString))
                    cmd1.Parameters.AddWithValue("@MobileAppLogDate", DateTime.Parse(log.LogDate.ToString))

                    Dim id As OdbcParameter
                    id = cmd1.Parameters.Add("@LSID", OdbcType.BigInt)
                    id.Direction = Data.ParameterDirection.Output

                    cmd1.ExecuteNonQuery()
                    str = str & "*" & log.ID.ToString & "*" & log.LogDate.ToString & "*" & id.Value.ToString
                    LSID = Int64.Parse(id.Value) ' return value from stored pprocedure

                    LogsSent(0, i) = log.ID.ToString
                    LogsSent(1, i) = log.LogDate.ToString
                    LogsSent(2, i) = id.Value.ToString

                End Using
            Catch e As OdbcException

            End Try
        Next i

        Return str
    End Function 

我遇到的问题是for循环中出现了问题,第二次执行循环时,它似乎缓存了第一个值,输出参数返回dbnull。 如果我取出for循环并通过将i替换为0手动调用上面的代码,那么1。。。。(Dim log As MediSenseLog=logs(0))代码工作正常


在这个for循环中我做错了什么?

每次通过循环时,您都会添加到命令的参数集合中。这意味着只有第一个被读取。。。一次又一次。在添加带有
cmd1.Parameters.clear()

的新集合之前,您需要清除集合“我遇到的问题是for循环中出现了问题”-您考虑过使用调试器吗?我不知道如何调试Web服务。它是一款android应用程序,可以调用webservice。所以我要做的就是不断返回值,看看问题出在哪里,因此str字符串。在for循环中的第二次,它插入第一个对象的值,然后存储过程的输出为null。据我所知就这些。您可以用另一种方式帮助我调试吗?看起来您在添加参数之前忘记调用
cmd1.Parameters.Clear()
。此外,如果您使用的是SQL Server,那么最好使用SqlClient而不是OdbcClient(您可以命名参数,并且它将针对SQL Server进行优化)。如果可以,请避免使用
.AddWithValue
并使用
.Add
方法,因为它可以避免猜测数据类型—可能正确,也可能错误。最后,您有一个空的
Catch
,它将向您隐藏错误:您需要查看这些错误。非常感谢Andrew Morton。我完全按照你说的做了,而且效果很好。我已经把我评论的第一部分做成了一个答案,这样你可以接受它,如果你愿意的话,这会让其他人更容易找到你的问题,看看是什么解决了它。
alter PROCEDURE [dbo].[spInsertLogsSubmitted](
    @LSSID bigint,
    @MobileAppLogID bigint,
    @MobileAppLogDate datetime,
    @LSID bigint output
)
AS
BEGIN

    SET NOCOUNT ON


    BEGIN
         INSERT INTO [tblLogsSubmitted]([LSSID],[MobileAppLogID],[MobileAppLogDate])
        VALUES( @LSSID,@MobileAppLogID,@MobileAppLogDate)

        set @LSID = SCOPE_IDENTITY()
    END

END