代码之家  ›  专栏  ›  技术社区  ›  MPJ567

SQL参数对象类型映射

  •  0
  • MPJ567  · 技术社区  · 7 年前

    在我的代码中,我得到了一个“no mapping exists”错误,该错误应该将记录插入到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 回复  |  直到 7 年前
        1
  •  1
  •   Richardissimo    7 年前

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

    你似乎想通过 一串 作为一个参数,所以你只需要…

    cmd.Parameters.Add(jsonText);
    

    而不是。。。

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

    它正在将sqlparameter对象作为参数的值传递。

    然后您需要修复在查询中如何使用它-您将它作为 @Param1 所以不需要创建 @json 参数,并尝试通过在字符串中使用一个不起作用的文字值来将其转换为该值-您只会得到该文字字符串,而不是参数的值。

    sqlcommand是IDisposable,因此应位于 using 块。

    不需要关闭连接,因为在退出连接时,隐式释放将关闭该连接 使用 块。

    我建议你阅读 can we stop using AddWithValue .

        2
  •  0
  •   zneak    7 年前

    使用 Add(SqlParameter) 而不是 AddWithValue(String, Object) ,因为后者是一种方便的方法,试图创建一个 SqlParameter Object 那是通过的。(或者,也可以尝试 AddWithValue("@Param1", PostResult) )