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

C#读取AES加密二进制数据到DataGridView报错求助

问题描述

我有一个数据库和一张数据表,表中ihbar_konusu字段存储的是AES加密的二进制数据(示例:0x30cb2f045041e388182a4f52193dd44e)。尝试用C#编写代码将该字段数据读取到DataGridView中时,运行出现类型转换错误。

代码示例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace ÇorluİK
{
    public partial class Form1 : Form
    {
        MySqlConnection con;
        MySqlCommand cmd;
        MySqlDataReader dr;

        string connectionString = "hidden";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // DataGridView için yeni bir DataTable oluşturun.
            DataTable dataTable = new DataTable();

            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                connection.Open();

                // Veritabanından verileri almak için SQL sorgusunu hazırlayın.
                string sqlQuery = "SELECT ihbar_konusu FROM corluik";

                using (MySqlCommand command = new MySqlCommand(sqlQuery, connection))
                {
                    using (MySqlDataAdapter adapter = new MySqlDataAdapter(command))
                    {
                        // Verileri DataTable'a doldurun.
                        adapter.Fill(dataTable);
                    }
                }
            }

            // DataGridView'e DataTable'ı bağlayın.
            dataGridView1.DataSource = dataTable;
        }
    }
}

错误信息

无法将System.Byte[]类型的对象转换为System.String类型。

解决方案

错误原因是ihbar_konusu字段为二进制类型(byte[]),但DataGridView默认尝试将其作为字符串渲染,导致类型不匹配。提供两种解决方式:

方式1:SQL查询时直接转换为字符串

修改SQL语句,将二进制数据转为十六进制字符串后查询:

SELECT HEX(ihbar_konusu) AS ihbar_konusu FROM corluik

查询结果直接为字符串类型,DataGridView可正常显示。

方式2:C#代码中处理二进制数据

保留原SQL查询,在填充DataTable后手动转换二进制数据为字符串:

private void button1_Click(object sender, EventArgs e)
{
    DataTable dataTable = new DataTable();

    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string sqlQuery = "SELECT ihbar_konusu FROM corluik";

        using (MySqlCommand command = new MySqlCommand(sqlQuery, connection))
        {
            using (MySqlDataAdapter adapter = new MySqlDataAdapter(command))
            {
                adapter.Fill(dataTable);
            }
        }
    }

    // 添加字符串列存储转换后的数据
    dataTable.Columns.Add("ihbar_konusu_str", typeof(string));
    foreach (DataRow row in dataTable.Rows)
    {
        byte[] binaryData = (byte[])row["ihbar_konusu"];
        // 将byte[]转为无分隔符的十六进制字符串
        row["ihbar_konusu_str"] = BitConverter.ToString(binaryData).Replace("-", "");
    }

    // 绑定数据源并隐藏原二进制列
    dataGridView1.DataSource = dataTable;
    dataGridView1.Columns["ihbar_konusu"].Visible = false;
}

补充说明

  • 若后续需要解密数据,优先选择方式2,可保留原始二进制数据用于解密操作;
  • 若仅需显示数据,方式1更简洁高效。

内容的提问来源于stack exchange,提问作者ozan babataş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:52:46