【问题标题】:.NET: SqlDataAdapter: DataTable: Output Parameters: Return JSON.NET:SqlDataAdapter:DataTable:输出参数:返回 JSON
【发布时间】:2021-12-18 03:01:40
【问题描述】:

我有一个 SQL Server 存储过程,它根据提供的输入参数返回不同的列和列类型。我以这种方式将此存储过程的输出作为 json 对象返回:

public async Task<IActionResult> OnGetTransactions(string p1, string p2)
{
   DataTable dataTable = new DataTable();                   
                
   await using (SqlConnection con = new SqlConnection(CS))
   {
        SqlCommand cmd = new SqlCommand("sp_GetRecords", con);
        cmd.CommandType = CommandType.StoredProcedure;                       
                    
        cmd.Parameters.AddWithValue("@param1", p1);
        cmd.Parameters.AddWithValue("@param2", p2);                        

        //the below 2 output params got added; without these 2, I was able to return the json-serialized datatable
        cmd.Parameters.Add("@oparam1", SqlDbType.Int).Direction = ParameterDirection.Output;
        cmd.Parameters.Add("@oparam2", SqlDbType.VarChar, 128).Direction = ParameterDirection.Output;

        await con.OpenAsync();
        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(cmd);
        sqlDataAdapter.Fill(dataTable);   

        //I can capture the output values as indicated below
        int returnCode = Convert.ToInt32(cmd.Parameters["@oparam1"].Value);
        string returnStr = Convert.ToString(cmd.Parameters["@oparam2"].Value);

        MyClass myClass = new MyClass();
        myClass.Transactions = dataTable.AsEnumerable(); //not sure how to convert 
        myClass.ReturnCode = returnCode;
        myClass.ReturnString = returnStr;
                                         
        jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(myClass);
        await con.CloseAsync();
    }
    return Content(jsonResult);
}


public class MyClass
{
    public IEnumerable<System.Data.DataRow> Transactions { get; set; }
    public int ReturnCode { get; set; }
    public string ReturnString { get; set; }
}

现在,两个输出参数被添加到存储过程中。我能够捕获输出值,但似乎无法正确返回 json。在这种情况下,如何使用输出参数返回转换为 json 字符串的 dataTable?我看到有一个可用于数据表的“AsEnumerable()”方法,但它返回一个通用 DataRow 的 IEnumerable。

感谢任何帮助。

【问题讨论】:

  • 除非我有误解,否则您似乎错过了课程本身。序列化是将类的现有实例表示为字符串的过程。此代码 Newtonsoft.Json.JsonConvert.SerializeObject(dataTable); 正在序列化 DataTable 实例。
  • 你能发布整个代码吗?我看到返回,但我看不到标题。这是什么?
  • @Shai,Newtonsoft.Json 库允许将数据表序列化为 json 字符串。我不能有一个强类型的类,因为存储过程根据输入参数返回不同的列(和数据类型)。我不知道数据表在 tuntime 保存了什么。
  • 你可以序列化一个DataTable,但它会是一个DataTable。它不仅限于您询问的两个输出参数。如果一个序列化的 DataTable 字符串就足够了,那么可能我没有理解这个问题。
  • 除了删除 .AsEnumerable() 您的代码看起来是正确的。什么确切;你有困难吗?旁白:如果您可以控制存储过程,您可能只想使用FOR JSON

标签: .net datatable json.net sqldataadapter


【解决方案1】:

由于我无法按照@Charlieface 的解决方案编辑存储过程,所以我最终这样做了:

public class MyClass
{
    public string Transactions { get; set; }
    public int ReturnCode { get; set; }
    public string ReturnString { get; set; }
}

在我的 C# 代码中,

MyClass myClass = new MyClass();
//myClass.Transactions = dataTable.AsEnumerable(); //not sure how to convert 
myClass.Transactions = Newtonsoft.Json.JsonConvert.SerializeObject(dataTable); //this gives me a string that I further parse in my javascript code
myClass.ReturnCode = returnCode;
myClass.ReturnString = returnStr;

Javascript 代码:

$.ajax({
        url: '/?handler=Transactions&p1=' + someValue1+ '&p2=' + someValue2,
        type: "GET",
        success: function (data) {
            var allData= jQuery.parseJSON(JSON.stringify(data));                 
            var justTransactions= JSON.stringify(eval("(" + allData.Transactions + ")"));                
        },
        error: function (_error) {
            console.log("Error is " + _error);
        }
    });

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多