none
插入记录到主从表 RRS feed

  • 问题

  • 我做了两个主从表,一个产品表(Product)字段有:ProductId(主键) ProductName(产品名称),Price(价格)一个产品明细表(Detail)字段有:id(主键,自动增长) ProductId(外键),DetailImages(产品明细图). 我现在在同一个页面进行产品上传添加,因为产品明细表中一次上传会有多张产品明细图。所以我想请教如何写存储过程。

    我是这么想的:create PROCEDURE spAddProduct

                       @ProductId varchar(50),@ProductName varchar(100),@Price decimal(18,4),@DetailImages varchar(200)

     as begin tran    insert into Product (ProductId,ProductName,Price) values(@ProductId,@ProductName,@Price)

                            insert into Detail(ProductId,DetailImages) values(@ProductId,@DetailImages)

       commit tran

    这样似乎是实现了我要的效果,但是我在添加产品的时候,产品明细图有多张,具体几张事先不知道,所以“insert into Detail(ProductId,DetailImages) values(@ProductId,@DetailImages)”这条语句不知道要执行多少次,里面的变量@DetailImages也要很多个。请问这种情况有没比较好的解决方案呢,谢谢

    2010年12月4日 7:56

答案

  • using (SqlConnection conn = new SqlConnection("your connections"))
    {
      conn.Open();
      SqlTransaction trans = conn.BeginTransaction();
      SqlCommand comm = new SqlCommand();
    
      comm.Connection = conn;
      comm.Transaction = trans;
    
      try
      {
        comm.CommandText = "insert into Product values(@ProductId,@ProductName,@Price)";
        comm.Parameters.AddRange(new SqlParameter[] { 
          new SqlParameter("@ProductId", "ProductIdValue"),
          new SqlParameter("@ProductName", "ProductNameValue"),
          new SqlParameter("@Price", "Price_Value"),
        });
    
        comm.ExecuteNonQuery();
    
        int imageCount = 5;
        for (int i = 0; i < imageCount; i++)
        {
          comm.CommandText = "insert into Detail values(@ProductId, @DetailImages)";
          comm.Parameters.AddRange(new SqlParameter[] { 
            new SqlParameter("@ProductId", "ProductIdValue"),
            new SqlParameter("@DetailImages", "DetailImagesValue")
          });
          comm.ExecuteNonQuery();
        }
        trans.Commit();
      }
      catch (Exception e1)
      {
        trans.Rollback();
      }
    }
    

    知识改变命运,奋斗成就人生!
    2010年12月5日 14:59
    版主

全部回复

  • 你好!

    这里可以不用存储过程。图片有多少个让用户在客户端手动添加,像邮箱中添加附件一样,默认附件只有一个点击添加用户可以一次上传多个附件。事务用.Net提供的事务(SqlTransation)。

    如果一个 detial 能对应多张图片,你还需要建产一 detial 的子表专门用于记录图片。


    知识改变命运,奋斗成就人生!
    2010年12月5日 8:34
    版主
  • 不用存储过程那怎么插入记录到数据库啊,这个是出于购物站的设计的,后台上传产品的时候有很多明细图,用主从表比较好,数据库中存储图片是存储其路径的,在客户端让用户上传很多图片到相应的目录并返回其路径,把返回的路径放在数组中,然后最终点“上传产品”按钮的时候把产品名称,价格等还有数组中的路径分别插入主从表中,如果用sql语句在C#代码中用字符串拼接可以实现

    如:string insertsql="insert into Product values(@ProductId,@ProductName,@Price)";

         string insertsqldetail="insert into Detail values(";  StringBuilder strSQL = new StringBuilder();

    然后循环数组 for(int i=0;i<array.length;i++){

       strSQL.Append(insertsqldetail).Append(" @ProductId").Append(",@DetailImages").Append(i).Append(");")

    }最终就会得到一个完整的sql语句,但是如果用存储过程我就不会写了,存储过程中根据循环定义@DetailImages0,@DetailImages1,@DetailImages2。。。@DetailImagesi 这样的效果我不会写,我的问题在这边。谢谢帮我解决,不胜感激。

     

    2010年12月5日 11:12
  • using (SqlConnection conn = new SqlConnection("your connections"))
    {
      conn.Open();
      SqlTransaction trans = conn.BeginTransaction();
      SqlCommand comm = new SqlCommand();
    
      comm.Connection = conn;
      comm.Transaction = trans;
    
      try
      {
        comm.CommandText = "insert into Product values(@ProductId,@ProductName,@Price)";
        comm.Parameters.AddRange(new SqlParameter[] { 
          new SqlParameter("@ProductId", "ProductIdValue"),
          new SqlParameter("@ProductName", "ProductNameValue"),
          new SqlParameter("@Price", "Price_Value"),
        });
    
        comm.ExecuteNonQuery();
    
        int imageCount = 5;
        for (int i = 0; i < imageCount; i++)
        {
          comm.CommandText = "insert into Detail values(@ProductId, @DetailImages)";
          comm.Parameters.AddRange(new SqlParameter[] { 
            new SqlParameter("@ProductId", "ProductIdValue"),
            new SqlParameter("@DetailImages", "DetailImagesValue")
          });
          comm.ExecuteNonQuery();
        }
        trans.Commit();
      }
      catch (Exception e1)
      {
        trans.Rollback();
      }
    }
    

    知识改变命运,奋斗成就人生!
    2010年12月5日 14:59
    版主