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

C# 在Gridview中显示SQL Server数据库值显示错误,c#,sql,sql-server,gridview,C#,Sql,Sql Server,Gridview,尝试在gridview中显示数据库值时,出现错误: System.Data.dll中发生类型为“System.Data.SqlClient.SqlException”的未处理异常 其他信息:关键字“and”附近的语法不正确 代码是 private void button1_Click(object sender, EventArgs e) { SqlDataAdapter adap; DataSet ds; SqlConnection cn = new SqlConne

尝试在gridview中显示数据库值时,出现错误:

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];
}
private void按钮1\u单击(对象发送者,事件参数e)
{
sqldataadap;
数据集ds;
SqlConnection cn=新的SqlConnection(
@“数据源=DILIPWIN\SQLEXPRESS;初始目录=radb;集成安全性=True”);
cn.Open();
var home=新家();
adap=新的SqlDataAdapter(
“选择roll_num,从标记<50和部门id=“+
home.cboxDept.SelectedValue+”和sem_id=“+home.cboxSem.SelectedValue+
“和subject_id=“+home.cboxSubject.SelectedValue+”和batch_id=“+
home.cboxBatch.SelectedValue+”和cls_id=“+home.cboxClass.SelectedValue,cn);
ds=新的System.Data.DataSet();
adap.Fill(ds,“dataGridView1”);
dataGridView1.DataSource=ds.Tables[0];
}

此处缺少调用数据绑定方法的Use。请使用以下代码:

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

`

使用sql参数可能会解决此问题,并防止将来出现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];
stringsql=@”
选择roll_num,
做记号
从马克
其中标记<50
和dept\u id=@dept\u id
和sem_id=@sem_id
和subject\u id=@subject\u id
和batch\u id=@batch\u id
和cls_id=@cls_id;“;
数据集ds=新数据集();
使用(var cn=new SqlConnection(@“Data Source=DILIPWIN\SQLEXPRESS;Initial Catalog=radb;Integrated Security=True”))
使用(var da=newsqldataadapter(sql,cn))
{ 
da.SelectCommand.Parameters.AddWithValue(“@dept\u id”,home.cboxDept.SelectedValue);
da.SelectCommand.Parameters.AddWithValue(“@sem\u id”,home.cboxSem.SelectedValue);
da.SelectCommand.Parameters.AddWithValue(“@subject\u id”,home.cboxSubject.SelectedValue);
da.SelectCommand.Parameters.AddWithValue(“@batch\u id”,home.cboxBatch.SelectedValue);
da.SelectCommand.Parameters.AddWithValue(“@cls\u id”,home.cboxClass.SelectedValue);
da.Fill(ds);//不需要用Fill打开/关闭连接
}
dataGridView1.DataSource=ds.Tables[0];

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

“关键字'and'附近的语法不正确。”这也是winforms而不是webforms。在所有连接之后,您可以发布查询吗?我假设您使用的是winforms,实际上使用的是DataGridView??请始终正确标记,否则会浪费WPF人员的时间!(反之亦然)