SqlClient의 JSON 데이터 형식 지원

ADO.NET 다운로드

네이티브 JSON 데이터 형식 은 SQL Server 2025 및 Azure SQL 데이터베이스에 도입되었습니다. 이 네이티브 JSON 데이터 형식은 자동 유효성 검사, 효율적인 전송 및 효율적인 스토리지가 있는 구조화된 JSON 문서에 사용할 수 있습니다.

Microsoft.Data.SqlClient 공급자는 다음을 통해 JSON 열에 대한 기본 제공 지원을 제공합니다.

  • 간단한 시나리오에 대한 CLR(공용 언어 런타임) string 형식입니다.
  • SqlJson JSON 의미 체계의 클라이언트 쪽 유효성 검사 및 명시적 처리와 같은 고급 사용 사례에 대한 형식입니다.
  • .NET 9에는 JSON 매개 변수를 지정하기 위한 새 SqlDbType.Json 열거형 값이 도입되었습니다. 이전 .NET 버전의 경우, 새 SQL 형식에 대한 전방호환 지원을 제공하는 Microsoft.Data.SqlDbTypeExtensions를 사용합니다.
  • .NET 9에는 JSON 매개 변수를 지정하기 위한 새 SqlDbType.Json 열거형 값이 도입되었습니다.
  • 이전 .NET 버전에서는 Microsoft.Data.SqlDbTypeExtensions 대신 SqlDbType이/가 도입되었습니다.

예제

다음 예제에서는 JSON 데이터와 상호 작용하는 다음 시나리오를 보여 줍니다.

  • CLR 형식을 사용하여 JSON 값을 삽입합니다 string.
  • 를 사용하여 SqlJsonJSON 값을 삽입합니다. 사용 SqlJson 은 JSON 데이터를 서버로 보내기 전에 유효성을 검사하려는 경우에 유용합니다.
  • 스트리밍하여 JSON 파일을 삽입합니다.
  • 를 사용하여 JSON 값을 읽습니다 SqlDataReader.
  • JSON 데이터에 저장 프로시저 매개 변수를 사용합니다.
using System.Data;
using Microsoft.Data;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlTypes;
using System.Text.Json;
using System;
using System.IO;

class Program
{
    // NOTE: For production, prefer Encrypt=True and TrustServerCertificate=False with a valid cert.
    private const string connString = @"Server=tcp:localhost;Database=Demo2;Integrated Security=True;Encrypt=true;TrustServerCertificate=true;";
    private const string tableName = "jsonTab";
    private const string createBody = "(Id INT IDENTITY(1,1) PRIMARY KEY, Data json NULL)";

    static void Main(string[] args)
    {
        CreateTable(connString, tableName, createBody);

        InsertJSONWithStr(connString);
        InsertJSONWithSqlJson(connString);
        InsertJSONFile(connString);
        ReadJSONWithGetString(connString);
        ReadJSONWithSqlJson(connString);
        ReadJsonWithSPParam(connString);
    }

    #region Helper Methods to Create/Drop Table and stored procedures
    public static void CreateSP(string connString, string spName, string spBody)
    {
        DropSP(connString, spName);
        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            string spCreate = "CREATE PROCEDURE " + spName + spBody;
            using (SqlCommand command = sqlConnection.CreateCommand())
            {
                command.CommandText = spCreate;
                command.ExecuteNonQuery();
            }
        }
    }

    public static void DropSP(string connString, string spName)
    {
        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand cmd = new SqlCommand(string.Format("IF (OBJECT_ID('{0}') IS NOT NULL) \n DROP PROCEDURE {0}", spName), sqlConnection))
            {
                cmd.ExecuteNonQuery();
            }
        }
    }

    private static void CreateTable(string connString, string tableName, string createBody)
    {
        DropTable(connString, tableName);
        string tableCreate = "CREATE TABLE [" + tableName + "]" + createBody;
        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand command = sqlConnection.CreateCommand())
            {
                command.CommandText = tableCreate;
                command.ExecuteNonQuery();
            }
        }
    }

    private static void DropTable(string connString, string tableName)
    {
        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand cmd = new SqlCommand(string.Format("IF (OBJECT_ID('{0}') IS NOT NULL) \n DROP TABLE {0}", tableName), sqlConnection))
            {
                cmd.ExecuteNonQuery();
            }
        }
    }

    #endregion

    private static void ReadJsonWithSPParam(string connString)
    {
        Console.WriteLine("Reading JSON with Stored Procedure and Output Parameter");

        // Create stored procedure for reading JSON value
        string storedProcName = "GetJsonData";
        string tableName = "jsonTab";
        string createSP = $@"
                @id int,
                @jsonData json OUTPUT
                AS
                BEGIN
                    SELECT @jsonData = (SELECT Data FROM {tableName} WHERE Id = @id)
                END;";
        CreateSP(connString, storedProcName, createSP);

        using (SqlConnection connection = new SqlConnection(connString))
        {
            connection.Open();
            string procName = "GetJsonData";

            // Execute Stored Procedure
            using (SqlCommand spCommand = new SqlCommand(procName, connection))
            {
                spCommand.CommandType = CommandType.StoredProcedure;
                spCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { Direction = ParameterDirection.Input, Value = 1 });

                //Use SqlDbType.Json depending on the dotnet version or or SqlDbTypeExtensions.Json 
                SqlParameter outputParam = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json) { Direction = ParameterDirection.Output };
                spCommand.Parameters.Add(outputParam);
                spCommand.ExecuteNonQuery();
                Console.WriteLine($"JSON Data from SP: {outputParam.Value}");
            }
        }
    }

    private static void ReadJSONWithSqlJson(string connString)
    {
        Console.WriteLine("Reading JSON into SqlJson");
        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand command = new SqlCommand("SELECT Data FROM jsonTab", sqlConnection))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        if (!reader.IsDBNull(0))
                        {
                            //Read JSON with GetString
                            var jsonData = reader.GetSqlJson(0);
                            Console.WriteLine($"JSON Data: {jsonData}");
                        }
                        else
                        {
                            Console.WriteLine("JSON Data: NULL");
                        }
                    }
                }
            }
        }
    }

    private static void ReadJSONWithGetString(string connString)
    {
        Console.WriteLine("Reading JSON with GetString");
        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand command = new SqlCommand("SELECT Data FROM jsonTab", sqlConnection))
            {
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        if (!reader.IsDBNull(0))
                        {
                            //Read JSON with GetString
                            string jsonData = reader.GetString(0);
                            Console.WriteLine($"JSON Data: {jsonData}");
                        }
                        else
                        {
                            Console.WriteLine("JSON Data: NULL");
                        }
                    }
                }
            }
        }
    }

    private static void InsertJSONFile(string connString)
    {
        Console.WriteLine("Inserting JSON File");
        var dummyData = new
        {
            name = "Keith Johnson",
            age = 36,
            city = "Boston"
        };

        string jsonString = JsonSerializer.Serialize(dummyData, new JsonSerializerOptions { WriteIndented = true });
        string jsonFile = "dummyData.json";
        if (File.Exists(jsonFile))
        {
            File.Delete(jsonFile);
        }
        File.WriteAllText(jsonFile, jsonString);

        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand command = new SqlCommand("INSERT INTO jsonTab (Data) VALUES (@jsonData)", sqlConnection))
            {
                SqlParameter jsonParam = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json);
                using (StreamReader jsonFileReader = File.OpenText(jsonFile))
                {
                    jsonParam.Value = jsonFileReader;
                    command.Parameters.Add(jsonParam);
                    command.ExecuteNonQuery();
                }
            }
        }
        if (File.Exists(jsonFile))
        {
            File.Delete(jsonFile);
        }
    }

    private static void InsertJSONWithSqlJson(string connString)
    {
        Console.WriteLine("Inserting JSON with SqlJson");
        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand command = new SqlCommand("INSERT INTO jsonTab (Data) VALUES (@jsonData)", sqlConnection))
            {
                //Insert non-null value with SqlJson
                string jsonData = @"{ ""name"": ""Jane Smith"", ""age"": 25, ""city"": ""Los Angeles"" }";
                SqlJson sqlJsonObj = new SqlJson(jsonData);
                SqlParameter jsonParam = new SqlParameter("@jsonData", SqlDbTypeExtensions.Json) { Value = sqlJsonObj };
                command.Parameters.Add(jsonParam);
                command.ExecuteNonQuery();
                command.Parameters.Clear();

                //Insert null value with SqlJson
                sqlJsonObj = new SqlJson();
                jsonParam.Value = sqlJsonObj;
                command.Parameters.Add(jsonParam);
                command.ExecuteNonQuery();
            }
        }
    }

    private static void InsertJSONWithStr(string connString)
    {
        Console.WriteLine("Inserting JSON with string");
        string insertQuery = "INSERT INTO jsonTab (Data) VALUES (@jsonData)";

        using (SqlConnection sqlConnection = new SqlConnection(connString))
        {
            sqlConnection.Open();
            using (SqlCommand command = new SqlCommand(insertQuery, sqlConnection))
            {
                //Insert non-null value
                string jsonData = @"{ ""name"": ""John Doe"", ""age"": 30, ""city"": ""New York"" }";
                command.Parameters.AddWithValue("@jsonData", jsonData);
                command.ExecuteNonQuery();
                command.Parameters.Clear();

                //Insert null value
                command.Parameters.AddWithValue("@jsonData", DBNull.Value);
                command.ExecuteNonQuery();
            }
        }
    }
}