debugging 在列下插入新文本显示为0,但在数据库浏览器中显示正确,(SQLITE C#)

monwx1rj  于 2022-12-19  发布在  SQLite
关注(0)|答案(1)|浏览(118)

我有一个windowsform应用程序,用户可以在其中存储学生的姓名,电话号码和成绩。姓名列只存储字符串,而电话号码和成绩两列只存储整型。
我添加了一个按钮叫“添加学生”。它的目的是当用户完成填写三个文本框“姓名,电话号码和成绩”时使用,它会将它们存储在SQLite数据库中,数据会出现在数据网格视图中。
我的问题是,当按下按钮时,除了“名称”列外,所有列都正确显示。在DataGridView中,它将用户输入的所有名称显示为“0”,但当使用DB Browser for SQLite在数据库中查看时,名称显示正确。

我的密码

private void RefreshData()
        {
            Datagridview1.Rows.Clear();
            using SQLiteConnection SQLConnection = new(DBpath);
            using var cmd = new SQLiteCommand(DBpath, SQLConnection);
            SQLConnection.Open();
            cmd.CommandText = "SELECT * FROM Students";
            using (SQLiteDataReader read = cmd.ExecuteReader())
            {
                while (read.Read())
                { 
                     Datagridview1.Rows.Add(new object[] {
                     read.GetValue(0),
                     read.GetValue(1),
                     read.GetValue(2)
                     });
                }
                read.Close();
            }
            SQLConnection.Close();
        }

 public void WriteToTable()
            {
                string? SName = TXT_Name.Text;
                int? SPhone = Convert.ToInt32(TXT_Phone.Text);
                string SGrade = COMBO_Grade.Text;
                using SQLiteConnection SQLConnection = new(DBpath);
                using var cmd = new SQLiteCommand(DBpath, SQLConnection);
                SQLConnection.Open();
                cmd.CommandText = @"INSERT INTO Students(Name, Phone, Grade) VALUES ('" + SName + "', " + SPhone + ", '" + SGrade + "')";
                cmd.ExecuteNonQuery();
                SQLConnection.Close();
            }

 private void BTN_Add_Click(object sender, EventArgs e)
        {
            WriteToTable();
            RefreshData();
        }

Gif进一步证明

我试过检查datagridview属性,但它们都是正确的,我确保没有运行不必要的SQLite命令。

qlzsbp2j

qlzsbp2j1#

你的RefreshData方法不关心任何数据类型。GetValue()返回一个int。你想要的是一个string。因为你没有告诉它对象的实际类型,而且它最初是一个string,所以它被视为0(默认的int值)。
您要执行的操作:

...
while (read.Read()) {
  // Use the appropriate method to retrieve each value
  string name  = read.GetString(0);
  int    phone = read.GetInt32(1); // Consider also making this a string
  int    grade = read.GetInt32(2);

  Datagridview1.Rows.Add(new object[]{name, phone, grade});
}
...

我还注意到您的表缺少正确的ID。您应该确保至少包含一个唯一标识符。(电话号码可能不够)

相关问题