我的代码上出现“不存在映射”错误,该错误应将记录插入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();
}
答案 0 :(得分:1)
您试图将SqlParameter
作为SqlParameter的对象值传递。错误消息的字面意思是它不知道将其转换为哪种SQL类型。
您似乎正在尝试将 string 作为参数传递,因此您只需要执行...
cmd.Parameters.Add(jsonText);
而不是...
cmd.Parameters.AddWithValue("Param1", jsonText);
哪个将SqlParameter对象作为参数值传递。
然后,您需要确定查询中的用法-您将其作为@Param1
传递,因此无需创建@json
参数并尝试使用字符串中的文字值,将不起作用-您将只获取该文字字符串,而不是参数的值。
SqlCommand是IDisposable的,因此应放在using
块中。
不需要关闭连接,因为它会在退出连接的using
块时被隐式Dispose关闭。
答案 1 :(得分:0)
使用Add(SqlParameter)
代替AddWithValue(String, Object)
,因为后者是一种方便的方法,它试图根据所传递的SqlParameter
创建一个Object
。 (或者,尝试AddWithValue("@Param1", PostResult)
。)