C# SQLite程序中DataGridView显示Name列为0,数据库显示正常
问题分析与解决方案
你的问题核心在于数据读取时的类型处理不当,以及SQLiteCommand构造参数错误,同时代码存在SQL注入风险。以下是具体解决步骤:
1. 修正SQLiteCommand构造错误
你在RefreshData和WriteToTable方法中创建SQLiteCommand时,错误地将连接字符串DBpath作为第一个参数传入(该参数应为SQL命令文本),虽然后续覆盖了CommandText,但可能导致底层执行异常。正确的创建方式有两种:
方式一:直接传入命令文本和连接对象
using var cmd = new SQLiteCommand("SELECT * FROM Students", SQLConnection);
方式二:通过连接对象创建命令
using var cmd = SQLConnection.CreateCommand(); cmd.CommandText = "SELECT * FROM Students";
2. 解决Name列显示0的问题
手动添加行时,read.GetValue(0)返回的是object类型,若DataGridView列类型识别异常,会将字符串转换为默认数值0。建议明确指定读取类型,或改用DataTable绑定(更可靠):
方案A:明确读取数据类型
修改RefreshData中的行添加代码:
while (read.Read()) { Datagridview1.Rows.Add(new object[] { read.GetString(0), // 明确读取字符串类型的Name列 read.GetInt32(1), // 读取整数类型的Phone列 read.GetInt32(2) // 读取整数类型的Grade列 }); }
方案B:使用DataTable自动绑定(推荐)
这种方式无需手动添加行,避免类型转换问题:
private void RefreshData() { using SQLiteConnection SQLConnection = new(DBpath); SQLConnection.Open(); using var cmd = SQLConnection.CreateCommand(); cmd.CommandText = "SELECT * FROM Students"; DataTable studentTable = new DataTable(); using SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd); adapter.Fill(studentTable); Datagridview1.DataSource = studentTable; }
3. 修复SQL注入风险与类型错误
你的WriteToTable方法直接拼接SQL语句,存在严重的SQL注入风险,且Grade列作为整数却以字符串插入。改用参数化查询并正确处理类型转换:
public void WriteToTable() { string sName = TXT_Name.Text.Trim(); if (string.IsNullOrEmpty(sName)) { MessageBox.Show("请输入学生姓名"); return; } if (!int.TryParse(TXT_Phone.Text, out int sPhone)) { MessageBox.Show("请输入有效的电话号码"); return; } if (!int.TryParse(COMBO_Grade.Text, out int sGrade)) { MessageBox.Show("请输入有效的成绩"); return; } using SQLiteConnection SQLConnection = new(DBpath); SQLConnection.Open(); using var cmd = SQLConnection.CreateCommand(); cmd.CommandText = @"INSERT INTO Students(Name, Phone, Grade) VALUES (@Name, @Phone, @Grade)"; // 添加参数,避免SQL注入 cmd.Parameters.AddWithValue("@Name", sName); cmd.Parameters.AddWithValue("@Phone", sPhone); cmd.Parameters.AddWithValue("@Grade", sGrade); cmd.ExecuteNonQuery(); }
验证修改
完成上述修改后,点击"Add student"按钮,DataGridView的Name列将正确显示存储的学生姓名,同时代码更安全、鲁棒。
内容的提问来源于stack exchange,提问作者Ahmed Sherif
相关产品推荐
相关产品推荐

