Вот моя измененная версия кода счета:
CREATE TRIGGER mytrigger ON sometable
INSTEAD OF INSERT
AS BEGIN
INSERT INTO sometable SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 1 FROM inserted;
INSERT INTO sometableRejects SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 0 FROM inserted;
END
Это позволяет вставке всегда успешно выполниться, и любые поддельные записи брошены в Ваш sometableRejects, где можно обработать их позже. Важно заставить Вашу таблицу отклонений использовать nvarchar поля для всего - не ints, tinyints, и т.д. - потому что, если они становятся отклоненными, это - потому что данные не то, чем Вы ожидали, что он будет.
Это также решает несколько - рекордная проблема вставки, которая заставит триггер счета перестать работать. При вставке десяти записей одновременно (как то, если бы Вы делаете select-insert-into), и только один из них является поддельным, триггер счета отметил бы всех их как плохо. Это обрабатывает любое количество хороших и плохих записей.
я использовал этот прием на проекте организации хранилищ данных, где приложение вставки понятия не имело, хорошо работала ли бизнес-логика, и мы сделали бизнес-логику в триггерах вместо этого. Действительно противный для производительности, но если Вы не можете позволить сбою вставки, он действительно работает.
Попробуйте следующее:
using System.Text;
using System.Xml;
XmlDocument dom = GetDocument()
byte[] bytes = Encoding.Default.GetBytes(dom.OuterXml);
Если вы хотите сохранить кодировку текста документа, измените кодировку По умолчанию
на желаемую или выполните Предложение Джона Скита .
Запишите его в MemoryStream
, а затем вызовите ToArray
в потоке:
using System;
using System.IO;
using System.Text;
using System.Xml;
class Test
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
XmlElement element = doc.CreateElement("child");
root.AppendChild(element);
doc.AppendChild(root);
MemoryStream ms = new MemoryStream();
doc.Save(ms);
byte[] bytes = ms.ToArray();
Console.WriteLine(Encoding.UTF8.GetString(bytes));
}
}
Для большего контроля над форматированием вы можете создать XmlWriter
из потока и используйте XmlDocument.WriteTo (писатель)
.