2015-12-31 2 views
0

У меня есть две таблицы данных в sql. Мне нужно вставить данные в одну таблицу в другую. Моя первая таблица данных Table1 содержит столбец данных. Код, модель, число, количество и вторая таблица. Таблица 2 также содержит то же самое. Но мне нужно вставлять данные из таблицы1 в таблицу2 несколько раз. Если значение Qty в таблице 1 равно 4, введите данныеНеобходимо вставить строку данных несколько раз в базу данных

Таблица 1 в 4 раза в соответствии с количеством.

<code>enter image description here</code>

protected void Button15_Click3(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
      String str1 = "insert into Table2(Code, Model, Num, Qty) select Code, Model, Num, Qty from Table1;"; 

      SqlCommand xp1 = new SqlCommand(str1, con); 
      con.Open(); 

      SqlDataAdapter da1 = new SqlDataAdapter(); 
      da1.SelectCommand = xp1; 

      DataSet ds1 = new DataSet(); 
      da1.Fill(ds1, "Code"); 

      GridView1.DataSource = ds1; 
      con.Close(); 
     } 
    } 
} 

В этой программе я даю номер 4 вручную, но мне нужно взять его из моей базы данных qty. Как я могу поместить имя столбца SQL в цикле для вставки данных в несколько раз?

+1

Это, вероятно, не такая хорошая идея. Строки в таблице базы данных должны содержать уникальные значения. –

+0

просто выберите qty, выполнив запрос select перед циклом вставки, а затем получите quatity.! Я надеюсь, что это понятно.! –

+0

@ Kunal Kakkad мог бы объяснить вам –

ответ

1

Вы можете дать попробовать так:

private void button1_Click(object sender, EventArgs e) 
{ 
    string connetionString = null; 
    SqlConnection connection ; 
    SqlDataAdapter adapter = new SqlDataAdapter(); 
    DataSet ds = new DataSet(); 
    int i = 0; 
    int j = 0; 
    connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"; 
    connection = new SqlConnection(connetionString); 
    try 
    { 
     connection.Open(); 
     adapter.SelectCommand = new SqlCommand("Your SQL Statement Here", connection); 
     adapter.Fill(ds); 
     connection.Close(); 
     for(j=0;j<=ds.Tables[0].Rows.Count;j++){ 
      for (i = 0; i <= Convert.ToInt32(ds.Tables[0].Rows[j]["Qty"].ToString()); i++) 
      { 
       String str1 = "insert into Table2(Code, Model, Num, Qty) 
          select Code, Model, Num, Qty from Table1;"; 
       SqlCommand xp1 = new SqlCommand(str1, con); 
       con.Open(); 

       SqlDataAdapter da1 = new SqlDataAdapter(); 
       da1.SelectCommand = xp1; 

       DataSet ds1 = new DataSet(); 
       da1.Fill(ds1, "Code"); 

       GridView1.DataSource = ds1; 
       con.Close(); 

      } 
     } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

Я надеюсь, что теперь ясно, , !

+0

извините за задержку. Сир, я выполнил и изменил код несколько раз. Это показывает эту ошибку. Поэтому я меняю строку на // для (i = 1; i <= ds.Tables ["Table2"]. Rows.Count - 1; i ++), то тоже самое, ошибка я пробовал несколько изменений, но ту же ошибку. System.IndexOutOfRangeException: не удается найти таблицу 0. в System.Data.DataTableCollection.get_Item (индекс Int32) в Default3.Button15_Click3 (отправитель объекта, EventArgs e) в c: \ Users \ User \ Documents \ Visual Studio 2008 \ WebSites \ WebSite21 \ Default3.aspx.cs: строка 868 –

0

Как указано в комментариях, дублирование строк не является хорошей идеей без первичного ключа как в исходной, так и в целевой таблицах, так как иначе идентификация строк станет проблематичной.

Вы не указали, хотите ли вы скопировать только одну строку, несколько строк или всю таблицу N раз, но при условии, что последние, массовые задания ввода-вывода, подобные этому, лучше всего подходят для выполнения всей операции в базе данных сервер, чтобы уменьшить перенос данных ввода-вывода между вашим приложением и базой данных.

Предполагая, что обе таблицы находятся в одной базе данных, вы можете сделать это с помощью рекурсивного CTE с дублированием строк. Если вам необходимо контролировать @CopyCount из C#, просто привязать его как целое и выполнить его с SqlCommand.ExecuteNonQuery:

DECLARE @CopyCount INT = 10; 
with cteRowGen AS 
(
    SELECT 1 AS RowNum 

    UNION ALL 

    SELECT RowNum + 1 
    FROM cteRowGen 
    WHERE RowNum < @CopyCount 
) 
insert into Table2(Code,Model,Num,Qty) 
    select Code,Model,Num,Qty 
     from table1 CROSS JOIN cteRowGen; 
0

Как указано в StuartLC, CTE - это путь.

Вот версия, которая будет читать QTY от вашего table1 Он также вставит 1 для Кол-во в Table2, а не 4

DECLARE @Cnt INT = (SELECT Qty FROM Table1); 

WITH data AS (
    SELECT 1 AS RowCnt 
    UNION ALL 
    SELECT RowCnt + 1 
    FROM data 
    WHERE RowCnt < @Cnt 
) 

INSERT INTO Table2 
SELECT Code, Model, Num, 1 as Qty 
FROM Table1 a 
    CROSS JOIN data 
+0

Но как я могу добавить прямо в мой код asp.net –

+0

Вы делаете хранимую процедуру вышеуказанного кода и вызываете хранимую процедуру из своего кода. Должно быть множество информации в сети о том, как это сделать – Spock