2013-03-27 33 views
0

我不知道如何描述我在找什么,但我可以用我画的图来说明它。多个输入从用户保存在一个数据库的列

这里的第一个是'用户输入',它将在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); 
} 
} 
+0

数据,你为什么会存放在此的非规范化格式,当输入和输出都正常化? – 2013-03-27 09:02:05

+0

哪个控件用于显示数据?网格视图,中继器,数据列表还是其他? – 2013-03-27 09:02:07

+0

@peterLang,因为我希望细节处于相同的ID下。 – 2013-03-27 09:05:17

回答

1

DataFromDataBase是在你从数据库中获取数据的DataTable。 最后,您将以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"); 

编辑这样,你必须得到的数据集或数据表(你的选择)

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

它完全按照您的要求。让我知道,如果你会遇到任何问题。 – 2013-03-27 10:15:03

+0

非常感谢。会尝试让你知道。 – 2013-03-27 10:16:25

+0

这段代码应该在保存按钮的右边?以及如何回合连接和SQL语句?我应该在哪里找到他们? – 2013-03-27 10:21:39

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。

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

它可能会帮助你。

+0

非常感谢你。但如何按照您的建议保存值?我应该让它像卡米尔Kransinski建议? – 2013-03-27 09:22:28

+0

这是一个可能的解决方案,但是如果您可能要创建复合主键或创建UniqueId列,以便您的记录具有足够的唯一性以更新/删除。这取决于您使用的数据访问方式(SqlCommands和读取器,数据集或Enity Framework) – 2013-03-27 09:27:11

+0

同时保存多行的最佳方式是使用XML或批量插入。你能提供一些你现在使用的代码示例来保存值吗? – 2013-03-27 09:27:35

0

您试图在代码中实现的是可能的,但是在读取和写入存储时需要自定义串联和分割。

不过,我会建议您标准化您的数据,创建2个表:

IdHeader

HeaderId CreatedOn 用户名 等

IdDetail

HeaderId 012项数量 单价 总 等

+0

是的,这是可能的,但使用这种类型的代码是不现实的。 – 2013-03-27 09:16:10

+0

@Kamil Kransinski,你的意思是把IDHeader的外键改为IDDetails表? – 2013-03-27 09:18:54

+0

@ A.K.C.F.L究竟 – 2013-03-27 09:23:55

0

如果你希望他们相同的ID为什么不添加其他列下,说的OrderId?

+0

它应该作为评论。 – 2013-03-27 10:12:32

+0

很酷,但我无法发表评论。只对我自己的回复。 – 2013-03-27 10:35:33

+0

@Yuri Kashtanow,添加后,你建议,使其作为另一个表或组合键的外键? – 2013-03-28 02:26:27

相关问题