SQL Server 2000 действительно плохо оборудован для обработки больших двоичных объектов XML. Он не имеет выделенного типа XML и не поддерживает большой текст в форме типа данных VARCHAR (MAX). Оба доступны в SQL Server 2005 и более поздних версиях.
Если вы абсолютно и определенно застряли на 2000, ваш лучший вариант - сохранить XML в столбце TEXT
(или NTEXT
- 2 байта на символ - если вам нужно поддерживать наборы символов не-ASCII-типа как азиатские языки, иврит, арабский и т. д.).
Имейте в виду, что: тип данных столбца TEXT не очень полезен в том смысле, что вы не можете действительно много сделать с ним без особых хлопот - вы даже не можете реально что-то искать или заменять. Это беспорядок. Ни один из обычных строковых методов не работает с ним - это действительно блоб типа «сохрани и забудь» .....
ОБНОВЛЕНИЕ: если вам никогда не потребуется проверять содержимое файла, пока он хранится в базе данных (правда?), Вы также можете использовать тип данных IMAGE
.
Чтобы сохранить файл в SQL Server, сделайте что-то вроде этого:
private void AddFileToDatabase(string filename)
{
using(SqlConnection con = new SqlConnection("server=***;database=***;integrated security=SSPI;"))
{
string insertStmt = "INSERT INTO dbo.YourTableName(DocFilename, DocContent) VALUES(@FileName, @Content)";
using(SqlCommand cmd = new SqlCommand(insertStmt, con))
{
cmd.Parameters.AddWithValue("@FileName", filename);
cmd.Parameters.Add("@Content", SqlDbType.Image);
cmd.Parameters["@Content"].Value = File.ReadAllBytes(filename);
con.Open();
int result = cmd.ExecuteNonQuery();
con.Close();
}
}
}
И в основном то же самое для чтения большого количества байтов из базы данных. Или вы можете упаковать это в хорошую хранимую процедуру - полностью на ваше усмотрение.
Если вы используете TEXT/NTEXT
, вам нужно сохранить фактическую строку, например, вы не могли бы использовать двоичный файл (например, Word) - но если у вас есть вывод из отчета в виде XML, HTML или чего-то еще, то TEXT / NTEXT тоже сработает (просто используйте cmd.Parameters.Add("@Content", SqlDbType.Text);
в этом случае).