代码之家  ›  专栏  ›  技术社区  ›  Tarek Salha

在c#DataTable中将字符串转换为字节[]时出错

  •  0
  • Tarek Salha  · 技术社区  · 1 年前

    我正在阅读 .csv 将各种文件中的数据转换为C# DataTable 对象。事实上 .csv ,我最初以字符串形式读取所有数据。之后,我想使用将其写入SQL Server表 SqlBulkCopy

    我需要将列转换为目标中的目标数据类型,并希望通过隐式地让DataTable进行转换来做到这一点:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace SQLBulkTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataTable dt = new DataTable("dt");
    
                DataColumn item = new DataColumn("item", typeof(String));
                dt.Columns.Add(item);
    
                DataColumn type = new DataColumn("type", typeof(String));
                dt.Columns.Add(type);
    
                DataColumn bin = new DataColumn("bin", typeof(String));
                dt.Columns.Add(bin);
    
                DataColumn floatItem = new DataColumn("floatItem", typeof(String));
                dt.Columns.Add(floatItem);
    
                // Add five items.
                DataRow NewRow;
                var teststring = "0x0050568F00041ED783A79F94B797E9B6";
    
                for (int i = 0; i < 5; i++)
                {
                    NewRow = dt.NewRow();
                    NewRow["item"] = i.ToString();
                    NewRow["type"] = "Type " + i;
                    NewRow["bin"] = teststring;
                    NewRow["floatItem"] = i.ToString() + "," + i.ToString();
                    dt.Rows.Add(NewRow);
                }
    
                DataTable dtCloned = dt.Clone();
                dtCloned.Columns[0].DataType = typeof(Int32);
                dtCloned.Columns[2].DataType = typeof(System.Byte[]);
                dtCloned.Columns[3].DataType = typeof(double);
    
                foreach (DataRow row in dt.Rows)
                {
                    var mappedRow = dt.NewRow();
                    mappedRow[0] = row[0];
                    mappedRow[1] = row[1];
                    mappedRow[2] = Encoding.UTF8.GetBytes((string)row[0]);
                    mappedRow[3] = row[3];
                    dtCloned.Rows.Add(mappedRow.ItemArray);
                }
            }
        }
    }
    

    当运行代码时,我得到以下错误:

    系统ArgumentException:'值的类型与列类型不匹配无法存储<系统字节[]>在bin列中。类型应为Byte[]。'

    我还能做些什么来导入二进制数据?在SQL Server中,它需要存储为 varbinary .

    1 回复  |  直到 1 年前
        1
  •  1
  •   Steve    1 年前

    你的代码中有一个错误。

    您应该创建 mappedRow 来自 dtCloned 桌子因为这是Byte[]列数据类型的DataTable

    var mappedRow = dtCloned.NewRow();
    

    此外,当您将新行添加到 dtCloned 桌子你可以使用 mappedRow

    dtCloned.Rows.Add(mappedRow);