C# SQL参数对象类型映射

C# SQL参数对象类型映射,c#,sql-server,C#,Sql Server,我的代码中出现“不存在映射”错误,应该将记录插入SQL Server表中。我可以看出这与我的参数设置有关,但仅此而已。通过我的谷歌搜索,我的基本代码结构似乎与如何使用SQL参数和C#相一致,但我显然遗漏了一些东西。违规代码的下图: 按反馈编辑,添加代码块: using (SqlConnection connection = new SqlConnection(ConnHelper.CnnVal("DWTest"))) { conn

我的代码中出现“不存在映射”错误,应该将记录插入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();
        }

使用而不是,因为后者是一种方便的方法,尝试从传递的
对象创建
SqlParameter
。(或者,尝试
AddWithValue(“@Param1”,PostResult)

您正在尝试将
SqlParameter
作为SqlParameter的对象值传递。错误消息实际上是说它不知道要将其转换成什么样的SQL类型

您似乎试图将字符串作为参数传递,因此只需执行以下操作

cmd.Parameters.Add(jsonText);
而不是

cmd.Parameters.AddWithValue("Param1", jsonText);
它将SqlParameter对象作为参数值传递

然后,您需要修复如何在查询中使用它-您将其作为
@Param1
传递,因此无需创建
@json
参数,并尝试通过在字符串中使用文字值来实现它,这是行不通的-您只会得到文字字符串,而不是参数的值

SqlCommand是IDisposable的,因此应该位于使用
块的

不需要关闭连接,因为当它使用
块退出连接的
时,隐式Dispose将关闭该连接


我建议阅读。

cmd.Parameters.AddWithValue(“@Param1”,jsontext)会导致相同的错误。Add(“@Param1”,jsontext)会导致相同的错误。cmd.Parameters.Add(jsontext)导致:System.Data.SqlClient.SqlException:'JSON文本格式不正确。在位置2处发现意外字符“@”。我刚注意到您在回答中引用了PostResult,但它不应该是jsonText,对吗?因为这是我的sqlParameter变量?@MPJ567的名称,所以这不是同一个错误。新的一个说你的json被破坏了。我相当确信这是一个误报。这意味着“@Param1”被传递到了sql中,就像它的文本一样。我可以通过在ssms中运行sql来验证这一点,并收到相同的错误。这让我相信使用cmd.Parameter.Add要么是不正确的,要么是我使用的不正确。感谢您的持续帮助!