通过存储过程将数据插入主详细信息表

时间:2015-09-30 08:10:51

标签: c# mysql stored-procedures sqlparameters

我正在尝试使用存储过程将数据添加到主/详细信息表中。

我试过了:

private void ekle()
{ 
    MySqlCommand cmd = new MySqlCommand("invinputfrompo", bag);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("?trnotes", MySqlDbType.Text).Value = tb1.Text;
    for (int i = 0; i <= dg1.Rows.Count - 1; i++)
    {
        if (Convert.ToBoolean(dg1.Rows[i].Cells[0].Value) == true)
        {

            cmd.Parameters.Add("?docno", MySqlDbType.VarChar).Value = dg1.Rows[i].Cells[9].Value.ToString();
            cmd.Parameters.Add("?idpodetails", MySqlDbType.Int32).Value = Convert.ToInt32(dg1.Rows[i].Cells[5].Value.ToString());
            cmd.Parameters.Add("?idmat", MySqlDbType.Int32).Value = Convert.ToInt32(dg1.Rows[i].Cells[6].Value.ToString());
            cmd.Parameters.Add("?sn", MySqlDbType.VarChar).Value = dg1.Rows[i].Cells[2].Value;
            cmd.Parameters.Add("?qty", MySqlDbType.Decimal).Value = Convert.ToDecimal(dg1.Rows[i].Cells[1].Value);
            //if (dg1.CurrentRow.Cells[4].Value.ToString() == "") { cmd.Parameters.Add("?shelflife", MySqlDbType.Date).Value = DBNull.Value; }
            //else { cmd.Parameters.Add("?shelflife", MySqlDbType.Date).Value = dg1.CurrentRow.Cells[4].Value.ToString(); }
            cmd.Parameters.Add("?shelflife", MySqlDbType.VarChar).Value = dg1.Rows[i].Cells[4].Value;
        }
    }
    cmd.Connection = bag;
    cmd.ExecuteNonQuery();
}

只有第一个参数“trnotes”会被添加到主表中,其他参数将被添加到详细信息表中。

我做了这样的循环,但方式不成功。它说你已经定义了“docno”(详细信息表中的第一个参数)

你能帮忙输入数据吗?

1 个答案:

答案 0 :(得分:0)

当if语句第二次运行时,它会尝试将docno添加到第一次迭代时创建的参数列表中。在第一次迭代中添加了docno,它已经存在。

有几种方法可以解决这个问题:

  • 执行每行的存储过程。缺点是你 有额外的数据库调用的开销。
  • 使用User-Defined Table Types。你会在C#中建立你的表 然后将其作为参数传递给您的存储过程 插入你的桌子。