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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:38:43