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ş
相关产品推荐
相关产品推荐

