在一个叫dvbuy的datagridview中里显示有多行数据,现想把这些行的数据都保存到数据库中,我的代码是:
private void btsure_Click(object sender, EventArgs e)
        {
            SqlCommand objcmd = new SqlCommand("", conn);
            objcmd.CommandText = "insert into 开单表" + "(帐单号,餐桌号,项目名称,单价,金额,开单人,开单时间,是否结帐)" + "values" + "(@帐单号,@餐桌号,@项目名称,@单价,@金额,@开单人,@开单时间,@是否结帐)";
            for (int i = 0; i < dvbuy.Rows.Count; i++)
            { 
                objcmd.Parameters.Add("@帐单号", SqlDbType.NVarChar);
                objcmd.Parameters.Add("@餐桌号", SqlDbType.NVarChar);
                objcmd.Parameters.Add("@项目名称", SqlDbType.NVarChar);
                objcmd.Parameters.Add("@单价", SqlDbType.NVarChar);
                objcmd.Parameters.Add("@金额", SqlDbType.NVarChar);
                objcmd.Parameters.Add("@开单人", SqlDbType.NVarChar);
                objcmd.Parameters.Add("@开单时间", SqlDbType.NVarChar);
                objcmd.Parameters.Add("@是否结帐", SqlDbType.NVarChar);
                objcmd.Parameters["帐单号"].Value = dvbuy.Rows[i].Cells[0];
                objcmd.Parameters["餐桌号"].Value = dvbuy.Rows[i].Cells[1];
                objcmd.Parameters["项目名称"].Value = dvbuy.Rows[i].Cells[2];
                objcmd.Parameters["单价"].Value = dvbuy.Rows[i].Cells[3];
                objcmd.Parameters["金额"].Value = dvbuy.Rows[i].Cells[4];
                objcmd.Parameters["开单人"].Value = dvbuy.Rows[i].Cells[5];
                objcmd.Parameters["开单时间"].Value = dvbuy.Rows[i].Cells[6];
                objcmd.Parameters["是否结帐"].Value = dvbuy.Rows[i].Cells[7];
            }
            objcmd.ExecuteNonQuery(); 
        }但在执行事件代码时出现未处理 System.IndexOutOfRangeException
“此 SqlParameterCollection 中未包含带有 ParameterName“帐单号”的 SqlParameter。”  但我明明设置了SQL参数和哦,不知道是什么原因,请高手指教!多谢!!!

解决方案 »

  1.   

    objcmd.Parameters["@帐单号"].Value = dvbuy.Rows[i].Cells[0];或者objcmd.Parameters[0].Value = dvbuy.Rows[i].Cells[0];
      

  2.   

    都少了@
                    objcmd.Parameters["帐单号"].Value = dvbuy.Rows[i].Cells[0];
                    objcmd.Parameters["餐桌号"].Value = dvbuy.Rows[i].Cells[1];
                    objcmd.Parameters["项目名称"].Value = dvbuy.Rows[i].Cells[2];
                    objcmd.Parameters["单价"].Value = dvbuy.Rows[i].Cells[3];
                    objcmd.Parameters["金额"].Value = dvbuy.Rows[i].Cells[4];
                    objcmd.Parameters["开单人"].Value = dvbuy.Rows[i].Cells[5];
                    objcmd.Parameters["开单时间"].Value = dvbuy.Rows[i].Cells[6];
                    objcmd.Parameters["是否结帐"].Value = dvbuy.Rows[i].Cells[7];
      

  3.   

    按2楼的所说的改了,事件代码可以成功插入,但如果dvbuy有两行以上数据时就会显示“变量名'@帐单号'声明。变量名在查询批次或存储过程内部必须唯一的”。
      

  4.   

    按2楼的所说的改了,事件代码可以成功插入,但如果dvbuy有两行以上数据时就会显示“变量名'@帐单号'声明。变量名在查询批次或存储过程内部必须唯一的”。 怎么会出现这样的异常呢?我的“开单表”中“帐单号"字段都没有设为主键,怎么会说是唯一的呢,“帐单号”字段我只设为“不允许空”而巳。
      

  5.   

                SqlCommand objcmd = new SqlCommand("", conn);
                objcmd.CommandText = "insert into 开单表" + "(帐单号,餐桌号,项目名称,单价,金额,开单人,开单时间,是否结帐)" + "values" + "(@帐单号,@餐桌号,@项目名称,@单价,@金额,@开单人,@开单时间,@是否结帐)";
                for (int i = 0; i < dvbuy.Rows.Count; i++)
                { 
                    objcmd. Parameters.Clear(); //加上这句=================================
                    objcmd.Parameters.Add("@帐单号", SqlDbType.NVarChar);
                    objcmd.Parameters.Add("@餐桌号", SqlDbType.NVarChar);
                    objcmd.Parameters.Add("@项目名称", SqlDbType.NVarChar);
                    objcmd.Parameters.Add("@单价", SqlDbType.NVarChar);
                    objcmd.Parameters.Add("@金额", SqlDbType.NVarChar);
                    objcmd.Parameters.Add("@开单人", SqlDbType.NVarChar);
                    objcmd.Parameters.Add("@开单时间", SqlDbType.NVarChar);
                    objcmd.Parameters.Add("@是否结帐", SqlDbType.NVarChar);
                    objcmd.Parameters["@帐单号"].Value = dvbuy.Rows[i].Cells[0];
                    objcmd.Parameters["@餐桌号"].Value = dvbuy.Rows[i].Cells[1];
                    objcmd.Parameters["@项目名称"].Value = dvbuy.Rows[i].Cells[2];
                    objcmd.Parameters["@单价"].Value = dvbuy.Rows[i].Cells[3];
                    objcmd.Parameters["@金额"].Value = dvbuy.Rows[i].Cells[4];
                    objcmd.Parameters["@开单人"].Value = dvbuy.Rows[i].Cells[5];
                    objcmd.Parameters["@开单时间"].Value = dvbuy.Rows[i].Cells[6];
                    objcmd.Parameters["@是否结帐"].Value = dvbuy.Rows[i].Cells[7];
                    objcmd.ExecuteNonQuery(); //移动到循环内部==========================
                }