如何让带WHERE子句的SQLite查询正常运行并将结果填入文本框
问题排查
- 核心错误:你在方法内新实例化了一个Form1对象
Form1 idcliente = new Form1();,这个新创建的窗体实例的txtidpersona文本框是初始空值,根本不是你已经输入了查询ID的、正在运行的原窗体实例,所以传入的@idpersona参数为空,自然匹配不到任何数据。 - 次要隐患:如果数据库中
idpersona是整数类型,你直接传字符串类型的文本框内容作为参数,可能因为SQLite隐式类型转换规则匹配失败,建议先转为整数再传参。 - 可优化点:SQL语句中的字段名建议和建表时的大小写保持一致,避免开启大小写敏感时匹配失败。
修复后的查询方法
首先修改方法,把要查询的ID作为参数传入,不要在方法内部实例化窗体:
public List<Persona> Listarwhere(int idPersonaBuscar) { List<Persona> oLista = new List<Persona>(); using (SQLiteConnection conexion = new SQLiteConnection(cadena)) { conexion.Open(); string query = "select IdPersona, Nombre, Apellido, Telefono from Persona where IdPersona = @idpersona"; SQLiteCommand cmd = new SQLiteCommand(query, conexion); // 传入整数类型的参数,和数据库字段类型匹配 cmd.Parameters.Add(new SQLiteParameter("@idpersona", idPersonaBuscar)); cmd.CommandType = System.Data.CommandType.Text; using (SQLiteDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { oLista.Add(new Persona() { IdPersona = int.Parse(dr["IdPersona"].ToString()), Nombre = dr["Nombre"].ToString(), Apellido = dr["Apellido"].ToString(), Telefono = dr["Telefono"].ToString() }); } } } return oLista; }
查询结果填入文本框实现方案
在你原窗体的查询按钮点击事件里调用上述方法,拿到结果后给文本框赋值即可:
// 假设是查询按钮的点击事件 private void btnBuscar_Click(object sender, EventArgs e) { // 先校验输入的ID是否为合法整数 if (!int.TryParse(txtidpersona.Text, out int idBuscar)) { MessageBox.Show("请输入合法的人员ID"); return; } // 调用查询方法 List<Persona> resultado = Listarwhere(idBuscar); // 判断是否查询到数据 if (resultado.Count > 0) { Persona dato = resultado.First(); // 给对应文本框赋值,文本框名称根据你实际的修改 txtNombre.Text = dato.Nombre; txtApellido.Text = dato.Apellido; txtTelefono.Text = dato.Telefono; } else { MessageBox.Show("未查询到对应人员信息"); // 没有查询到结果时清空文本框 txtNombre.Clear(); txtApellido.Clear(); txtTelefono.Clear(); } }
内容的提问来源于stack exchange,提问作者Oscar2017
相关产品推荐
相关产品推荐

