Sql server 在for each循环中调用vb.net webservice中的sql server存储过程
我有一个vb.net Web服务,它接收复杂对象的列表,循环对象,尝试连接到sql server以调用存储过程,并返回插入数据的id 这是我的web服务代码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
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