我有一个现有的 SQL Server 2000 数据库,它将 UTF-8 表示的文本存储在 TEXT 列中。我没有修改列类型的选项,并且必须能够将来自 C# 程序的非 ASCII Unicode 数据存储到该列中。
这是代码:
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 Server 2000 已经过时了。你需要升级。
有什么建议么?