【问题标题】:trying to use json array to insert data in sql with c# but still getting Newtonsoft.Json.Linq.JValue error?尝试使用 json 数组通过 c# 在 sql 中插入数据但仍然出现 Newtonsoft.Json.Linq.JValue 错误?
【发布时间】:2020-02-21 14:20:45
【问题描述】:

我正在将一组 JSON 数据从客户端传递到服务器端 (c#)。但是,当我尝试将这些数据插入到 SQL 表中时,我在查询执行的那一刻就得到了这个 Newtonsoft.Json.Linq.JValue

这是我目前的代码:

客户端(js);

var json = [];

var Firstcotizacion = {
    idCotizacion: "111111",
    idProyecto: "8047",
    nombreProyecto: "Edificio Caiquen",
    idProducto: "MLC462815278"
}


var Secondcotizacion = {
    idCotizacion: "222222",
    idProyecto: "1234",
    nombreProyecto: "Edificio malbec",
    idProducto: "MLC29870FD"
}


json.push(Firstcotizacion)
json.push(Secondcotizacion)

$.post("../Ajax/GuardaCotizacionesPI", { json: JSON.stringify(json) }, function (data) {
    console.log(data)
});

服务器端(C#):

public string GuardarCotizacion(string json)
{
    string SP_INSERTA_COTIZACIONPI = "SVI_CPI_COTIZACION_PI";
    dynamic cotizaciones = JsonConvert.DeserializeObject(json);

    foreach (var cotizacion in cotizaciones)
    {
        using (SqlConnection conexion = new SqlConnection(Inventa.PazCorp.Data.BaseDatos.StringConexionGestionContactos(System.Configuration.ConfigurationManager.AppSettings["ambiente"].ToString())))
        {
            conexion.Open();
            using (SqlCommand comm = new SqlCommand(SP_INSERTA_COTIZACIONPI, conexion))
            {
                comm.CommandType = System.Data.CommandType.StoredProcedure;
                comm.Parameters.AddWithValue("IDCOTIZACION", cotizacion.idCotizacion);
                comm.Parameters.AddWithValue("IDPROYECTO", cotizacion.idProyecto);
                comm.Parameters.AddWithValue("NOMBRE_PROYECTO", cotizacion.nombreProyecto);
                comm.Parameters.AddWithValue("IDPRODUCTO", cotizacion.idProducto);
                comm.ExecuteNonQuery(); //Here is where the error appears
            }
        }
    }
    return json;
}

任何想法可能是错的?

【问题讨论】:

  • 您调用了/Ajax/GuardaCotizacionesPI,但随后显示了一个名为GuardarCotizacion 的方法。第一个与第二个如何连接?
  • 你为什么要反序列化到dynamic?使用一个具体的类,这一切都消失了。此外,每次使用dynamic,都会有一只小猫死亡。
  • @peterB 它们由控制器连接
  • @DavidG :说的是最纯粹的事实。你为什么使用动态?您应该使用显式类型。尝试在 Cotizaciones 类中实现 List,并使用 JsonConvert.DeserializeObject(json)。

标签: c# sql json asp.net-mvc


【解决方案1】:

因为您使用JsonConvert.DeserializeObject 的非通用版本,JSON.Net 会将所有内容反序列化为它自己的对象,例如JObjectJValue。而且由于您使用 dynamic 隐藏了所有这些,因此您很容易受到各种运行时错误的影响。

但是,如果您使用具体类,您将获得类型安全的代码。例如:

public class MyThing
{
    public string idCotizacion { get; set; }
    public string idProyecto { get; set; }
    public string nombreProyecto { get; set; }
    public string idProducto { get; set; }
}

现在使用generic method

var cotizaciones = JsonConvert.DeserializeObject<List<MyThing>>(json);

您的代码的其余部分应该适合,但现在更加清晰和安全。

顺便说一句,你不应该使用AddWithValue

【讨论】:

    【解决方案2】:

    根据您发布的代码,我将实现一个 Cotizacion 类:

    public class Cotizacion {
       public string idCotizacion {get; set;}
       public string idProyecto {get; set;}
       public string nombreProyecto {get; set;}
       public string idProducto{get; set;}
    }
    

    然后做类似的事情:

    public string GuardarCotizacion(string json)
            {
    
                string SP_INSERTA_COTIZACIONPI = "SVI_CPI_COTIZACION_PI";
                var cotizaciones = JsonConvert.DeserializeObject<List<Cotizacion>>(json);
    
                foreach (var cotizacion in cotizaciones)
                {
                    using (SqlConnection conexion = new SqlConnection(Inventa.PazCorp.Data.BaseDatos.StringConexionGestionContactos(System.Configuration.ConfigurationManager.AppSettings["ambiente"].ToString())))
                    {
                        conexion.Open();
                        using (SqlCommand comm = new SqlCommand(SP_INSERTA_COTIZACIONPI, conexion))
                        {
                            comm.CommandType = System.Data.CommandType.StoredProcedure;
                            comm.Parameters.AddWithValue("IDCOTIZACION", cotizacion.idCotizacion);
                            comm.Parameters.AddWithValue("IDPROYECTO", cotizacion.idProyecto);
                            comm.Parameters.AddWithValue("NOMBRE_PROYECTO", cotizacion.nombreProyecto);
                            comm.Parameters.AddWithValue("IDPRODUCTO", cotizacion.idProducto);
                            comm.ExecuteNonQuery(); //Here is where the error appears
                        }
                    }
                }
                return json;
            }
    

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 2021-09-06
      • 2021-03-23
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2020-11-19
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多