在显示错误的 Gridview 中显示 SQL Server 数据库值

Posted

技术标签:

【中文标题】在显示错误的 Gridview 中显示 SQL Server 数据库值【英文标题】:Displaying SQL Server database value in Gridview showing error 【发布时间】:2014-10-08 14:36:23 【问题描述】:

当我尝试在网格视图中显示数据库值时出现错误:

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

附加信息:关键字“and”附近的语法不正确。

代码是

private void button1_Click(object sender, EventArgs e)

    SqlDataAdapter adap;
    DataSet ds;

    SqlConnection cn = new SqlConnection(
      @"Data Source=DILIPWIN\SQLEXPRESS;Initial Catalog=radb;Integrated Security=True");
    cn.Open();

    var home = new Home();
    adap = new SqlDataAdapter(
      "select roll_num, mark from marks where mark < 50 and dept_id=" + 
       home.cboxDept.SelectedValue + "  and sem_id=" + home.cboxSem.SelectedValue + 
      " and subject_id=" + home.cboxSubject.SelectedValue + " and batch_id= " + 
       home.cboxBatch.SelectedValue + " and cls_id=" + home.cboxClass.SelectedValue, cn);

    ds = new System.Data.DataSet();
    adap.Fill(ds, "dataGridView1");

    dataGridView1.DataSource = ds.Tables[0];

【问题讨论】:

你能在所有连接后发布查询吗? 我假设您正在使用 WinForms 并且实际上正在使用 DataGridView?请始终适当地标记,否则你会浪费 WPF 人的时间! (反之亦然..) 【参考方案1】:

使用 sql-parameters 可能会解决此问题并防止未来的 sql 注入问题:

string sql = @"
SELECT roll_num, 
       mark 
FROM   marks 
WHERE  mark < 50 
AND    dept_id=@dept_id
AND    sem_id=@sem_id 
AND    subject_id=@subject_id 
AND    batch_id=@batch_id 
AND    cls_id=@cls_id;";

DataSet ds = new DataSet();
using(var cn = new SqlConnection(@"Data Source=DILIPWIN\SQLEXPRESS;Initial Catalog=radb;Integrated Security=True"))
using (var da = new SqlDataAdapter(sql, cn))
 
    da.SelectCommand.Parameters.AddWithValue("@dept_id", home.cboxDept.SelectedValue );
    da.SelectCommand.Parameters.AddWithValue("@sem_id", home.cboxSem.SelectedValue );
    da.SelectCommand.Parameters.AddWithValue("@subject_id", home.cboxSubject.SelectedValue );
    da.SelectCommand.Parameters.AddWithValue("@batch_id", home.cboxBatch.SelectedValue );
    da.SelectCommand.Parameters.AddWithValue("@cls_id", home.cboxClass.SelectedValue );
    da.Fill(ds);  // you don't need to open/close the connection with Fill

dataGridView1.DataSource = ds.Tables[0];

您还应该使用正确的类型。 AddWithValue 将尝试从值推断类型。因此,如果这些是 ints,您应该相应地解析它们 (int.Parse(home.cboxdept.SelectedValue ))。

【讨论】:

【参考方案2】:

此处缺少调用databind方法。使用以下代码:

GridView1.DataBind();//This line is missing in your code`

试试下面的格式

 DataAdapter adapter=new DataAdapter(SqlCommand,SqlConn);
 DataTable tbl=new Datatable();
 adapter.Fill(tbl);
 GridView1.DataSource=tbl;
 GridView1.DataBind();//This line is missing in your code

`

【讨论】:

“关键字'and'附近的语法不正确。”它也是winforms而不是webforms。

以上是关于在显示错误的 Gridview 中显示 SQL Server 数据库值的主要内容,如果未能解决你的问题,请参考以下文章

用于获取重复记录并在 Gridview 中显示为一行的 SQL 查询

如何使用 linq2sql 在单个 gridview 或 gridpanel 中显示来自多个表的数据?

将excel数据导入sql server数据库表并在gridview中显示

GridView 列验证,显示错误信息不要失去焦点

gridview分页不显示数据

在 Flutter 的 GridView 中显示图像?