我们老师布置了一份作业,我有个问题不明白特来向大家请教:
我做的是一个招标功能,主要有三张表:1.招标信息表ZBXX(ZID,Zname,Zmoney)列名分别是:编号、项目名、需要的保证金数额。2.保证金表:BZJ(BID,ZID,Buser,Bmoney)列名分别是:编号、ZID是ZBXX的外键、交保证金用户名、已交保证金数额。3.投标信息表:TBXX(,,)。现在要求从前台页面文本框中输入一个招标项目的编号,并且从这两张表中选取出Zmoney、Bmoney,判断这两个值是否相等,如果相等则可以进行投标,往表TBXX(,,)中插入数据,不等则弹出“保证金不符”的提示框,我写的代码是:
    protected void btnbid_Click(object sender, EventArgs e)
    {        SqlConnection sqlconn = myCon.getCon();
        sqlconn.Open();
        string strComm1 = "SELECT Zmoney,Bmoney FROM ZBXX,BZJ WHERE ZBXX.ZID='" + ZID.Text + "' AND BZJ.ZID='" + ZID.Text + "'AND BZJ.Buser='" + Session["name"].ToString() + "'";
        SqlDataAdapter myApter = new SqlDataAdapter(strComm1, sqlconn);
        DataSet myDS = new DataSet();
        myApter.Fill(myDS, "ZBXX,BZJ");
        DataRowView rowView = myDS.Tables["ZBXX,BZJ"].DefaultView[0];        if (Convert.ToString(rowView["Zmoney"]) == Convert.ToString(rowView["Bmoney"]))
        {
            string strComm2 = "INSERT INTO TBXX VALUES(,,,)";
            Response.Write("<script>alert('恭喜您,投标成功!');location.href='../BIDUSER/UserLogined.aspx';</script>"); 
        }
        else
        {
            Response.Write("<script>alert('对不起,您对该项目的保证金不符!');location.href='../BIDUSER/UserLogined.aspx';</script>");
        }
        sqlconn.Close();
    }这段代码应该怎么改才能够从2张表中选出Zmoney、Bmoney并比较?(我试过了INSERT语句是没问题的)

解决方案 »

  1.   


    protected void btnbid_Click(object sender, EventArgs e)
      {  SqlConnection sqlconn = myCon.getCon();
      sqlconn.Open();
      string strComm1 = "SELECT Zmoney,Bmoney FROM ZBXX,BZJ WHERE ZBXX.ZID='" + ZID.Text.Trim() + "' AND BZJ.ZID='" + ZID.Text.Trim() + "'AND BZJ.Buser='" + Session["name"].ToString() + "'";
      SqlDataAdapter myApter = new SqlDataAdapter(strComm1, sqlconn);
      DataSet myDS = new DataSet();
      myApter.Fill(myDS, "ZBXX,BZJ");
      DataRowView rowView = myDS.Tables["ZBXX,BZJ"].DefaultView[0];  if (rowView["Zmoney"].ToString().Equals(rowView["Bmoney"].ToString())
      {
      string strComm2 = "INSERT INTO TBXX VALUES(,,,)";
      Response.Write("<script>alert('恭喜您,投标成功!');location.href='../BIDUSER/UserLogined.aspx';</script>"); 
      }
      else
      {
      Response.Write("<script>alert('对不起,您对该项目的保证金不符!');location.href='../BIDUSER/UserLogined.aspx';</script>");
      }
      sqlconn.Close();
      }
      

  2.   

    我用1楼的代码试了一下,还是不能把数据插入TBXX()表中,如果不用if()条件语句直接插入TBXX()的话是可以插入的,用了if()之后就不行了,保证金不对的话,else()也不弹出“对不起,您对该项目的保证金不符!”,而是:
    索引 0 不是为负数,就是大于行数。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.IndexOutOfRangeException: 索引 0 不是为负数,就是大于行数。源错误: 
    行 49:         DataSet myDS = new DataSet();
    行 50:         myApter.Fill(myDS, "ZBXX,BZJ");
    行 51:         DataRowView rowView = myDS.Tables["ZBXX,BZJ"].DefaultView[0];
    行 52: 
    行 53:         if (rowView["Zmoney"].ToString().Equals(rowView["Bmoney"].ToString()))
     
      

  3.   

    DataRowView rowView = myDS.Tables[0].DefaultView;
      

  4.   

    我再次仔细检查了代码,在string strComm2 = "INSERT INTO TBXX VALUES(,,,)";后面添加了sqlBind.DataCom(strComm2);就可以将数据插入TBXX(,,)了,现在剩下的唯一问题是保证金不对的话,else()不弹出“对不起,您对该项目的保证金不符!”,依然显示“索引 0 不是为负数,就是大于行数。”,请高手支招啊。
    还有改成3楼的DataRowView rowView = myDS.Tables[0].DefaultView;显示:
    编译错误 
    说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。 编译器错误消息: CS0029: 无法将类型“System.Data.DataView”隐式转换为“System.Data.DataRowView”
      

  5.   

      myApter.Fill(myDS, "ZBXX_BZJ");
      DataRowView rowView = myDS.Tables["ZBXX_BZJ"].DefaultView[0];
      

  6.   

    回复于:2011-05-08 11:09:47myApter.Fill(myDS, "ZBXX_BZJ");
      DataRowView rowView = myDS.Tables["ZBXX_BZJ"].DefaultView[0]; 
    当保证金不符时:
      else
      {
      Response.Write("<script>alert('对不起,您对该项目的保证金不符!');location.href='../BIDUSER/UserLogined.aspx';</script>");
      }
    还是:
    索引 0 不是为负数,就是大于行数。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.IndexOutOfRangeException: 索引 0 不是为负数,就是大于行数。源错误: 
    行 49:         DataSet myDS = new DataSet();
    行 50:         myApter.Fill(myDS, "ZBXX_BZJ");
    行 51:         DataRowView rowView = myDS.Tables["ZBXX_BZJ"].DefaultView[0];
    行 52: 
    行 53:         if (rowView["Zmoney"].ToString().Equals(rowView["Bmoney"].ToString()))
     
    谢谢您的热心帮助
      

  7.   


    foreach(DataRowView drv in myDS.Tables[0].DefaultView)
    {
      if (double.Parse(drv["Zmoney"].ToString()) == double.Parse(drv["Bmoney"].ToString()))
      {
      string strComm2 = "INSERT INTO TBXX VALUES(,,,)";
      Response.Write("<script>alert('恭喜您,投标成功!');location.href='../BIDUSER/UserLogined.aspx';</script>"); 
      }
      else
      {
      Response.Write("<script>alert('对不起,您对该项目的保证金不符!');location.href='../BIDUSER/UserLogined.aspx';</script>");
      }
    }
      sqlconn.Close();
      }
      

  8.   

    char的??
    试试下面的这个看看,你打个断点跟踪一下吧,很容找到错误的。将光标置于 SqlConnection sqlconn = myCon.getCon();  语句前,按下F9,然后F5,点下按钮后,按F11单步调试,走走看
     foreach(DataRowView drv in myDS.Tables[0].DefaultView)
    {
      if (drv["Zmoney"].ToString() == drv["Bmoney"].ToString())
      {
      string strComm2 = "INSERT INTO TBXX VALUES(,,,)";
      Response.Write("<script>alert('恭喜您,投标成功!');location.href='../BIDUSER/UserLogined.aspx';</script>"); 
      }
      else
      {
      Response.Write("<script>alert('对不起,您对该项目的保证金不符!');location.href='../BIDUSER/UserLogined.aspx';</script>");
      }
    }
      sqlconn.Close();
      }
      

  9.   

    谢谢taomanman(暖枫无敌),我换上foreach(),当保证金不符时,点击按钮什么反应都没有,调试发现 “System.Threading.ThreadAbortException 中第一次偶然出现的“mscorlib.dll”类型的异常”,实力问题我看不明白。明天就要交课程设计了,必须抓紧时间完成,我用了另一种方法实现,没想到成功了,代码如下:
        protected void btnbid_Click(object sender, EventArgs e)
        {
            SqlConnection sqlconn = myCon.getCon();
            sqlconn.Open();
            string strComm1 = "SELECT Zmoney,Bmoney FROM ZBXX,BZJ WHERE ZBXX.ZID='" + ZID.Text + "' AND BZJ.ZID='" + ZID.Text + "'AND BZJ.Buser='" + Session["name"].ToString() + "'";
            SqlCommand sqlcom = new SqlCommand(strComm1, sqlconn);
            SqlDataReader read = sqlcom.ExecuteReader();
            read.Read();        if (read.HasRows)
            {
                if (read["Zmoney"].ToString().Trim() == read["Bmoney"].ToString().Trim())
                {
                    string strComm2 = "INSERT INTO TBXX VALUES('" + ZID.Text + "','" + Session["BID"].ToString() + "','" + Request.QueryString["TID"] + "','" + DateTime.Now.ToString() + "')";
                    sqlBind.DataCom(strComm2);
                    Response.Write("<script>alert('恭喜您,投标成功!');location.href='../BIDUSER/UserLogined.aspx';</script>");
                    return;
                }
            }        else
                {
                    Response.Write("<script>alert('对不起,您对该项目的保证金不符!');location.href='../BIDUSER/UserLogined.aspx';</script>");
                }
                read.Close();
            sqlconn.Close();
        }虽然成功了,但是用以前的方法为什么else()语句没法执行?思考......