在vb.net webservice中为每个循环调用sql server存储过程

时间:2014-05-18 14:56:14

标签: sql-server vb.net web-services

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

这是我的网络服务代码

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 

这是我的存储过程

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

我遇到的问题是for循环中出现问题,第二次循环执行它似乎缓存了第一个值,输出参数返回dbnull。 如果我取出for循环并手动调用上面的代码,将i替换为0然后1 ....(Dim log As MediSenseLog = logs(0))代码完美无缺。

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

1 个答案:

答案 0 :(得分:0)

每次循环时,您都会添加命令的ParameterCollection。这意味着只有第一批才能一次又一次地阅读。在使用cmd1.Parameters.Clear()添加新集合之前,您需要清除集合。