.NET:SqlDataAdapter:DataTable:输出参数:Return JSON
.NET: SqlDataAdapter: DataTable: Output Parameters: Return JSON
我有一个 SQL 服务器存储过程,它 return 根据提供的输入参数提供不同的列和列类型。我正在 return 将此存储过程的输出作为 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; }
}
现在,存储过程中添加了两个输出参数。我能够捕获输出值,但我似乎无法正确地 return 和 json。在这种情况下,如何使用输出参数 return 将 dataTable 转换为 json 字符串?我看到有一个 'AsEnumerable()' 方法可用于数据表,但它 return 是一个通用 DataRow 的 IEnumerable。
感谢任何帮助。
因为我无法按照@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);
}
});
我有一个 SQL 服务器存储过程,它 return 根据提供的输入参数提供不同的列和列类型。我正在 return 将此存储过程的输出作为 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; }
}
现在,存储过程中添加了两个输出参数。我能够捕获输出值,但我似乎无法正确地 return 和 json。在这种情况下,如何使用输出参数 return 将 dataTable 转换为 json 字符串?我看到有一个 'AsEnumerable()' 方法可用于数据表,但它 return 是一个通用 DataRow 的 IEnumerable。
感谢任何帮助。
因为我无法按照@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);
}
});