2013-10-18 27 views
1

我已經看到很多解決方案,人們只會使用Command.ExecuteScalar as byte[];,但他們的SQL查詢一次只能獲取一個varbinary字段。我試圖選擇大約30k行的varbinary條目,但它們在一個字節[]中並反序列化。無法使用SqlDataReader和ExecuteReader將來自SQL的varbinary放入C#程序中的字節[]

這裏是我的代碼:

public void MNAdapter() 
    { 
     IsoStorage retVal = new IsoStorage(); 

     SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder(); 
     csb.DataSource = @"LocalMachine\SQLDEV"; 
     csb.InitialCatalog = "Support"; 
     csb.IntegratedSecurity = true; 
     string connString = csb.ToString(); 

     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 

      SqlCommand command = conn.CreateCommand(); 
      command.CommandText = @"SELECT S.Settings 
from Support.dbo.SavedLocalSettings S 
inner join WebCatalog.Published.People P 
on P.PKey = S.PeopleLink 
inner join WebCatalog.Published.Company C 
on P.Link = C.PeopleList 
where S.DateSaved >= GETDATE()-34 
and C.PKey != '530F4622-C30D-DD11-A23A-00304834A8C9' 
and C.PKey != '7BAF7229-9249-449E-BEA5-4B366D7ECCD1' 
and C.PKey != 'CCBB2140-C30D-DD11-A23A-00304834A8C9' 
and S.CompanyName not like 'Tech Support%' 
Group By S.PeopleLink, S.Settings"; 

using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) 
       { 
        //DataTable dt = new DataTable(); 
        //dt.Load(reader); 

        byte[] blob = null; 
        BinaryFormatter bf = new BinaryFormatter(); 
        bf.Binder = new CustomBinder(); 
        while (reader.Read()) 
        { 
         reader.GetBytes(0,0,blob,0,100000); 
         Console.WriteLine(blob.ToString()); 
         retVal = bf.Deserialize(new MemoryStream(blob)) as IsoStorage; 
        } 
       } 
      } 
     } 

我也試着將它們放在一個數據塔布拉第一,即使我認爲這會是多餘的,但他們得到的整數讀入。

我沒有收到任何錯誤,數據進入數據讀取器,但它就像reader.GetBytes(0,0,blob,0,100000);甚至沒有運行,因爲blob保持爲空。

回答

2

爲什麼不使用:

blob = (byte[])reader.Items["Settings"]; 

或者

blob = (byte[])reader["Settings"]; 
1

reader.GetBytes(0,0,一滴,0,100000); 您希望此方法爲您創建字節數組。它不會 - 它需要對現有數組的引用。你必須自己準備陣列。

相關問題