我正在尝试将特定的数据表值填充到表中。我正在使用表值参数。添加tabletype参数时,我抛出没有映射存在。你能找到这部分的bug吗?
以下是我的.NET调用
cmdabsSQL = dbabsSQL.CreateCommand()
cmdabsSQL.CommandText = "SP_INS_ResponseTable"
cmdabsSQL.CommandType = CommandType.StoredProcedure
cmdabsSQL.Parameters.Clear()
With dbabsSQL
.AddInParameter(cmdabsSQL, "@SystemName", DbType.String, SourceSysName)
.AddInParameter(cmdabsSQL, "@ClientName", DbType.String, ClientName)
.AddInParameter(cmdabsSQL, "@TableValueTypeII", SqlDbType.Structured, tablevaluedParam)
.AddOutParameter(cmdabsSQL, PARAM_OUT_SQLMSG, DbType.Int32, 100)
End With
intResult = dbBRLASQL.ExecuteNonQuery(cmdBRLASQL)
tablevaluedParam如下所示。
Dim tablevaluedParam As DataTable = dstDataset.Tables(1)
这里dstDataset有两个数据表,dstDataset表中的值由查询填充。我只是将收到的数据表映射到创建的类型。 以下是我的类型
CREATE TYPE TableValueTypeII AS TABLE
(ResultId BIGINT,
AccountId nvarchar(255),
RecStatusDesc varchar(100),
MatchCount int)
这是我的存储过程部分
Insert into ResponseTable(SrceSysNm,ClntId,GrpId,PrvdId,FileNm,AccId,RestId,
RespSendIn,CreatTs,LstUpdtTs,UserId)
select @SystemName,@ClientName,null,null,null,AccountId,ResultId,0,
GETDATE(),GETDATE(),'Batch' from @TableValueTypeII
dataTable与创建类型的排列方式相同。
答案 0 :(得分:1)
碰巧遇到了同样的问题。解决方案很简单dbabsSQL应该显式使用SqlDatabase而不是
Dim db = DatabaseFactory.CreateDatabase()
使用
Dim db As SqlDatabase = DatabaseFactory.CreateDatabase()
答案 1 :(得分:0)
尝试以这种方式进行操作,对我来说效果很好,
Dim _DataReader As SqlDataReader = Nothing
Dim SQLCon As New SqlClient.SqlConnection("Your connection string")
SQLCon.Open()
Dim SQLCom = New SqlCommand
With SQLCom
.Connection = SQLCon
.CommandText = "SP_INS_ResponseTable"
.CommandType = CommandType.StoredProcedure
Dim _Param1 As New SqlParameter("@SystemName", SqlDbType.Varchar)
Dim _Param2 As New SqlParameter("@ClientName", SqlDbType.Varchar)
Dim _Param3 As New SqlParameter("@TableValueTypeII", SqlDbType.Structured)
Dim _Param4 As New SqlParameter(PARAM_OUT_SQLMSG, SqlDbType.Int32)
//pass the parameters values here
_Param1.Value = _SystemName
_Param2.Value = _ClientName
_Param3.Value = _TableValueTypeII
_Param4.Value = _PARAM_OUT_SQLMSG
.Parameters.Add(_Param1)
.Parameters.Add(_Param2).
.Parameters.Add(_Param3)
.Parameters.Add(_Param4)
End With
_DataReader = SQLCom.ExecuteReader()
While (_DataReader.Read)
Dim _Record As New (your own returned data type)
With _Record
.SystemName = (_DataReader(0)) // make sure they are not null(_DataReader(x)) assign it to empty string if so
.ClientName = (_DataReader(1))
.TableValueTypeII = (_DataReader(2))
.PARAM_OUT_SQLMSG = (_DataReader(3))
End With
return _Record
End While
SQLCon.Close()
SQLCon.Dispose()
SQLCom.Dispose()
答案 2 :(得分:-1)
你可以创建如下的动态sql:
declare @SQL nvarchar(4000)
set @SQL = N'Insert into ResponseTable(SrceSysNm,ClntId,GrpId,PrvdId,FileNm,AccId,RestId,
RespSendIn,CreatTs,LstUpdtTs,UserId)
select '+ @SystemName+','+@ClientName+',null,null,null,AccountId,ResultId,0,
GETDATE(),GETDATE(),''Batch'' from '+ @TableValueTypeII
EXEC sp_executesql @SQL;
然后将表名作为简单的字符串值传递。
注意:请在形成动态SQL时检查单引号