Мне нужен столбец с несколькими значениями, он может быть реализован как поле xml
. Он может быть преобразован в запятую, если это необходимо
, запрашивающий список XML в sql-сервере, используя Xquery .
Будучи полем xml, некоторые проблемы могут быть устранены.
С CSV: не может гарантировать, что каждое значение является правильный тип данных: нет возможности предотвратить 1,2,3, банан, 5
С XML: значения в теге могут быть принудительно заданы для типа
С CSV: не удается использовать ограничения внешнего ключа для привязки значений к таблице поиска;
С XML: все еще проблема
С CSV: не может обеспечить уникальность: никакой возможности предотвратить 1,2,3,3 , 3,5
С XML: все еще проблема
С CSV: невозможно удалить значение из списка, не извлекая весь список.
С XML: отдельные элементы могут быть удалены
С CSV: трудно найти все объекты с заданным значением в списке; вам нужно использовать неэффективное сканирование таблицы.
С XML: поле xml можно индексировать
С CSV: трудно подсчитать элементы в списке или сделать другой агрегат запросы. **
С XML: не особо сложно
С CSV: трудно присоединить значения к справочной таблице, к которой они ссылаются. **
С XML: не особенно сложно
С CSV: трудно получить список в отсортированном порядке.
С XML: не особо сложно
С CSV: сохранение целых чисел в виде строк занимает в два раза больше места, чем сохранение двоичных целых чисел.
С XML: память еще хуже, чем csv
С CSV: Плюс много запятых.
С использованием XML: теги используются вместо запятых
Короче говоря, использование XML затрагивает некоторые проблемы с ограниченным списком И может быть при необходимости преобразуется в список с разделителями
Ниже приведен пример того, как нарисовать одну и ту же форму (a GraphicsPath
) в различных местах и поворотах.
Ключом здесь являются следующие две команды
e.Graphics.TranslateTransform(x, y);
e.Graphics.RotateTransform(-angle);
См. Результаты ниже:
и код, используемый для его генерации:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// This code defines a graphics shape using a GraphicsPath
// and draws multiple copies along a grid and with various
// rotation angle angles.
e.Graphics.SmoothingMode=SmoothingMode.AntiAlias;
var target = sender as PictureBox;
// Step 1 - Define a rectangle 20 by 12 pixels, center at origin.
var gp = new GraphicsPath();
gp.AddLines(new PointF[] {
new PointF(-10, -6),
new PointF( 10, -6),
new PointF( 10, 6),
new PointF(-10, 6) });
gp.CloseFigure();
// Step 2 - Define a 10×9 grid with two loops
float angle = 0;
for (int i = 0; i<9; i++)
{
// divide the control height into 10 divisions
float y = (i+1)*target.Height/10;
for (int j = 0; j<10; j++)
{
// divide the control width into 11 divisions
float x = (j+1)*target.Width/11;
// Save the default transformation state
var state = e.Graphics.Save();
// Traslate the origin to (x,y), each grid point
e.Graphics.TranslateTransform(x, y);
// Rotate shape by an angle (negative = CCW)
e.Graphics.RotateTransform(-angle);
// Draw the shape
e.Graphics.FillPath(Brushes.LightSeaGreen, gp);
e.Graphics.DrawPath(Pens.Black, gp);
// Restore the default transformation state
e.Graphics.Restore(state);
// Increment the angle by one degree.
// The idea is to show all 90 degrees of rotation in a 10×9 grid.
angle++;
}
}
}