Я предлагаю заключить обе вставки в один запрос с помощью CTE, модифицирующего данные , например:
WITH grp_ins AS (
INSERT INTO groups (name, creator)
VALUES ($1, $2)
RETURNING id, creator
)
INSERT INTO groupmembers (groupid, userid)
SELECT g.id, u.id
FROM grp_ins g
JOIN users u ON u.email = g.creator;
, поскольку groups.creator
определено [ 114] с ограничением FK, обеспечивающим ссылочную целостность, [INNER] JOIN
- это хорошо. Иначе я бы рассмотрел LEFT JOIN
.
Очень похоже на ответ, на который вы ссылались . Или эти:
Если по какой-то причине вы не можете применить приведенную выше команду (например, вложенную в функцию, которая должна использоваться для вставки в groups
), следующая лучшая вещь - это [1116 ] запускает AFTER INSERT
для выполнения второго INSERT
. Немного сложнее и дороже. Но выполняет свою работу:
CREATE OR REPLACE FUNCTION trg_ins_row_in_groupmembers()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO groupmembers (groupid, userid)
SELECT NEW.id, (SELECT u.id FROM users u WHERE u.email = NEW.creator);
RETURN NEW; -- doesn't matter much what you return here
END
$func$ LANGUAGE plpgsql;
И триггер AFTER INSERT
на groups
:
CREATE TRIGGER groups_ins_aft
AFTER INSERT ON groups
FOR EACH ROW EXECUTE PROCEDURE trg_ins_row_in_groupmembers();
Связанный:
Сначала я загрузил Открыть XML Format SDK 2.0.
Это идет с 3 полезными инструментами в:
C:\Program Files\Open XML Format SDK\V2.0\tools
DocumentReflector.exe
который автоматический генерируют c# для создания электронной таблицы из кода.OpenXmlClassesExplorer.exe
отобразите спецификацию Ecma и документацию класса (использующий формат стиля MSDN).OpenXmlDiff.exe
графически сравните два Открытых XML-файла и ищите ошибки.Я предлагаю любого, кто начинает переименовывать .xlsx к .zip, таким образом, Вы видите XML-файлы, кто управляет нашей электронной таблицей (для примера, наши листы находятся в "xl\worksheets").
Правовая оговорка: Я украл весь код из MSDN техническая статья; D
Следующий код использует шаблон *.xlsx, который я сделал вручную, чтобы смочь изменить его.
Ссылки пространств имен
using System.IO;
using System.Xml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;
// Database object
DataClassesDataContext db = new DataClassesDataContext();
// Make a copy of the template file.
File.Copy(@"C:\inetpub\wwwroot\project.Web\Clients\Handlers\oxml-tpl\livreurs.xlsx", @"C:\inetpub\wwwroot\project.Web\Clients\Handlers\oxml-tpl\generated.xlsx", true);
// Open the copied template workbook.
using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(@"C:\inetpub\wwwroot\project.Web\Clients\Handlers\oxml-tpl\generated.xlsx", true))
{
// Access the main Workbook part, which contains all references.
WorkbookPart workbookPart = myWorkbook.WorkbookPart;
// Get the first worksheet.
WorksheetPart worksheetPart = workbookPart.WorksheetParts.ElementAt(2);
// The SheetData object will contain all the data.
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
// Begining Row pointer
int index = 2;
// Database results
var query = from t in db.Clients select t;
// For each item in the database, add a Row to SheetData.
foreach (var item in query)
{
// Cell related variable
string Nom = item.Nom;
// New Row
Row row = new Row();
row.RowIndex = (UInt32)index;
// New Cell
Cell cell = new Cell();
cell.DataType = CellValues.InlineString;
// Column A1, 2, 3 ... and so on
cell.CellReference = "A"+index;
// Create Text object
Text t = new Text();
t.Text = Nom;
// Append Text to InlineString object
InlineString inlineString = new InlineString();
inlineString.AppendChild(t);
// Append InlineString to Cell
cell.AppendChild(inlineString);
// Append Cell to Row
row.AppendChild(cell);
// Append Row to SheetData
sheetData.AppendChild(row);
// increase row pointer
index++;
}
// save
worksheetPart.Worksheet.Save();
}
Я еще не закончил, моя вторая работа является к автоматической загрузке электронной таблицей после модификации.
Наконец, я перенаправляю пользователя к своей сгенерированной электронной таблице (от моего aspx)
context.Response.Redirect("Oxml-tpl/generated.xlsx");
просто Ответ набора. ContentType = "application/vnd.ms-excel" и Ваша страница будет представленный как лист Excel на клиентском браузере
Существует довольно много способов обработать это, в зависимости от того, насколько обширный функциональность Excel. Ответ Binoj работает, если Excel является просто электронной таблицей и не имеет никакой прямой встроенной функциональности Excel. Клиент может добавить функциональность, concats, и т.д. Это "немые" документы Excel, пока клиент не делает soemthing.
Создать более полнофункциональный документ Excel, Вы havve два основных варианта, о которых я могу думать бесцеремонно.
Используйте любого офисные компоненты (ре: плохо) для создания документа Excel или стороннего компонента, как ExcelWriter SoftArtisan. Большой компонент, но существует стоимость.
Используйте управление на странице, которая позволяет экспорт в Excel. У большинства поставщиков средств управления ASSP.NET есть эта функциональность на их сетках.
Опция № 1 позволяет Вам в значительной степени всю функциональность Excel. Опция № 2 немного более ограничена, по крайней мере, в средствах управления, которые я попробовал.
Хорошая статья от Эрики Эрли о том, как улучшить экспорт. http://blogs.msdn.com/erikaehrli/archive/2009/01/30/how-to-export-data-to-excel-from-an-asp-net-application-avoid-the-file -format-Different-prompt.aspx