2013-03-27 1 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

Почему вы храните его в этом Денормализованные формат, когда и вход, и выход нормализованы? –

+0

которые вы используете для отображения данных? Grid View, ретранслятор, список данных или любой другой? –

+0

@peterLang, потому что я хочу, чтобы данные были под тем же идентификатором. –

ответ

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, как это вы должны получить данные в наборе данных или DataTable (на ваш выбор)

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

Это точно соответствует вашему требованию. Дайте мне знать, если вы столкнетесь с какой-либо проблемой. –

+0

большое спасибо. попробуем и дадим вам знать. –

+0

Этот код должен быть под кнопкой сохранения справа? и как связаны с операциями соединения и sql? где я должен их найти? –

1

путь вы спасаете значения действительно нереально и денормализованной.

вы должны сохранить значения, как:

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

и вы можете использовать следующий запрос в SQL:

select * from table where ID = 10001 

Это вернет вам две строки в DataTable или набора данных (все, что вы используете). вы можете легко связать его с любым элементом управления, таким как GridView, Repeater и Datalist.

Таким образом, вы можете легко уменьшить код для отображения данных в требуемом формате.

Возможно, это поможет вам.

+0

большое вам спасибо. но как сохранить ценности так, как вы предлагаете? Должен ли я сделать это, как предложил Камиль Крансински? –

+0

это возможное решение, но если вы захотите создать составной первичный ключ или создать столбец UniqueId, чтобы ваши записи были достаточно уникальными для обновления/удаления.это будет зависеть от того, какой доступ к данным вы используете (SqlCommands и reader, Datasets или Enity Framework) –

+0

лучший способ сохранить несколько строк в то же время - это использовать XML или объемную вставку. можете ли вы предоставить пример кода, который вы используете сейчас, чтобы сохранить значения? –

0

То, что вы пытаетесь достичь, возможно в коде, но для чтения и записи в хранилище требуется специальная конкатенация и разделение.

Однако, я хотел бы предложить вам нормализовать свои данные и создать 2 таблицы:

IDHEADER

HeaderId CreatedOn UserName и т.д.

IdDetail

HeaderId Пункт Количество UnitPrice Всего и т.д.

+0

да, это возможно, но его нереалистично использовать такой код. –

+0

@ Kamil Kransinski, вы хотите сделать внешний ключ IDHeader в таблице IDDetails? –

+0

@ A.K.C.F.L точно –

0

Если вы хотите, чтобы они под тем же ID, почему бы не добавить еще один столбец, скажем OrderId?

+0

он должен идти как комментарий. –

+0

классный, но я не могу оставлять комментарии. только к моим собственным ответам. –

+0

@Yuri Kashtanow, после добавления, которые вы предлагаете, сделать его внешним ключом из другой таблицы или сложного ключа? –

Смежные вопросы