У меня есть существующая база данных SQL Server 2000, в которой хранятся представления текста UTF-8 в столбце TEXT. У меня нет возможности изменять тип столбца и он должен иметь возможность хранить данные Unicode без ASCII из программы C# в этот столбец.Как хранить байты UTF-8 из строки C# в столбце TEXT SQL Server 2000
Вот код:
sqlcmd.CommandText =
"INSERT INTO Notes " +
"(UserID, LocationID, Note) " +
"VALUES (" +
Note.UserId.ToString() + ", " +
Note.LocationID.ToString() + ", " +
"@note); " +
"SELECT CAST(SCOPE_IDENTITY() AS BIGINT) ";
SqlParameter noteparam = new SqlParameter("@note", System.Data.SqlDbType.Text, int.MaxValue);
На данный момент я попробовал несколько различных способов, чтобы получить мои UTF-8 в данных параметра. Например:
// METHOD ONE
byte[] bytes = (byte[]) Encoding.UTF8.GetBytes(Note.Note);
char[] characters = bytes.Select(b => (char) b).ToArray();
noteparam.Value = new String(characters);
Я также попытался просто
// METHOD TWO
noteparam.Value = Note.Note;
И
// METHOD THREE
byte[] bytes = (byte[]) Encoding.UTF8.GetBytes(Note.Note);
noteparam.Value = bytes;
продолжается, вот остальная часть кода:
sqlcmd.Parameters.Add(noteparam);
sqlcmd.Prepare();
try
{
Note.RecordId = (Int64) sqlcmd.ExecuteScalar();
}
catch
{
return false;
}
Метод один (получить байты UTF8 в строку) делает что-то странное - Я думаю, что UTF-8 кодирует строку второй раз.
Метод два магазина мусора.
Метод три вызывает исключение в ExecuteScalar(), утверждая, что он не может преобразовать параметр в строку.
Вещи, которые я уже знаю, так что не нужно говорить мне:
- SQL Server 2000 является прошлое/приближающийся конец срока службы
- TEXT столбцы не предназначены для текста Unicode
- Серьезно, SQL Сервер 2000 старый. Вам нужно обновить.
Любые предложения?
Возможный дубликат [Напишите utf-8 на сервер sql Текстовое поле, использующее ADO.Net и поддерживающее байты UTF-8] (http://stackoverflow.com/questions/2883308/write-utf-8-to- a-sql-server-text-field-using-ado-net-and-maintain-the-utf-8-byte) –
Не дубликат. SQL Server 2000 не поддерживает VARCHAR (MAX), поэтому его решение не будет работать. – Craig