使用C#和ASP检查数据集中是否存在列值

使用C#和ASP检查数据集中是否存在列值,c#,asp.net,ms-access,C#,Asp.net,Ms Access,我已经尝试了我找到的各种解决方案,要么我不知道如何正确地实施它们,要么它们根本不起作用。我有一个方法,允许某人在表中搜索特定的订单号,然后行的其余部分将显示在gridview中。但是,如果输入的订单号在表中不存在,则我可以得到服务器错误/异常。我如何才能在搜索之前或搜索过程中,如果搜索数据库中不存在的订单号,那么我可以创建错误 我正在使用ms access数据库、C#和ASP 以下是我正在使用的一些代码: 用于搜索订单表的方法: public static dsOrder SearchOrder

我已经尝试了我找到的各种解决方案,要么我不知道如何正确地实施它们,要么它们根本不起作用。我有一个方法,允许某人在表中搜索特定的订单号,然后行的其余部分将显示在gridview中。但是,如果输入的订单号在表中不存在,则我可以得到服务器错误/异常。我如何才能在搜索之前或搜索过程中,如果搜索数据库中不存在的订单号,那么我可以创建错误

我正在使用ms access数据库、C#和ASP

以下是我正在使用的一些代码:

用于搜索订单表的方法:

public static dsOrder SearchOrder(string database, string orderNum)
{
    dsOrder DS;
    OleDbConnection sqlConn;
    OleDbDataAdapter sqlDA;

    sqlConn = new OleDbConnection("PROVIDER=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + database);

    DS = new dsOrder();

    sqlDA = new OleDbDataAdapter("select * from [Order] where order_num='" + orderNum + "'" , sqlConn);

    sqlDA.Fill(DS.Order);

    return DS;
}
使用这种方法:

protected void btnSearch_Click(object sender, EventArgs e)
{
    Session["OrderNum"] = txtSearch.Text;
    Session["ddl"] = ddlSearch.Text;


    if (Session["ddl"].ToString() == "Order")
    {
        dsOrder dataSet2;

        dataSet2 = Operations.SearchOrder(Server.MapPath("wsc_database.accdb"), Session["OrderNum"].ToString());

        grdSearch.DataSource = dataSet2.Tables["Order"];

        grdSearch.DataBind();

    }
我需要试一试吗


非常感谢能帮助我的人

您只需检查数据集是否为空即可

if (dataSet2 == null || dataSet2.Tables.Count == 0 || dataSet2.Tables["Order"] == null || dataSet2.Tables["Order"].Rows.Count == 0)
{
    //display error to user
}
else
{
    // your code to populate grid 
}
如果您不想显示错误,那么只需在填充GridView之前进行此检查

if (dataSet2.Tables != null && dataSet2.Tables["Order"] != null)
{
    // your code to populate grid
}

我在填充数据网格时使用不同的方法,并始终使用以下参数:

public static DataTable GetGridDatasource(string database, string ordnum) {
  using (OleDbConnection con = new OleDbConnection("PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" + database))
  {
    con.Open();
    OleDbCommand cmd = con.CreateCommand();
    cmd.CommandText = "select * from [Order] where order_num=[OrderNumber]";
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("OrderNumber", ordnum);
    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    return dt;
  }
}
protected void btnSearch_Click(object sender, EventArgs e)
{
  Session["OrderNum"] = txtSearch.Text;
  Session["ddl"] = ddlSearch.Text;


  if (Session["ddl"].ToString() == "Order")
  {
    grdSearch.DataSource = GetGridDatasource(Server.MapPath("wsc_database.accdb"), Session["OrderNum"].ToString());

  }
}

Session[“ddl”].ToString()
,为避免冗余,请使用
ddlSearch.Text==“Order”
如果会话不在页面间持久化,我也会避免使用会话。只需使用ViewState。您是否在保护自己不受SQL注入的影响?如果有人把sql放进你的txtSearch.Text会怎么样?是的,我不知道为什么我把它放在会话中,它已经成为一个坏习惯。我已经修改了很多代码来帮助防止SQL禁令,但在这方面还没有做得太多。