programing

SqlDataReader에서 JSON으로 변환

newstyles 2023. 3. 25. 10:57

SqlDataReader에서 JSON으로 변환

public string toJSON(SqlDataReader o)
{
    StringBuilder s = new StringBuilder();
    s.Append("[");
    if (o.HasRows)
        while (o.Read())
            s.Append("{" + '"' + "Id" + '"' + ":" + o["Id"] + ", "
            + '"' + "CN" + '"' + ":" + o["CatName"] + ", "
            + '"' + "Ord" + '"' + ":" + o["Ord"] + ","
            + '"' + "Icon" + '"' + ":" + o["Icon"] + "}, ");
    s.Remove(s.Length - 2, 2);
    s.Append("]");
    o.Close();
    return s.ToString();
}

나는 여기서 시리얼화를 하기 위해 나만의 기능을 사용하고 있다.이것이 좋은 방법인지 아니면 다른 방법을 사용해야 하는지 알아야 한다.그런데 나는 이 기능을 사용하려고 시도했다.JavaScriptSerializerSqlDataReader .thanx에서는 동작하지 않았습니다.

임의 JSON으로 변환할 항목을 원하는 경우 사전(Of string, object)으로 직렬화하여 다음과 같이 변환할 수 있습니다.

public IEnumerable<Dictionary<string, object>> Serialize(SqlDataReader reader)
{
    var results = new List<Dictionary<string, object>>();
    var cols = new List<string>();
    for (var i = 0; i < reader.FieldCount; i++) 
        cols.Add(reader.GetName(i));

    while (reader.Read()) 
        results.Add(SerializeRow(cols, reader));

    return results;
}
private Dictionary<string, object> SerializeRow(IEnumerable<string> cols, 
                                                SqlDataReader reader) {
    var result = new Dictionary<string, object>();
    foreach (var col in cols) 
        result.Add(col, reader[col]);
    return result;
}

그리고 뉴턴소프트를 사용하세요.Json Json Convert 객체를 사용하여 JSON을 가져옵니다.

var r = Serialize(reader);
string json = JsonConvert.SerializeObject(r, Formatting.Indented);

업데이트: 임베디드 메서드를 사용하는 경우 MVC를 사용하는 경우 새로 시리얼화된 에서 임베디드 Json 도우미 메서드를 사용할 수 있습니다.

JsonResult Index(int id) {
    var r = Serialize(reader);
    return Json(r, JsonRequestBehavior.AllowGet);
}

이것으로 충분합니다.

private String sqlDatoToJson(SqlDataReader dataReader)
{
    var dataTable = new DataTable();
    dataTable.Load(dataReader);
    string JSONString = string.Empty;
    JSONString = JsonConvert.SerializeObject(dataTable);
    return JSONString;
}

데이터 리더에 의해 반환되는 행의 수가 메모리 소비량에 대해 문제가 될 수 있는 사용 사례가 있습니다.다음 코드는 JsonWriter(JSON의)를 사용합니다.NET)를 사용합니다.방대한 JSON 문서의 효용성에 대해서는 확실히 논할 수 있지만, 때때로 우리의 사용 사례는 다른 사람에 의해 좌우되기도 합니다.

몇 가지 주의:

  • My SqlDataReader에 여러 결과 세트('테이블')가 포함될 수 있습니다.
  • 출력을 FileStream 또는 HttpResponse 스트림으로 전송할 수 있습니다.
  • 결과 집합별로 반환된 첫 번째 열에 맞게 개체 이름을 '추상'했습니다.
  • 결과 세트가 클 가능성이 있기 때문에 SqlDataReader의 비동기 메서드를 사용합니다.
  • 난 JSON을 허락한다.NET은 데이터 리더 결과에 포함된 실제 데이터의 모든 시리얼화 문제를 처리합니다.

코드:

var stream = ... // In my case, a FileStream or HttpResponse stream
using (var writer = new JsonTextWriter(new StreamWriter(stream)))
{
    writer.WriteStartObject();  
    do
    {
        int row = 0;
        string firstColumn = null;
        while (await reader.ReadAsync())
        {
            if (row++ == 0)
            {
                firstColumn = reader.GetName(0);
                writer.WritePropertyName(string.Format("{0}Collection", firstColumn));
                writer.WriteStartArray();   
            }
            writer.WriteStartObject();
            for (int i = 0; i < reader.FieldCount; i++)
            {
                if (!reader.IsDBNull(i)) { 
                    writer.WritePropertyName(reader.GetName(i));
                    writer.WriteValue(reader.GetValue(i));
                }
            }
            writer.WriteEndObject(); 
        }
        writer.WriteEndArray();
    } while (await reader.NextResultAsync());

    writer.WriteEndObject();
}

이기종 출력의 예는 다음과 같습니다.

{
    "ContactCollection": {
        "ContactItem": [{
                "ContactID": "1",
                "Contact": "Testing",
            },
            {
                "ContactID": "2",
                "Contact": "Smith, John",
            },
            {
                "ContactID": "4",
                "Contact": "Smith, Jane",
            }
        ],
        "MessageItem": [{
                "MessageID": "56563",
                "Message": "Contract Review Changed",
            },
            {
                "MessageID": "56564",
                "Message": " Changed",
            },
            {
                "MessageID": "56565",
                "Message": "Contract Review - Estimated Completion Added.",
            }
        ]
    }
}

레퍼런스:

또 다른 옵션은 James Newton-King의 뛰어난 JSON을 사용하는 것입니다.NET 라이브러리 - http://www.newtonsoft.com/json

다음으로 컬렉션을 구축하여 JSON 직렬 문자열로 출력하는 간단한 예를 나타냅니다.

using Newtonsoft.Json;

class Program
{
    static void Main(string[] args)
    {
        ArrayList objs = new ArrayList();

        //get the data reader, etc.
        while(o.Read())
        {
            objs.Add(new
            {
                Id = o["Id"],
                CN = o["CatName"],
                Ord = o["Ord"],
                Icon = o["Icon"]
            });
        }

        //clean up datareader

        Console.WriteLine(JsonConvert.SerializeObject(objs));
        Console.ReadLine();
    }
}

SqlDataReader의 각 행을 읽어 익명 객체로 만든 다음 JSON을 사용하여 루프를 수행할 수 있습니다.문자열에 시리얼화하다NET 。

이게 도움이 됐으면 좋겠네요!

SQL Server 2016 이후 Microsoft는 이 기능을 SQL 쿼리에 포함시켰습니다.다음을 사용하여 달성할 수 있습니다.FOR JSON키워드를 지정합니다.

select * from table_example where somecolumn = somecondition FOR JSON AUTO

자세한 내용과 예를 보려면 이 공식 문서를 참조하십시오. 자동 모드로 JSON 출력을 자동으로 포맷(SQL Server)

다음은 SQL 쿼리에서 JSON 문자열을 가져오기 위한 Microsoft의 C# 코드 입니다.

var queryWithForJson = "SELECT ... FOR JSON";
var conn = new SqlConnection("<connection string>");
var cmd = new SqlCommand(queryWithForJson, conn);
conn.Open();
var jsonResult = new StringBuilder();
var reader = cmd.ExecuteReader();
if (!reader.HasRows)
{
    jsonResult.Append("[]");
}
else
{
    while (reader.Read())
    {
        jsonResult.Append(reader.GetValue(0).ToString());
    }
}

경고:이 솔루션은 SQL SERVER 2016 이상에서만 유효합니다.

조나단의 답변을 바탕으로 이 코드를 사용합니다.

private IEnumerable<Dictionary<string, object>> ConvertToDictionary(IDataReader reader)
{
    var columns = new List<string>();
    var rows = new List<Dictionary<string, object>>();

    for (var i = 0; i < reader.FieldCount; i++)
    {
        columns.Add(reader.GetName(i));
    }

    while (reader.Read())
    {
        rows.Add(columns.ToDictionary(column => column, column => reader[column]));
    }

    return rows;
}

그 후:

var rows = this.ConvertToDictionary(reader);

return JsonConvert.SerializeObject(rows, Formatting.Indented);

이것을 시험해 보세요.

o = cmd.ExecuteReader();
var dataQuery = from d in o.Cast<DbDataRecord>()
                select new
                {
                    Id = (String)d["Id"],
                    CN = (String)d["CatName"],
                    Ord = (String)d["Ord"],
                    Icon = (String)d["Icon"]
                };
var data = dataQuery.ToArray();
JavaScriptSerializer serializer = new JavaScriptSerializer();
String jsonData = serializer.Serialize(data);

오픈 소스 라이브러리인 Cinchoo ETL을 사용하면 코드 행이 적은 SqlDataReader를 JSON으로 쉽게 내보낼 수 있습니다.

string connectionstring = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Northwind;Integrated Security=True";
StringBuilder sb = new StringBuilder();

using (var conn = new SqlConnection(connectionstring))
{
    conn.Open();
    var comm = new SqlCommand("SELECT top 2 * FROM Customers", conn);

    using (var parser = new ChoJSONWriter(sb))
        parser.Write(comm.ExecuteReader());
}

Console.WriteLine(sb.ToString());

출력:

[
 {
  "CustomerID": "ALFKI",
  "CompanyName": "Alfreds Futterkiste",
  "ContactName": "Maria Anders",
  "ContactTitle": "Sales Representative",
  "Address": "Obere Str. 57",
  "City": "Berlin",
  "Region": {},
  "PostalCode": "12209",
  "Country": "Germany",
  "Phone": "030-0074321",
  "Fax": "030-0076545"
 },
 {
  "CustomerID": "ANATR",
  "CompanyName": "Ana Trujillo Emparedados y helados",
  "ContactName": "Ana Trujillo",
  "ContactTitle": "Owner",
  "Address": "Avda. de la Constitución 2222",
  "City": "México D.F.",
  "Region": {},
  "PostalCode": "05021",
  "Country": "Mexico",
  "Phone": "(5) 555-4729",
  "Fax": "(5) 555-3745"
 }
]

이는 쿼리 구문을 사용하는 Chandu의 Linq 응답을 개선하기 위한 것입니다(From ... select ...).Method Syntax를 선호하는 경우 다음과 같이 답변합니다.

drdr = cmd.ExecuteReader();
Record[] recs = drdr.Cast<DbDataRecord>().Select( data=>new Record{
            GraphID=(drdr.IsDBNull(0) ? "" : (string)data["LabelX"])
        , XAxis=(drdr.IsDBNull(1) ? "1999-09-09 00:00:00" : Convert.ToDateTime(data["XDate"]).ToString("yyyy-MM-dd HH:mm:ss"))
        , YVal=(drdr.IsDBNull(2) ? 0 : int.Parse(data["YFreq"].ToString()))
        }).ToArray();

MemoryStream mem = new MemoryStream();
DataContractJsonSerializer szr = new DataContractJsonSerializer(typeof(Record[]));
szr.WriteObject(mem, recs);
String jsonData = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length); 

도움이 됐으면 좋겠네요

그렇게 어렵진 않을 거야검색 결과를 JSON으로 웹 페이지에 되돌리고 싶을 때 이 작업을 수행합니다.

첫째, 이런 수업을 한다.

public class SearchResult
{
    public string model_no { get; set; }
    public string result_text { get; set; }
    public string url { get; set; }
    public string image_url { get; set; }
}

아래 코드를 입력해 주세요.

        string sql_text = "select * from product_master where model_no like @search_string and active=1";
        SqlConnection connection = new SqlConnection(sql_constr);
        SqlCommand cmd = new SqlCommand(sql_text, connection);
        cmd.Parameters.AddWithValue("@search_string", "%" + search_string + "%");
        connection.Open();

        SqlDataReader rdr = cmd.ExecuteReader();

        List<SearchResult> searchresults = new List<SearchResult>();

        while (rdr.Read())
        {
            SearchResult sr = new SearchResult();
            sr.model_no = rdr["model_no"].ToString();
            sr.result_text = rdr["product_name"].ToString();
            sr.url = rdr["url_key"].ToString();

            searchresults.Add(sr);

        }
        connection.Close();

        //build json result
        return Json(searchresults, JsonRequestBehavior.AllowGet);

이것은 나에게 매우 효과가 있다.

Jonathan's Answer에 덧붙여, ASP에서도 같은 요구가 있었습니다.SQLDataReader 결과를 JSON 문자열 또는 결과 개체로 변환하기 위해 NET Core에서 확장 메서드를 만들었습니다.

 public static class MyExtensions
    {
        public async static Task<string> toJSON(this SqlDataReader reader)
        {            
            var results = await reader.GetSerialized();
            return JsonConvert.SerializeObject(results, Formatting.Indented);
        }
        public async static Task<IEnumerable<Dictionary<string, object>>> GetSerialized(this SqlDataReader reader)
        {
            var results = new List<Dictionary<string, object>>();
            var cols = new List<string>();
            for (var i = 0; i < reader.FieldCount; i++)
                cols.Add(reader.GetName(i));

            while (await reader.ReadAsync())
                results.Add(SerializeRow(cols, reader));

            return results;
        }
        private static Dictionary<string, object> SerializeRow(IEnumerable<string> cols,
                                                        SqlDataReader reader)
        {
            var result = new Dictionary<string, object>();
            foreach (var col in cols)
                result.Add(col, reader[col]);
            return result;
        }
    }

그리고 내 요구 사항에 따라 다음과 같이 사용:

var result = await reader.GetSerialized(); //to get the result object

또는

string strResult = await reader.toJSON(); //to get the result string

데이터베이스에서 읽기가 완료될 때까지 다른 작업이 있기 때문에 비동기 메서드를 만들었습니다.

DataReader를 JSON으로 변환하는 방법은 다음과 같습니다.단, 단일 깊이 시리얼라이제이션 전용입니다.

판독기와 열 이름을 문자열 배열로 전달해야 합니다. 예를 들어 다음과 같습니다.

String [] columns = {"CustomerID", "CustomerName", "CustomerDOB"};

그러면 메서드를 호출합니다.

public static String json_encode(IDataReader reader, String[] columns)
    {
        int length = columns.Length;

        String res = "{";

        while (reader.Read())
        {
            res += "{";

            for (int i = 0; i < length; i++)
            {
                res += "\"" + columns[i] + "\":\"" + reader[columns[i]].ToString() + "\"";

                if (i < length - 1)
                    res += ",";
            }

            res += "}";
        }

        res += "}";

        return res;
    }

reference : " 참조 추가" :System.Web.Extensions를 예상하다

using System.Web.Script.Serialization;

c# 코드에서는 write를 사용할 수 있습니다.

 var json = new JavaScriptSerializer().Serialize(obj);

언급URL : https://stackoverflow.com/questions/5083709/convert-from-sqldatareader-to-json