C#中SqlCommand无法工作,填充本地SQL Server数据库无响应
你的代码没反应?这几个关键问题得先解决
嘿,我瞅了下你的代码片段,立马发现几个导致程序“没反应”甚至悄悄出错的问题,咱们一个个捋清楚:
1. 用错了SQL执行方法
你用ExecuteNonQuery()来执行SELECT查询,这完全不对啊!这个方法是给增、删、改这类不返回结果集的命令用的,查询数据得用ExecuteScalar()(只查单个值的时候)或者ExecuteReader()(查多行结果的时候)。用错方法的话,你的查询根本拿不到studentID,后续逻辑直接就断了。
2. 没做异常处理,错误全被吞了
你包了try块,但没写catch和finally!要是数据库连不上、SQL语法错了,程序直接吞掉异常,啥提示都不给你,你自然觉得“代码没反应”——其实是出错了但你看不到。
3. SQL注入风险拉满,还容易出语法错
你直接把listBox1.SelectedItem拼进SQL字符串里,要是选中的名字里带个单引号(比如O'Neil),直接就语法报错了,而且这是典型的SQL注入漏洞,非常危险。必须用参数化查询。
4. 代码没写完,SqlDataRead...烂尾了
看起来你打算用SqlDataReader但没写完,这也会导致逻辑走不下去。
给你改好的完整代码
private void button2_Click(object sender, EventArgs e) { // 用using自动释放连接,省得手动关还容易忘 using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { try { conn.Open(); // 先检查用户有没有选中东西 if (dataGridView1.SelectedRows.Count != 0 && listBox1.SelectedIndex != -1) { string selectedStudentName = listBox1.SelectedItem.ToString(); // 参数化查询,安全还防语法错 string getStudentIdQuery = "SELECT studentID FROM student WHERE studentName LIKE @StudentName"; using (SqlCommand getStudentIdCmd = new SqlCommand(getStudentIdQuery, conn)) { // 把通配符%放在参数值里,别拼进SQL里 getStudentIdCmd.Parameters.AddWithValue("@StudentName", $"%{selectedStudentName}%"); // 只查单个ID,用ExecuteScalar效率最高 object studentIdResult = getStudentIdCmd.ExecuteScalar(); if (studentIdResult != null) { int studentId = Convert.ToInt32(studentIdResult); // 这里写你要执行的填充数据库逻辑,比如把DataGridView的行插入到某个表 foreach (DataGridViewRow selectedRow in dataGridView1.SelectedRows) { // 继续用参数化查询处理插入/更新 string insertQuery = "INSERT INTO 你的目标表(studentID, 列名1, 列名2) VALUES(@ID, @Col1, @Col2)"; using (SqlCommand insertCmd = new SqlCommand(insertQuery, conn)) { insertCmd.Parameters.AddWithValue("@ID", studentId); insertCmd.Parameters.AddWithValue("@Col1", selectedRow.Cells["对应列名1"].Value); insertCmd.Parameters.AddWithValue("@Col2", selectedRow.Cells["对应列名2"].Value); int rowsAffected = insertCmd.ExecuteNonQuery(); if (rowsAffected > 0) { MessageBox.Show("这条数据填充成功啦!"); } } } } else { MessageBox.Show($"没找到叫{selectedStudentName}的学生哦"); } } } else { MessageBox.Show("麻烦先选中DataGridView里的行和列表里的学生名称哦!"); } } catch (SqlException sqlEx) { // 专门抓数据库相关的错误,给具体提示 MessageBox.Show($"数据库出问题啦:{sqlEx.Message}"); } catch (Exception ex) { // 抓其他所有错误 MessageBox.Show($"程序出错了:{ex.Message}"); } // using会自动关闭连接,不用手动写conn.Close() } }
最后再啰嗦几句
- 以后处理数据库连接、命令这些对象,一定要用
using,它会自动帮你释放资源,不会留着连接占着数据库资源。 - 绝对绝对不要直接拼SQL字符串,参数化查询是底线,安全还省心。
- 异常处理一定要加,不然出问题了你连哪儿错了都不知道,光盯着代码发呆可不行。
内容的提问来源于stack exchange,提问作者Moe Kayal
相关产品推荐
相关产品推荐

