首页 > 解决方案 > SQL 参数对象类型映射

问题描述

我的代码中出现“不存在映射”错误,应该将记录插入到 SQL Server 表中。我可以说它与我的参数设置有关,但仅此而已。从我的谷歌搜索来看,我的基本代码结构似乎与如何使用 SQL 参数和 C# 一致,但我显然遗漏了一些东西。违规代码的图片如下:

在此处输入图像描述

编辑每个反馈,添加代码块:

            using (SqlConnection connection = new SqlConnection(ConnHelper.CnnVal("DWTest")))
        {
            connection.Open();
            SqlParameter jsonText = new SqlParameter("@Param1", System.Data.SqlDbType.NVarChar, -1)
            {
                Value = PostResult
            }; //-1 = max
            string sqlCMD =
                "DECLARE @json NVARCHAR(MAX) " +
                " SET @json = N'[ @Param1 ]'" +
                "DECLARE @FormattedJson NVARCHAR(MAX) = REPLACE(REPLACE(@json, '{\"success\":1,\"data\":[',''),']}','')" +
                  "Insert into Staging.CDOPSTest" +
                  "  SELECT *  FROM OPENJSON(@FormattedJson) " +
                  "  WITH (" +
                  "CallFrom char(10) 'strict $.call_from'," +
                  "Direction BIT '$.direction'," +
                  "[Hour] INT '$.hour'," +
                  "[Minute] INT '$.minute'," +
                  "ReachedServerLevel CHAR(5) '$.reached_service_level'," +
                  "CallDate NVARCHAR(256) '$.date'," +
                  "TalkTime INT '$.talk_time'," +
                  "AnswerSpeed INT '$.speed_to_answer'," +
                  "DID INT '$.did'," +
                  "StartTime NVARCHAR(256) '$.start_time'," +
                  "Endtime NVARCHAR(256) '$.end_time'," +
                  "ContactID  BIGINT '$.contact_id'," +
                  "AccountType NVARCHAR(256) '$.account_type'" +
                  ")";

            SqlCommand cmd = new SqlCommand(sqlCMD, connection);
            cmd.Parameters.AddWithValue("Param1", jsonText);
            cmd.ExecuteNonQuery();
            connection.Close();
        }

标签: c#sql-server

解决方案


您正试图将一个SqlParameter作为 SqlParameter 的对象值传递。错误消息的字面意思是它不知道将其转换为什么 SQL 类型。

您似乎正在尝试将字符串作为参数传递,因此您只需要...

cmd.Parameters.Add(jsonText);

而不是...

cmd.Parameters.AddWithValue("Param1", jsonText);

它将 SqlParameter 对象作为参数的值传递。

然后你需要修复你在查询中使用它的方式 - 你正在传递它,@Param1所以不需要创建@json参数并尝试通过在字符串中使用文字值来获取它,这不起作用 -你只会得到那个文字字符串,而不是参数的值。

SqlCommand 是 IDisposable 所以应该在一个using块中。

无需关闭连接,因为它会在退出连接using块时被隐式 Dispose 关闭。

我建议阅读我们是否可以停止使用 AddWithValue


推荐阅读