来自用户的多个输入以在一列中保存在数据库中

时间:2013-03-27 08:59:27

标签: c# asp.net sql-server gridview

我不知道如何描述我正在寻找的东西,但我可以用我绘制的图表来说明它。

下面的第一个是'用户输入',它将在gridview中,它将要求用户输入详细信息。 (文本框)是一个文本框,旁边的详细信息是输入示例。

User Inputs:

Items                 Quantity             Unit Price              Total
(textBox)abc         (textBox)2          (textBox) 100          (textBox) 200
(textBox)def         (textBox)1          (textBox) 150          (textBox) 150

单击保存按钮后(我没有显示按钮,抱歉),详细信息将保存在数据库中,如下面的“保存在数据库中”所示。

Save in Database:

 ID            Items           Quantity      UnitPrice       Total
10001        Abc , def           2,1          100,150       200,150

当用户想要显示详细信息时,详细信息应显示在下面的“显示结果”中。

Display Results:
ID:10001   
Items     Quantity     Unit Price     Total
Abc          2            100          200
def          1            150          150

我希望这个解释是可以理解的,我在解释和ASP方面都很差。 请帮我用C#或VB编写代码,因为我不能选择这样做。 非常感谢。

代码示例:

string sql = "INSERT INTO Products(Name, ProductImage, OriginalPrice, DiscountPrice, Descriptions,StockQuantity, Category) VALUES (@Name, @ProdImage, @OriPrice, @DisPrice, @Descrp, @Quantity, @Category)";

    try
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sql, conn);
        SqlParameter[] param = new SqlParameter[7];

        param[0] = new SqlParameter("@Name", SqlDbType.VarChar,100);
        param[1] = new SqlParameter("@ProdImage", SqlDbType.VarChar, 100);
        param[2] = new SqlParameter("@OriPrice", SqlDbType.Float );
        param[3] = new SqlParameter("@DisPrice", SqlDbType.Float );
        param[4] = new SqlParameter("@Descrp", SqlDbType.VarChar,50);
        param[5] = new SqlParameter("@Quantity", SqlDbType.Int);
        param[6] = new SqlParameter("@Category", SqlDbType.VarChar,50);

        param[0].Value = name;
        param[1].Value = image;
        param[2].Value = OriPrice;
        param[3].Value = disPrice;
        param[4].Value = description;
        param[5].Value = quantity;
        param[6].Value = Category;


        for (int i = 0; i < param.Length; i++)
        {
            cmd.Parameters.Add(param[i]);
        }

        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();

当前代码:

private string CreateRow(DataTable data, Int32 index, String ColumnName)
{
String[] quan =   data.Rows[0][ColumnName].ToString().Split(',');
if (quan.Length >= index)

return quan[index].ToString();
else
return "";
}
protected void GridView2_SelectedIndexChanged(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("");
string sql = "SELECT * FROM SalesOrder WHERE ID = 10010";
DataSet DataFromDataBase = new DataSet();
SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM SalesOrder WHERE ID = 10010", conn);
adp.Fill(DataFromDataBase);

DataTable TempData = new DataTable();
TempData.Columns.Add("Quantity", typeof(string));
TempData.Columns.Add("UnitPrice", typeof(string));

for (Int32 i = 0; i < 5; i++)
{
    DataRow row = TempData.NewRow();
    row[0] = CreateRow(DataFromDataBase, i, "Quantity");
    row[1] = CreateRow(DataFromDataBase , i, "UnitPrice");
    TempData.Rows.Add(row);
}
}

4 个答案:

答案 0 :(得分:1)

保存值的方式实际上是不现实和非规范化的。

您应该保存以下值:

 ID            Items           Quantity      UnitPrice       Total
10001           Abc                  2          100           200
10001            def                 1          150            150

您可以在sql中使用以下查询:

select * from table where ID = 10001

它将返回数据表或数据集中的两行(无论您使用什么)。您可以轻松地将它与GridView,Repeater和Datalist等任何控件绑定。

通过这种方式,您可以轻松减少代码,以所需格式显示数据。

它可以帮助你。

答案 1 :(得分:1)

DataFromDataBase 是一个数据表,您可以从中获取数据库中的数据。 最后,您将在 TempData Datatable。

中获得所需格式的数据

您必须将Grisview与 TempData Datatable绑定。

我只使用两列完成了这项工作,您可以根据列进行更改。我在一个字段中取最大值为5作为最大值。你可以根据你的要求进行修改。

   DataTable TempData = new DataTable();
    TempData.Columns.Add("Quantity", typeof(string));
    TempData.Columns.Add("UnitPrice", typeof(string));

    for (Int32 i = 0; i < 5; i++)
    {
        DataRow row = TempData.NewRow();
        row[0] = CreateRow(DataFromDataBase, i, "Quantity");
        row[1] = CreateRow(DataFromDataBase, i, "UnitPrice");
        TempData.Rows.Add(row);

    }

private string CreateRow(DataTable data, Int32 index, String ColumnName)
{
   String[] quan =   data.Rows[0][ColumnName].ToString().Split(',');
   if (quan.Length >= index)

       return quan[index].ToString();
   else
       return "";
}

如果要从数据库中获取 DataSet 中的数据。您可以将参数传递给 CreateRow 功能,如下所示

     CreateRow(  DataFromDataBase.Tables[0], i, "UnitPrice");

EDIT 这样你必须获取数据集或数据表(你的选择)中的数据

DataSet DataFromDataBase = new DataSet();
    SqlDataAdapter adp = new SqlDataAdapter("select * from tbdep;select * from tbemployee", ConfigurationManager.ConnectionStrings["cn"].ConnectionString);
    adp.Fill(DataFromDataBase);

答案 2 :(得分:0)

您尝试在代码中实现的目标是可能的,但在读取和写入存储时需要自定义连接和拆分。

但是,我建议您规范化数据并创建2个表:

<强> IdHeader

HeaderId 创建于 用户名 等

<强> IdDetail

HeaderId 项目 数量 单价 总 等

答案 3 :(得分:0)

如果您希望它们使用相同的ID,为什么不添加另一列,比如说OrderId?