【问题标题】:No mapping exists from dbtype 30 to a known sqldbtype不存在从 dbtype 30 到已知 sqldbtype 的映射
【发布时间】:2018-03-02 04:12:01
【问题描述】:

我正在尝试将特定的数据表值填充到表中。我正在使用表值参数。在添加 tabletype 参数时,我被抛出不存在映射。你能找到这部分的错误吗?

下面是我的 .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 的排列与创建的类型相同。

【问题讨论】:

  • 我猜它与tablevaluedParam 有关。你能说明你是如何创建这个变量的吗?
  • tablevaluedParam 由一个数据表组成,该数据表是通过从另一个存储过程中检索值获得的。我只是将收到的数据表映射到创建的类型
  • 哪一行抛出异常?你在使用 SQL Server 吗?
  • .AddInParameter(cmdabsSQL, "@TableValueTypeII", SqlDbType.Structured, tablevaluedParam) 这行抛出参数异常
  • Dim tablevaluedParam As DataTable = dstDataset.Tables(1) 这里 dstDataset 有两个数据表,dstDataset 表中的值由查询填充。这些的数据类型是一样的

标签: c# ado.net sqldbtype dbtype


【解决方案1】:

只是偶然发现了同样的问题。解决方案很简单 dbabsSQL 应该是 SqlDatabase 而不是

Dim db = DatabaseFactory.CreateDatabase()

使用

Dim db As SqlDatabase = DatabaseFactory.CreateDatabase()

【讨论】:

    【解决方案2】:

    尝试这样做,对我来说效果很好,

        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()
    

    【讨论】:

      【解决方案3】:

      您可以像下面这样创建动态 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时请检查单引号

      【讨论】:

      • 感谢您的回答。但我的问题是在执行存储过程本身之前引发了参数异常。同时将数据表映射到创建的表类型
      • @GladstoneJaffrey,好吧,我的错。你在用sql server吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多