вставка данных в несколько таблиц с помощью веб-формы - PullRequest
6 голосов
/ 02 сентября 2011

Я хотел бы знать, что является стандартным / лучшим способом сделать следующее:

У меня есть веб-приложение формы в asp.net и с помощью C #

пользователь будет вводить данныев форму и нажмите INSERT, и она вставит данные в 4 разные таблицы.

поля:

primarykey, animal, street, country

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

[1],[rhino,cat,dog],[luigi st, paul st], [russia,israel]

мне нужно, чтобы они были вставлены в такие таблицы:

table1:
1,rhino
1,cat
1,dog

table2:
1,luigi st
1, paul st

table3:
1,russia
1,israel

вопросов

  1. Я в полной растерянности, как это сделать.если бы у меня была только одна таблица и один набор данных на первичный ключ, я бы просто использовал InsertQuery и делал это так, но так как это несколько таблиц, я не знаю, как это сделать ??

  2. Какие элементы управления я должен использовать, чтобы позволить пользователю вводить несколько значений?в настоящее время я просто использую текстовые поля и думаю разделить записи точкой с запятой, но это, вероятно, не правильный путь.

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Я хотел бы порекомендовать вам воспользоваться новым многострочным оператором вставки в SQL 2008, чтобы можно было просто передать оператор SQL следующим образом:

INSERT INTO table1(id,animal_name) values (1,cat),(1,dog),(1,horse)... 

К вашей SqlCommand, но я не знаю, как создать такое утверждение, не рискуя стать жертвой атаки SQL-инъекцией.

Другой альтернативой является определение типов таблиц данных в вашей базе данных sql: enter image description here

enter image description here

И затем создайте DataTable в C #, который соответствует вашему определению типа данных:

DataTable t = new DataTable();
t.Columns.Add("id");
t.Columns.Add("animal_name");
foreach(var element in your animals_list)
{
   DaraRow r = t.NewRow();
   r.ItemArray = new object[] { element.id, element.animal_name };
   t.Rows.Add(r);
}

// Assumes connection is an open SqlConnection.
using (connection)
{
    // Define the INSERT-SELECT statement.
    string sqlInsert = "INSERT INTO dbo.table1 (id, animal_name) SELECT nc.id, nc.animal_name FROM @animals AS nc;"

    // Configure the command and parameter.
    SqlCommand insertCommand = new SqlCommand(sqlInsert, connection);
    SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@animals", t);
    tvpParam.SqlDbType = SqlDbType.Structured;
    tvpParam.TypeName = "dbo.AnimalTable";

    // Execute the command.
    insertCommand.ExecuteNonQuery();
}

Подробнее здесь .

Или, если вы знакомы с хранимыми процедурами, то же, что и в предыдущем предложении, но с хранимой процедурой получите DataTable t в качестве параметра.

Если ничего из вышеперечисленного не работает для вас, создайте SqlTranscation из объекта Connection и выполните итерацию по каждой строке каждого набора данных, вставляя запись в соответствующую таблицу и, наконец, фиксируйте транзакцию. Пример здесь.

2 голосов
/ 03 сентября 2011

Используйте флажки на передней панели.Иметь сервис / репозиторий для сохранения пользовательских данных.Примерно так:

public void UpdateUserAnimals(Guid userId, string[] animals)
{
    using (SqlConnection conn = new SqlConnection("connectionstring..."))
    {
        using (SqlCommand cmd = new SqlCommand("Insert Into UserAnimals(UserId, Animals) values (@UserId, @Animal)"))
        {
            conn.Open();
            cmd.Parameters.AddWithValue("@UserId", userId);
            foreach(string animal in animals)
            {
                cmd.Parameters.AddWithValue("@Animal", animal);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

Существуют более сложные решения, но это простое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...