不存在从dbtype 30到已知sqldbtype的映射

时间:2018-03-02 04:12:02

标签: c# ado.net sqldbtype dbtype

我正在尝试将特定的数据表值填充到表中。我正在使用表值参数。添加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与创建类型的排列方式相同。

3 个答案:

答案 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时检查单引号