You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# DataTable中字符串转byte[]失败问题及解决咨询

问题解决:CSV数据转SQL Server varbinary及类型匹配问题

核心错误原因

  1. 二进制字符串解析错误:你用Encoding.UTF8.GetBytes()处理十六进制字符串(如0x0050568F...),这是把字符串本身转成UTF8字节流,而非将十六进制值解析为二进制数据,导致类型匹配失败。
  2. 行对象创建错误:你用原dt.NewRow()创建行,该行的列类型还是原表的string类型,赋值给克隆表(dtCloned)时必然类型不匹配,应该用dtCloned.NewRow()创建对应类型的行。
  3. 浮点数字符串转换错误:原数据是i,i格式(如0,0),直接赋值无法隐式转为double,需要先处理格式(替换逗号为小数点)再转换。

修正后的完整代码

using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;

namespace SQLBulkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable("dt");

            // 初始化原表(CSV读取的全string列)
            dt.Columns.Add("item", typeof(string));
            dt.Columns.Add("type", typeof(string));
            dt.Columns.Add("bin", typeof(string));
            dt.Columns.Add("floatItem", typeof(string));

            // 测试数据填充
            var testHexString = "0x0050568F00041ED783A79F94B797E9B6";
            for (int i = 0; i < 5; i++)
            {
                DataRow newRow = dt.NewRow();
                newRow["item"] = i.ToString();
                newRow["type"] = "Type " + i;
                newRow["bin"] = testHexString;
                newRow["floatItem"] = i.ToString() + "," + i.ToString();
                dt.Rows.Add(newRow);
            }

            // 克隆表并修改列类型
            DataTable dtCloned = dt.Clone();
            dtCloned.Columns[0].DataType = typeof(int);
            dtCloned.Columns[2].DataType = typeof(byte[]);
            dtCloned.Columns[3].DataType = typeof(double);

            // 逐行转换数据
            foreach (DataRow row in dt.Rows)
            {
                // 用克隆表创建行,确保列类型匹配
                DataRow mappedRow = dtCloned.NewRow();

                // int列转换
                mappedRow["item"] = int.Parse(row["item"].ToString());

                // string列直接赋值
                mappedRow["type"] = row["type"];

                // 十六进制字符串转byte[](处理0x前缀)
                string hexStr = row["bin"].ToString().TrimStart('0', 'x');
                mappedRow["bin"] = HexStringToByteArray(hexStr);

                // 浮点数字符串转换(替换逗号为小数点)
                string floatStr = row["floatItem"].ToString().Replace(',', '.');
                mappedRow["floatItem"] = double.Parse(floatStr);

                dtCloned.Rows.Add(mappedRow);
            }

            // 后续可使用SqlBulkCopy写入SQL Server
            // using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
            // {
            //     bulkCopy.DestinationTableName = "目标表名";
            //     bulkCopy.WriteToServer(dtCloned);
            // }
        }

        // 辅助方法:十六进制字符串转byte[]
        private static byte[] HexStringToByteArray(string hex)
        {
            int length = hex.Length;
            byte[] byteArray = new byte[length / 2];
            for (int i = 0; i < length; i += 2)
            {
                byteArray[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            }
            return byteArray;
        }
    }
}

关键修改说明

  • 二进制转换:新增HexStringToByteArray方法,专门处理十六进制字符串到byte[]的解析,先去掉0x前缀,再逐两位转换为字节。
  • 行对象创建:改用dtCloned.NewRow()创建行,确保行的列类型和克隆表一致,避免类型不匹配。
  • 浮点类型转换:将原字符串中的逗号替换为小数点,再用double.Parse显式转换,确保格式正确。
  • 显式类型转换:所有列都采用显式转换,避免隐式转换的不确定性,同时提高代码可读性。

内容的提问来源于stack exchange,提问作者Tarek Salha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:06:19