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

C#连接SQL Server执行查询报错System.Data.SqlClient.SqlException求助

解决SQL Server连接时的'System.Data.SqlClient.SqlException'语法错误问题

嘿,我懂你现在头疼的点——试了DataSet、DataReader好几种方法,结果都栽在同一个SQL语法错误上,还提示'1012'附近有问题。大概率是你直接拼接文本框内容到SQL语句里踩坑了,我来帮你捋清楚怎么解决:

最可能的问题根源:SQL字符串拼接的语法漏洞

你应该是直接把med_ID文本框的内容拼进了SQL语句里吧?比如写成这样:

string query = "SELECT * FROM 你的表名 WHERE med_ID = " + med_ID.Text;

如果med_ID是字符串类型的字段,那这条语句就会变成WHERE med_ID = 1012,缺少单引号的数据库会把1012当成数字,直接触发语法错误;就算是数字类型,要是用户输入了特殊字符(比如空格、引号),照样会炸。而且这种写法还会有SQL注入的风险,绝对是要避免的!

正确的解决方式:用参数化查询

不管你用DataReader还是DataSet,参数化查询都能同时解决语法错误和安全问题,给你两个示例:

1. 用SqlDataReader绑定DataGridView

// 替换成你的数据库连接字符串
string connString = "Server=你的服务器名;Database=你的库名;Integrated Security=True;";
// 用@MedID作为参数占位符,不要直接拼文本
string query = "SELECT * FROM 你的表名 WHERE med_ID = @MedID";

using (SqlConnection conn = new SqlConnection(connString))
{
    using (SqlCommand cmd = new SqlCommand(query, conn))
    {
        // 根据数据库里med_ID的类型设置参数类型
        // 如果是字符串类型:
        cmd.Parameters.Add("@MedID", SqlDbType.VarChar, 50).Value = med_ID.Text.Trim();
        // 如果是整数类型:
        // cmd.Parameters.Add("@MedID", SqlDbType.Int).Value = int.Parse(med_ID.Text.Trim());

        conn.Open();
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            DataTable dt = new DataTable();
            dt.Load(reader);
            dgrAffich_tab.DataSource = dt;
        }
    }
}

2. 用DataSet绑定DataGridView

string connString = "你的连接字符串";
string query = "SELECT * FROM 你的表名 WHERE med_ID = @MedID";

using (SqlConnection conn = new SqlConnection(connString))
{
    SqlDataAdapter adapter = new SqlDataAdapter(query, conn);
    // 同样添加参数
    adapter.SelectCommand.Parameters.Add("@MedID", SqlDbType.VarChar).Value = med_ID.Text.Trim();
    
    DataSet ds = new DataSet();
    adapter.Fill(ds);
    dgrAffich_tab.DataSource = ds.Tables[0];
}

额外排查技巧:捕获完整错误信息

如果还是不确定问题在哪,可以加个异常捕获,把完整的错误和执行的SQL打出来,一眼就能找到语法问题:

try
{
    // 上面的数据库操作代码
}
catch (SqlException ex)
{
    MessageBox.Show($"错误详情:{ex.Message}\n执行的SQL语句:{(ex.TargetSite as SqlCommand)?.CommandText}");
}

最后还要检查这两点

  • 确认数据库里的表名、字段名拼写完全正确,比如med_ID是不是真的存在于你的表中?有没有大小写或者拼写错误?
  • 如果med_ID是数字类型,要确保文本框输入的内容是有效的数字,避免转换错误,可以加个int.TryParse验证。

内容的提问来源于stack exchange,提问作者D.Sofia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:03:27