C# DataTable中字符串转byte[]失败问题及解决咨询
问题解决:CSV数据转SQL Server varbinary及类型匹配问题
核心错误原因
- 二进制字符串解析错误:你用
Encoding.UTF8.GetBytes()处理十六进制字符串(如0x0050568F...),这是把字符串本身转成UTF8字节流,而非将十六进制值解析为二进制数据,导致类型匹配失败。 - 行对象创建错误:你用原
dt.NewRow()创建行,该行的列类型还是原表的string类型,赋值给克隆表(dtCloned)时必然类型不匹配,应该用dtCloned.NewRow()创建对应类型的行。 - 浮点数字符串转换错误:原数据是
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
相关产品推荐
相关产品推荐

