【C#】JSON转DataTable存入数据库

该代码示例展示了如何从JSON转换到DataTable时保持数据类型,通过查询数据库获取列类型,并使用C#的DBType转换函数确保类型正确性。然后,它使用SqlBulkCopy进行批量更新以保存到数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于JSON直接转DataTable可能会存在类型丢失
如下:
在这里插入图片描述

采用读取数据库表字段类型构建DataTable

/// <summary>
 /// JSON转DataTale存入数据库
 /// </summary>
 /// <param name="json"></param>
 public static void JsonDataTableTest(string json)
 {
     string sql = string.Format("SELECT name AS column_name , TYPE_NAME(system_type_id) AS column_type  FROM sys.columns WHERE object_id = OBJECT_ID(N'{0}')", "JSON_TO_DATATABLE_TEST");
     var dt = DbHelperSQL.Query(sql).Tables[0];
     DataTable mrow = new DataTable();
     foreach (DataRow row in dt.Rows)
     {
         string column_name = Convert.ToString(row["column_name"]);
         string column_type = Convert.ToString(row["column_type"]);
         Console.WriteLine($"column_name:{column_name},column_type:{column_type}");
         // 从数据库获取类型,构造DataTable,JSON直接转DataTable可能会类型丢失
         mrow.Columns.Add(column_name, DBTypeToCSharpType(column_type));
     }
     
     JArray data = JObject.Parse(json)["data"] as JArray;
     foreach(JObject o in data)
     {
         var row = mrow.NewRow();
         foreach (JProperty property in o.Properties())
         {
             if (mrow.Columns.Contains(property.Name))
             {
                 // 如果JSON的值为null
                 if(o[property.Name].Type == JTokenType.Null)
                 {
                     row[property.Name] = DBNull.Value;
                 }
                 else
                 {
                     row[property.Name] = o[property.Name];
                 }
                 
             }
         }
         mrow.Rows.Add(row);
     }

     Console.WriteLine(mrow);

     AddTable(mrow, "JSON_TO_DATATABLE_TEST");
 }

 /// <summary>
 /// 将数据库数据类型字符串,转为C#数据类型字符串。
 /// </summary>
 /// <param name="dbType">数据库数据类型字符串。</param>
 /// <returns>C#数据类型</returns>
 private static Type DBTypeToCSharpType(string dbType)
 {
     Type cSharpType = null;
     switch (dbType.ToLower())
     {
         case "bit":
             cSharpType = typeof(bool);
             break;
         case "tinyint":
             cSharpType = typeof(byte);
             break;
         case "smallint":
             cSharpType = typeof(short);
             break;
         case "int":
             cSharpType = typeof(int);
             break;
         case "bigint":
             cSharpType = typeof(long);
             break;
         case "real":
             cSharpType = typeof(float);
             break;
         case "float":
             cSharpType = typeof(double);
             break;
         case "smallmoney":
         case "money":
         case "decimal":
         case "numeric":
             cSharpType = typeof(decimal);
             break;
         case "char":
         case "varchar":
         case "nchar":
         case "nvarchar":
         case "text":
         case "ntext":
             cSharpType = typeof(string);
             break;
         case "samlltime":
         case "date":
         case "smalldatetime":
         case "datetime":
         case "datetime2":
         case "datetimeoffset":
             cSharpType = typeof(DateTime);
             break;
         case "timestamp":
         case "image":
         case "binary":
         case "varbinary":
             cSharpType = typeof(byte[]);
             break;
         case "uniqueidentifier":
             cSharpType = typeof(Guid);
             break;
         case "variant":
         case "sql_variant":
             cSharpType = typeof(object);
             break;
         default:
             cSharpType = typeof(string);
             break;
     }
     return cSharpType;
 }


 /// <summary>
 /// 批量更新
 /// </summary>
 /// <param name="dt">更新的内容</param>
 /// <param name="tableName">目标表</param>
 /// <returns></returns>
 public static Boolean AddTable(DataTable dt, string tableName)
 {
     using (SqlConnection sqlCon = new SqlConnection(DbHelperSQL.connectionString))
     {
         try
         {
             sqlCon.Open();
             using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlCon))
             {
                 bulkCopy.DestinationTableName = tableName;
                 for (int i = 0; i < dt.Columns.Count; i++)
                 {
                     bulkCopy.ColumnMappings.Add(dt.Columns[i].Caption.ToString(), dt.Columns[i].Caption.ToString());
                 }
                 bulkCopy.WriteToServer(dt);
                 return true;
             }
         }
         catch (Exception ex)
         {
             throw ex;
         }
         finally
         {
             sqlCon.Close();
         }
     }
 }

案例

private static void Main(string[] args)
{
   
    JsonDataTableTest(@"{""data"":[{""num"":100,""name"":""xiuyuan"",""time"":""2023-10-01 00:00:33""},{""num"":100.33,""name"":""xiaoming""}]}");
}

在这里插入图片描述

在这里插入图片描述

<think>我们正在讨论C#网络编程,用户希望了解访问服务器或网络的方法、原理及实现,理解网络协议的作用,并学习SQL的使用。我们将从以下几个方面展开: 1. C#网络访问方法、原理及实现方式 2. 常用网络协议及其作用 3. SQL使用教程(在C#中的使用) 参考引用: [1]:提到了一个即时通讯软件项目,涉及网络编程、多线程、数据序列化等,这为我们讲解网络编程提供了实例参考。 [2]:展示了C#连接SQL Server数据库的代码,我们可以以此为基础讲解数据库连接。 [3]:提到了连接字符串加密,这可以用于讲解数据库连接的安全处理。 下面开始详细回答:</think>### C# 网络访问方法、原理与实现 #### **一、网络访问方法及原理** 1. **基础网络库** - **`WebClient`**:简化 HTTP 请求(GET/POST),支持文件上传/下载。 ```csharp using (WebClient client = new WebClient()) { // 下载文件 client.DownloadFile("http://example.com/file.zip", "local.zip"); // 上传数据 byte[] response = client.UploadData("http://api.com", "POST", data); } ``` - **`HttpWebRequest/HttpWebResponse`**:提供更精细的控制(如头信息、超时设置)。 ```csharp HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://api.com"); request.Method = "GET"; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Stream stream = response.GetResponseStream(); // 处理响应流... } ``` - **`Socket`**:底层协议控制(TCP/UDP),适用于自定义协议[^1]。 ```csharp Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(IPAddress.Parse("192.168.1.100"), 8080); socket.Send(Encoding.UTF8.GetBytes("Hello Server!")); ``` 2. **多线程与异步处理** 网络操作需结合异步避免界面阻塞: ```csharp async Task<string> FetchDataAsync() { using (HttpClient client = new HttpClient()) { return await client.GetStringAsync("http://api.com/data"); } } ``` #### **二、常用网络协议及作用** | 协议 | 作用 | C# 实现 | |--------|-------------------------------|-------------------------| | **HTTP/HTTPS** | 网页数据传输 | `HttpClient`, `WebClient` | | **TCP** | 可靠数据流传输(如文件传输) | `TcpClient`, `TcpListener` | | **UDP** | 高速非可靠传输(如视频流) | `UdpClient` | | **FTP** | 文件传输协议 | `FtpWebRequest` | > **协议选择原则**: > - 需可靠性(如数据库操作)→ TCP > - 需低延迟(如实时通信)→ UDP > - Web API 交互 → HTTP/HTTPS #### **三、SQL 数据库访问教程** 1. **连接数据库** 使用 `SqlConnection` 连接 SQL Server: ```csharp string connStr = "Server=192.168.1.100;Database=TestDB;User=sa;Password=123;"; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); // 执行SQL命令... } ``` > 注:敏感信息(如密码)应加密存储于 `Web.config`[^3]。 2. **执行 SQL 命令** - **查询数据**: ```csharp string sql = "SELECT * FROM Users"; SqlDataAdapter adapter = new SqlDataAdapter(sql, conn); DataTable dt = new DataTable(); adapter.Fill(dt); // 结果存入DataTable ``` - **插入/更新数据**: ```csharp using (SqlCommand cmd = new SqlCommand("INSERT INTO Users (Name) VALUES (@name)", conn)) { cmd.Parameters.AddWithValue("@name", "Alice"); cmd.ExecuteNonQuery(); } ``` 3. **防止 SQL 注入** 使用参数化查询(如上例 `@name`),**禁止**拼接字符串: ❌ 错误方式: `"SELECT * FROM Users WHERE Name='" + input + "'"` --- ### 关键知识点总结 1. **网络分层模型**: - 应用层(HTTP/FTP) → 传输层(TCP/UDP) → 网络层(IP) 2. **数据序列化**: 网络传输需将对象为字节流(如 JSON/XML 或 `BinaryFormatter`)。 3. **错误处理**: 网络操作必须包裹在 `try-catch` 中,处理超时、断开等异常。 4. **性能优化**: - 连接池复用数据库连接 - 异步避免阻塞主线程 > 完整项目示例参考:[C# 即时通讯系统](引用[1]),包含网络编程、多线程、数据库集成等实战代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值