我有一个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循环中我做错了什么?
答案 0 :(得分:0)
每次循环时,您都会添加命令的ParameterCollection。这意味着只有第一批才能一次又一次地阅读。在使用cmd1.Parameters.Clear()
添加新集合之前,您需要清除集合。