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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:20:27