我有一个使用FOR XML的存储过程,它被映射到一个ef函数。不幸的是,我发现它只返回一定长度的块。
另一个SO用户向我指出了这个问题,这个问题相当诱人地暗示了我的问题的答案,只是附加xml块。不幸的是,它没有继续说明如何做到这一点。谁能告诉我该怎么做?我正在用vb编程。
编辑这是在我的实体模型中生成的函数:
Public Overridable Function CreateErsSalesAddSubmission (ByVal uname As String, ByVal pword As String, ByVal salesContractRef As String, ByVal auctionId As String, ByVal sntype As String, ByVal action As String) As String
Dim connection As EntityConnection = DirectCast(DirectCast(Me, IObjectContextAdapter).ObjectContext.Connection, EntityConnection)
Dim needClose As Boolean = False
If (connection.State <> System.Data.ConnectionState.Open) Then
connection.Open()
needClose = True
End If
Dim result As String
Try
Using command As EntityCommand = New EntityCommand()
If DirectCast(Me, IObjectContextAdapter).ObjectContext.CommandTimeout.HasValue Then
command.CommandTimeout = DirectCast(Me, IObjectContextAdapter).ObjectContext.CommandTimeout.Value
End If
command.CommandType = System.Data.CommandType.StoredProcedure
command.CommandText = "FishTrackerProfessionalEntities.CreateErsSalesAddSubmission"
command.Connection = connection
Dim unameParameter As EntityParameter = New EntityParameter("uname", System.Data.DbType.String)
If (Not uname Is Nothing)
unameParameter.Value = uname
End If
command.Parameters.Add(unameParameter)
Dim pwordParameter As EntityParameter = New EntityParameter("pword", System.Data.DbType.String)
If (Not pword Is Nothing)
pwordParameter.Value = pword
End If
command.Parameters.Add(pwordParameter)
Dim salesContractRefParameter As EntityParameter = New EntityParameter("salesContractRef", System.Data.DbType.String)
If (Not salesContractRef Is Nothing)
salesContractRefParameter.Value = salesContractRef
End If
command.Parameters.Add(salesContractRefParameter)
Dim auctionIdParameter As EntityParameter = New EntityParameter("auctionId", System.Data.DbType.String)
If (Not auctionId Is Nothing)
auctionIdParameter.Value = auctionId
End If
command.Parameters.Add(auctionIdParameter)
Dim sntypeParameter As EntityParameter = New EntityParameter("sntype", System.Data.DbType.String)
If (Not sntype Is Nothing)
sntypeParameter.Value = sntype
End If
command.Parameters.Add(sntypeParameter)
Dim actionParameter As EntityParameter = New EntityParameter("action", System.Data.DbType.String)
If (Not action Is Nothing)
actionParameter.Value = action
End If
command.Parameters.Add(actionParameter)
result = CType(command.ExecuteScalar(), String)
End Using
Finally
If needClose Then
connection.Close()
End If
End Try
Return result
End Function
不是让它返回字符串的标量值(被截断),我应该让它返回其他东西,如果是什么,又是如何处理返回。由于
我会修改你发布的函数,只更改这些行:
Public Overridable Function CreateErsSalesAddSubmissionXml (ByVal uname As String, ByVal pword As String, ByVal salesContractRef As String, ByVal auctionId As String, ByVal sntype As String, ByVal action As String) As String
...
using reader as EntityDataReader = command.ExecuteReader()
If reader.HasRows Then
Do While reader.Read()
result = result + reader.GetString(0)
Loop
End If
End Using
将行result = CType(command.ExecuteScalar(), String)
替换为此
您应该重命名该方法(我在名称中添加了Xml
,确保将其放在一个具有不同名称的文件中,这样文件就不会被覆盖),以便您在使用EF向导重新生成它时不会意外地覆盖它。这似乎可能会给您提供正确使用相同EF连接逻辑和整体框架的最佳平衡,但仍然可以让您正确处理返回的XML—EF似乎并没有真正为此设置(通常也可能不需要)。