Вопрос по c#, asp.net, sql-server – Вставка списка <> в таблицу SQL Server

6

У меня есть сущностьReport значения которого я хочу вставить в таблицу базы данных. Следующие атрибутыReport необходимо вставить:

reportID - int
RoleID - int
Created_BY = SYSTEM(default)
CURRENT_TIMESTAMP

Теперь проблема со вторым атрибутом. У меня есть отчет сLIST<ROLES> атрибуты.ROLES является четко определенной сущностью, которая имеетID иNAME. Из этого списка я должен извлечь каждую роль и вставить идентификатор каждой роли в таблиц

Так что мой запрос выглядит следующим образом:

INSERT INTO REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED)
VALUES({0}, {1}, 'SYSTEM', CURRENT_TIMESTAMP)

Код C #, откуда я анализирую эти значения, выглядит следующим образом:

try
{
    StringBuilder _objSQL = new StringBuilder();
    _objSQL.AppendFormat(Queries.Report.ReportQueries.ADD_NEW_ROLES, report.ID, "report.MarjorieRoles.Add(MarjorieRole")); 
    _objDBWriteConnection.ExecuteQuery(_objSQL.ToString());
    _objDBWriteConnection.Commit();
    _IsRolesAdded = true;
}

Так что, пожалуйста, объясните мне, как добавить роли из функции C #

ты считал ОРМ? С Linq to SQL или Entity Framework вы можете приступить к работе через полчаса. Также есть nHibernate. Andras Zoltan

Ваш Ответ

2   ответа
11

Полагаю, ты говоришь SQL (язык структурированных запросов) и вы действительно имеете в виду MicrosoftSQL Server (фактический продукт базы данных) вместо этого - верно?

Вы не можете вставить весь список целиком в SQL Server - вам нужно вставить одну строку для каждой записи. Это означает, что вам нужно вызывать оператор INSERT несколько раз.

Делай это так

// define the INSERT statement using **PARAMETERS**
string insertStmt = "INSERT INTO dbo.REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED) " + 
                    "VALUES(@ReportID, @RoleID, 'SYSTEM', CURRENT_TIMESTAMP)";

// set up connection and command objects in ADO.NET
using(SqlConnection conn = new SqlConnection(-your-connection-string-here))
using(SqlCommand cmd = new SqlCommand(insertStmt, conn)
{
    // define parameters - ReportID is the same for each execution, so set value here
    cmd.Parameters.Add("@ReportID", SqlDbType.Int).Value = YourReportID;
    cmd.Parameters.Add("@RoleID", SqlDbType.Int);

    conn.Open();

    // iterate over all RoleID's and execute the INSERT statement for each of them
    foreach(int roleID in ListOfRoleIDs)
    {
      cmd.Parameters["@RoleID"].Value = roleID;
      cmd.ExecuteNonQuery();
    }

    conn.Close();
}      
Да, да, вы правы ... MS SQL Server, спасибо за помощь и исправление меня там DoNNie_DarkO
Как насчет передачи списка в формате XML? Это решило бы вашу проблем mko
@ Джон: да - вы можете отправить его в виде XML - но тогда вам придется снова «измельчать» его внутри SQL Server, а это также требует определенных усилий и кода .... marc_s
Вы можете использовать транзакцию, поэтому, если что-то пойдет не так, она будет отменена WiiMaxx
0

скажиlstroles это твойLIST<ROLES>.

lstroles.ForEach(Role => 
   {            
       /* Your Insert Query like 
        INSERT INTO REPORT_MARJORIE_ROLE(REPORT_ID, ROLE_ID, CREATED_BY, CREATED)
        VALUES(REPORT_ID, Role.ID, {0}, {1}, 'SYSTEM', CURRENT_TIMESTAMP);

       Commit you query*\
   });

На личную заметку: Остерегайтесь SQL-инъекций.

Вам следуетН объедините ваши операторы SQL! Это открывает дверь в сарай Атака с использованием инъекций, и это также медленнее с точки зрения производительности (без повторного использования плана выполнения SQL Server!) marc_s

Похожие вопросы