Как извлечь данные Blob (VarBinary) в виде строки из SQL Server 2012 с помощью хранимой процедуры? - PullRequest
0 голосов
/ 02 ноября 2019

Я пытался получить данные BLOB-объектов из базы данных с помощью хранимой процедуры. Я могу получить данные, но проблема в том, что данные относятся к приложению ASP.NET MVC, где оно преобразуется с использованием ConvertToList:

public static List<T> ConvertToList<T>(this DataTable dt)
{
    var columnNames = dt.Columns.Cast<DataColumn>().Select(c => c.ColumnName).ToList();
    var properties = typeof(T).GetProperties();

    return dt.AsEnumerable().Select(row =>
        {
            var objT = Activator.CreateInstance<T>();

            foreach (var pro in properties)
            {
                if (columnNames.Contains(pro.Name))
                {
                    if (pro.PropertyType == Type.GetType("System.Int32"))
                        pro.SetValue(objT, row[pro.Name].ToString().ToInt32(), null);
                    else if (pro.PropertyType == Type.GetType("System.Double"))
                        pro.SetValue(objT, row[pro.Name].ToString().ToDouble(), null);
                    else if (pro.PropertyType == Type.GetType("System.String"))
                        pro.SetValue(objT, row[pro.Name].ToString(), null);
                    else if (pro.PropertyType == Type.GetType("System.Int64"))
                        pro.SetValue(objT, row[pro.Name].ToString().ToInt32(), null);
                    else if (pro.PropertyType == Type.GetType("System.Boolean"))
                        pro.SetValue(objT, Convert.ToBoolean(row[pro.Name].ToString()), null);
                    //else if (pro.PropertyType == Type.GetType("System.Byte[]"))
                    //    pro.SetValue(objT, Convert.ToByte(row[pro.Name]), null); 
                }
            }
            return objT;
        }).ToList();
}

Когда извлекаются данные System.Byte[], они всегда устанавливаются в нуль;Я пытался преобразовать его, используя обычное преобразование байтов в строку, например

string result = System.Text.Encoding.UTF8.GetString(byteArray);

и

string s3 = Convert.ToBase64String(bytes); 

Это невозможно сделать, поскольку мой тип return является var, поэтому япопытался выполнить преобразование с помощью хранимой процедуры, когда она выбирает вот так

CONVERT(VARCHAR(MAX), LME.CoverPageImage, 2)

, но она все равно возвращает нулевое значение после вызова ConvertToList!

Есть ли способ получить ее в виде строки из базы данных с помощью хранимой процедуры или преобразовать ее с помощью C # ASP.NET MVC?

1 Ответ

1 голос
/ 02 ноября 2019

Это не может быть сделано, поскольку мой тип возвращаемого значения - var

Нет. var не относится к типу.

Запустите

var data = row[pro.Name];
var typeName = data.GetType().Name;

, чтобы увидеть тип времени выполнения столбца DataTable. Я думаю, вы обнаружите, что это уже byte[], если не можете его преобразовать.

И

 Convert.ToByte(row[pro.Name])

определенно не то, что вы хотите. Он преобразует значение в один byte, а не byte[].

...