SQL参数对象类型映射

时间:2019-01-29 20:20:55

标签: c# sql-server

我的代码上出现“不存在映射”错误,该错误应将记录插入SQL Server表中。我可以告诉大家,它是与参数设置我有,但没有比这更多。从我的谷歌搜索来看,我的基本代码结构似乎与如何使用SQL参数和C#保持一致,但是我显然缺少一些东西。下图为违规代码:

enter image description here

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

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

2 个答案:

答案 0 :(得分:1)

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

您似乎正在尝试将 string 作为参数传递,因此您只需要执行...

cmd.Parameters.Add(jsonText);

而不是...

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

哪个将SqlParameter对象作为参数值传递。

然后,您需要确定查询中的用法-您将其作为@Param1传递,因此无需创建@json参数并尝试使用字符串中的文字值,将不起作用-您将只获取该文字字符串,而不是参数的值。

SqlCommand是IDisposable的,因此应放在using块中。

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

我建议您阅读can we stop using AddWithValue

答案 1 :(得分:0)

使用Add(SqlParameter)代替AddWithValue(String, Object),因为后者是一种方便的方法,它试图根据所传递的SqlParameter创建一个Object。 (或者,尝试AddWithValue("@Param1", PostResult)。)