У меня есть база данных Firebird, которая хранит значения Uuid в поле char (16).В моей программе на C # мне нужно получить эти значения, чтобы использовать их в последующих запросах.Но значения, которые я получаю из базы данных, являются «мусором».(например, ¿ñ)êNµmÏc—ÝX
) Я пробовал различные методы чтения данных в виде байтового массива и использования их для создания локального Guid
, но это никуда меня не привело.Самым близким, что я получил, было использование Encoding.ASCII.GetBytes()
, которое дало мне «действительный» guid, однако он не соответствует «реальным» guid в базе данных.Я знаю, что они не совпадают, потому что (1) база данных имеет UDF, который преобразует «мусор» в удобочитаемую строку, и (2) когда я вручную копирую этот удобочитаемый guid в свое приложение, используя его для создания нового локальногоGuid
и, используя значение THAT в своих запросах, я получаю правильные результаты.(В то время как направляющие, созданные из байтовых массивов, не дают правильных результатов.) Я также попытался IDataRecord.GetBytes()
, но это привело к InvalidCastException ("Невозможно привести объект типа 'System.String' к типу 'System.Byte []'.")
Это приложение использует базы данных, созданные другим, не связанным продуктом, и я не могу контролировать его структуру, а также не могу использовать такие вещи, как хранимые процедуры.Я также не могу использовать UDF, которые я упоминал ранее, потому что они скоро прощаются.Доступные UDF, очевидно, являются простыми обертками вокруг UuidToString и UuidFromString .Я полагаю, что я мог бы использовать эти функции в своем собственном коде, но я бы предпочел, если бы не было другого способа, не связанного с взаимодействием.
В конечном счете, мне нужен гид для работыв методе, который выглядит примерно так:
protected DataTable QueryDataTable(string query, string paramName, Guid guid)
{
DataTable table = new DataTable();
IDbCommand command = CreateDbCommand(query);
if (command is FbCommand)
{
FbCommand fbCommand = (FbCommand)command;
fbCommand.Parameters.Add(paramName, FbDbType.Binary).Value =
guid.ToByteArray();
// Also tried passing in the byte[] generated by
// Encoding.Ascii.GetBytes.... didn't work.
//fbCommand.Parameters.Add(paramName, FbDbType.Binary).Value = guid;
FbDataAdapter adapter = new FbDataAdapter(fbCommand);
adapter.Fill(table);
}
return table;
}
Вопросы:
(1) Почему я не использую байтовый массив для создания guid, что приводит к «правильному»guid?
(2) Какую другую тактику я мог бы использовать, чтобы извлечь эти направляющие и сохранить их локально как таковые?
Спасибо!
Редактировать:
Вот пример того, что я имею перед собой.Из базы данных:
![enter image description here](https://i.stack.imgur.com/jZwkj.png)
Результирующий массив символов из строки мусора:
![enter image description here](https://i.stack.imgur.com/1zOd7.png)
Использование тактики, предложенной @Alexei Levenkovрезультирующий указатель (1) очень близок, но не совсем корректен (2).
(1): fca3120b-511e-4269-b88f-d053a34b3513
(2): fca3120b-5184-4269-b88f-d053a34b3596
НЕКОТОРЫЕ строки мусораполучается правильно, но это пример того, который не делает.Вот как я реализую предложение Алексея, так как я не видел метод Select для строк:
// table is a DataTable
List<byte> bytes = new List<byte>();
string blah = (string)table.Rows[0][0];
foreach (char c in blah.ToCharArray())
{
bytes.Add((byte)c);
}
Guid guid = new Guid(bytes.ToArray());