【问题标题】:multiple input from users to save in database in one column来自用户的多个输入以保存在一列中的数据库中
【发布时间】:2013-03-27 08:59:26
【问题描述】:

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

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

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);
}
}

【问题讨论】:

  • 当输入和输出都被规范化时,为什么要以这种非规范化格式存储它?
  • 您使用哪个控件来显示数据?网格视图、中继器、数据列表或任何其他?
  • @peterLang,因为我希望详细信息在同一个 ID 下。
  • @Code Rider,用于用户输入的网格视图和列表视图(如果可能)或仅用于显示结果的网格视图。
  • 为什么不把你的主键分成两列(10001, 110001, 2)?这可以为您节省很多问题...

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


【解决方案1】:

DataFromDataBase 是一个数据表,您可以在其中从数据库中获取数据。 最后,您将在 TempData 数据表中获得所需格式的数据。

您必须将 Grisview 与 TempData 数据表绑定。

我只用两列完成了这项工作,您可以根据您的列进行更改。我已将最大 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);

【讨论】:

  • 完全符合您的要求。如果您遇到任何问题,请告诉我。
  • 这段代码应该在保存按钮下面吧?以及连接和sql语句如何?我应该在哪里找到它们?
  • 不应该把这段代码放在你想绑定网格视图的地方。您从 aspx 页面上的数据库获取数据的位置。
  • ,DataFromDatabase 应该是我的数据库的名称,或者我应该将它初始化为数据库列?
  • 希望你会写一个查询“select * from table where blah blah”。您必须在“DataFromDatabase”数据表或数据集中获取此查询的结果。
【解决方案2】:

您保存值的方式确实不切实际且非规范化。

您应该保存以下值:

 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 等任何控件绑定。

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

希望对你有帮助。

【讨论】:

  • 非常感谢。但是如何以您建议的方式保存值?我应该像卡米尔·克兰辛斯基建议的那样做吗?
  • 这是一个可能的解决方案,但如果您可能想要创建复合主键或创建 UniqueId 列,以便您的记录足够独特,可以更新/删除。这取决于您使用的数据访问方式(SqlCommands 和读取器、数据集或实体框架)
  • 同时保存多行的最佳方法是使用 XML 或批量插入。你能提供一些你现在用来保存值的代码示例吗?
  • @Kamil Krasinski,您推荐哪种数据访问方式?我熟悉 SqlCommands 和读者。
  • codeandscript.blogspot.in/2012/06/… 检查这种方式可以在 sqlserver 中一次保存多行。它应该可以解决您的问题。
【解决方案3】:

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

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

IdHeader

标头标识符 创建于 用户名 等等

IdDetail

标头标识符 物品 数量 单价 全部的 等等

【讨论】:

  • 是的,这是可能的,但使用这种代码是不现实的。
  • @Kamil Kransinski,你的意思是把 IDHeader 的外键变成 IDDetails 表?
【解决方案4】:

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

【讨论】:

  • @Yuri Kashtanow,添加后,您建议将其设为另一个表中的外键还是复合键?
  • 好吧,最好的方法是为 Orders 创建另一个表,然后将此 orderId 设为外键,如其他答案中所述...这将使将来易于管理,所以我会建议。否则,如果懒惰 - 让它成为一个组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
相关资源
最近更新 更多