2015-06-13 4 views
1

Я использую Entity Framework 4 в C# (да, я знаю, что я должен обновить, но это, помимо точки).Выбор многострочных строк через Entity Framework

У меня есть 70000 частные RSA ключи хранятся в базе данных формата, как это: Note - это демонстрационный ключ

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIDEMODEMODEMODEMODEMOEbGslt0N21onxRjBUwXFKI7CN6clxPAS+nEUK 
BZAEiJUDJLqcGa37EZv40UQnmGKpLZO3ypee9qvKRVC4Q3Oi3S+Ukfet7eJYvCwr 
WlneDOqvzyDz8cwlLcE2YhOnCMLYJ3v3YSt0n10oryaKyADDbCd5PmBbUwIEB7CO 
+QKBgCtLDEMODEMODEMODEMODEMOnNVbWYfVLhFJpdS1+5dTZbkOg6zaP+A/VKf1w 
3psFl7VfbggqiEvAi+4hTULVZu0W0wqPQUkw+rGzVT8Fg1uwBrzUKScJbscuRE/J 
1I6iizZ0sudjUynn+EORc12p1NRslf2BUW3nFIognt849r9JAkEA1V+5aGmJLZPP 
xZ/ETst7tb1WMeOvNxu+s/h2kcW6+WCvlUErYiB2/E/LkTbYGXu5/OHIMDgbQbB+ 
28Bu7lYmUwJBAM12343234235AEIDmvGJChsPOaqwnClV/fSEx/6E8DXMhDHTENA 
STt+v4k1rlkSlM2aliZ8kz2u8K45SepsVwECQQCmECecqVtfuIvC+8EKvlM536OT 
XrLIeDOkRak8yRqQFEZzAlOXkOtKIxHBJuVT39sPK+xzU30FwRdLE858eBphAkB+ 
LExh7ejTrxN3dHr1mDhJWoLzm59dzgwfmuEznnH+OmMZSAY21IouIAXjnKfXeCLo 
fRvUv5EuQkvGUJi1/25JAkAXZy7yjsJxaNBGB9TxakoHHnI2yWI/R9yewhzLorNo 
Oj49W6l9uaWaNxxmCrNZRIZoDEMODEMODEMODEMODEMO 
-----END RSA PRIVATE KEY----- 

Примечания: по какой-то причине END RSA формат строка оленьей кожи должным образом на стеке Переполнение.

Однако, когда я пытаюсь выбрать ключ обратно через рамку сущности, я получаю только следующее: ----- НАЧАТЬ RSA PRIVATE KEY -----

Я полагал, что это может быть SQL Server (2008 в моем случае) завершение строки на новом символе строки ('\ n') Итак, я написал сохраненный процесс, чтобы попытаться заменить его на стороне сервера, прежде чем он будет возвращен вызывающему приложению.

Законченное с чем-то вроде этого

Declare @str as nvarchar(max) 
Declare @strReplaced as nvarchar(max) 
set @str = (select PrivateKey from PrivateKeys where Id = @ID) 
set @strReplaced = (select (REPLACE(@str, CHAR(10), '<<newline>>'))) 
select @strReplaced 

При запуске на сервере SQL (хранимая процедура) - это дает мне секретный ключ с соответствующими <> замены Однако, когда я исполняю ХП с помощью следующий код C#, он все равно завершает результат в первой строке ключа.

var str = o.ExecuteStoreQuery<string>("Execute dbo.GetPrivateKey " + Id.ToString()); 
Console.WriteLine(str.ToList()[0]); 

Может кто-нибудь предложить решение, позволяющее моему C# -коду получить доступ ко всему RSA-ключу?

При выполнении моей хранимой процедуры в SQL Server Management Studio: Я получаю -----BEGIN RSA PRIVATE KEY-----<<newline>>MIICXwIBAAKBgQDuCFrUx55g9yqezNvzSpX0YegUDnrp0IP7jsMab0NVqAgl/azO<<newline>>qbp5SNe10mAYJNDsxBS0AHYSOrAHApgKPgWTKOE5gFUKxaB1eJgIDEMODEMODEMODEMO<<newline>>0PU0Kma2/8Znv23JFUDrO3Sk8Ft++aT8crCs45ygnJVNSdgsU0MDEMODEMODEMODEMO<<newline>>awKBgAXv6PqRNvFuEg5Pt+0IjwTMEHLqPBPEh5k2eS1aRYKyl/T40fe5SaXiMxWb<<newline>>f8SUoLXDPdOdkXqBqZfOs94hjtk6mRDZuBN9MWL7F4D+b6/n4s+YDEMODEMODEMODEMO<<newline>>kEr7DrtF/n/kDrH/Pty6pyHCfGLVLMtG6cFYIPncyYzViLTDAkEA+riR/e+elYVe<<newline>>bc+KPq9NlSXAFz21R00puCUJhrVBNcVZnKw2hV8D9Ie4b+WMaPcGh/7gHAiUC84o<<newline>>JpLA8EjGPQJBAPMLZGRwcvNiUW7gl2EBIq33gDZvefzQC4kr5J2SFLaA4lX/wKMJ<<newline>>ymHJdjQlmo5nKd7qdmg0DwbUSOjCcux/RpkCQQDXde/XX9kIxD9NQ2wV0DhQ4LFU<<newline>>J/OXlxZ2yD+Tnr7lFFN/QghU8Vuc0G4eRPR2kg5X6FBya3nQ5miDgl8j76pDAkEA<<newline>>pud2zrTMxBul8BDP4+gqll18jcRt0sV7fERvaMT+0gL/M2QamRevgd22ipKbBAUV<<newline>>P4f1Jtj6aFqVQ9n8RewtuwJBAL4iLMt/GWg71PBQhPlZlkDlmDGoDF1Ou6MYlONv<<newline>>z24JA/EMdx3Jx1/WG7xyzqmEJcVGk/8O/NWtP5DXQEFBLnw=<<newline>>-----END RSA PRIVATE KEY-----<<newline>>

При выполнении хранимой процедуры через C# код: `строка sConnectionString = "InsertConnectionStringHere"; использование (вар Conn = новый System.Data.SqlClient.SqlConnection (sConnectionString)) использование (команда вара = новый System.Data.SqlClient.SqlCommand ("GetPrivateKey", Conn) { CommandType = CommandType.StoredProcedure

     }) 
         { 
          conn.Open(); 
          command.Parameters.Add(new System.Data.SqlClient.SqlParameter("@DomainID", vTransaction.Domain.Id)); 
          var vReader = command.ExecuteReader(); 
          vReader.Read(); 
          var vResult = vReader.GetValue(0); 
          Console.WriteLine(vResult); 
          conn.Close(); 
         }` 

Это дает мне ----- НАЧАТЬ RSA ЧАСТНЫЙ КЛЮЧ ----- Как и все, что влияет на SQL на низком уровне, поэтому он влияет как на прямой сырой SQL, так и на платформу Entity Framework, которая покоится

Редактировать - При ближайшем рассмотрении я использую SQL Server Express - есть ли у него ограничения, которые могут повлиять на возвращаемые строки?

EDIT ---- Я модифицировал Хранимый Proc, чтобы преобразовать текстовое поле в двоичные данные, а затем отправить его вызывающему. с помощью этого кода select CONVERT(VARBINARY(max), @str)

Он работает на SQL Server, но при вызове удалена через C# код, он получает только 62 байт данных, при преобразовании в строку - еще раз, эти байты построят «--- --BEGIN RSA ЧАСТНЫЙ КЛЮЧ ----- '

Я в затруднении ....

+0

Он должен работать, тем не менее. Вопрос: правильно ли вы используете EF * - или вы создали EF, но получаете данные через SQL? – LocEngineer

+0

Простите, пропустил часть хранимой процедуры. Почему вы получаете его через SP? – LocEngineer

+0

Использование Хранимой процедуры было попыткой решить проблему. Если я пытаюсь использовать entityName.PrivateKey - это также дает мне единственную строку, противоположную полной строке. – Baaleos

ответ

0

Используйте Regex

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 


namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string key = 
       "-----BEGIN RSA PRIVATE KEY-----\n" + 
       "MIICXQIDEMODEMODEMODEMODEMOEbGslt0N21onxRjBUwXFKI7CN6clxPAS+nEUK\n" + 
       "BZAEiJUDJLqcGa37EZv40UQnmGKpLZO3ypee9qvKRVC4Q3Oi3S+Ukfet7eJYvCwr\n" + 
       "WlneDOqvzyDz8cwlLcE2YhOnCMLYJ3v3YSt0n10oryaKyADDbCd5PmBbUwIEB7CO\n" + 
       "+QKBgCtLDEMODEMODEMODEMODEMOnNVbWYfVLhFJpdS1+5dTZbkOg6zaP+A/VKf1w\n" + 
       "3psFl7VfbggqiEvAi+4hTULVZu0W0wqPQUkw+rGzVT8Fg1uwBrzUKScJbscuRE/J\n" + 
       "1I6iizZ0sudjUynn+EORc12p1NRslf2BUW3nFIognt849r9JAkEA1V+5aGmJLZPP\n" + 
       "xZ/ETst7tb1WMeOvNxu+s/h2kcW6+WCvlUErYiB2/E/LkTbYGXu5/OHIMDgbQbB+\n" + 
       "28Bu7lYmUwJBAM12343234235AEIDmvGJChsPOaqwnClV/fSEx/6E8DXMhDHTENA\n" + 
       "STt+v4k1rlkSlM2aliZ8kz2u8K45SepsVwECQQCmECecqVtfuIvC+8EKvlM536OT\n" + 
       "XrLIeDOkRak8yRqQFEZzAlOXkOtKIxHBJuVT39sPK+xzU30FwRdLE858eBphAkB+\n" + 
       "LExh7ejTrxN3dHr1mDhJWoLzm59dzgwfmuEznnH+OmMZSAY21IouIAXjnKfXeCLo\n" + 
       "fRvUv5EuQkvGUJi1/25JAkAXZy7yjsJxaNBGB9TxakoHHnI2yWI/R9yewhzLorNo\n" + 
       "Oj49W6l9uaWaNxxmCrNZRIZoDEMODEMODEMODEMODEMO\n" + 
       "-----END RSA PRIVATE KEY-----\n"; 

      Regex expr = new Regex("-.*$", RegexOptions.Multiline); 
      key = expr.Replace(key, "").Trim(); 

     } 
    } 
} 
​ 
+0

Это не поможет - проблема в том, что полная строка (ключ) хранится на SQL-сервере, по какой-то причине - строка не возвращается в код C#, поэтому я не могу выполнить регулярное выражение на том, к которому не имеет доступа код C#. – Baaleos

+0

В базе данных какая длина Var. Это может быть недостаточно, чтобы содержать все символы. Обычно он по умолчанию равен 256, а ключ сам по себе - 256. С двумя дополнительными строками он превышает размер по умолчанию в базе данных. – jdweng

+0

nvarchar находится на максимальной длине (nvarchar (max)) Поле содержит все данные. При использовании студии sql я могу выбрать данные в порядке. Его просто, когда я пытаюсь сделать то же самое с C# - он усекается до конца первой строки ключа RSA. – Baaleos

Смежные вопросы