2010-04-28 74 views
6

Tôi muốn truy xuất một số dữ liệu nhị phân từ cột varbinary(max) trong cơ sở dữ liệu SQL Server để gỡ lỗi.Ad-hoc retreival dữ liệu từ SQL Server varbinary cột

Cách dễ nhất để đưa dữ liệu này vào một tệp nhị phân cục bộ, tốt nhất là không cần phải viết một ứng dụng bảng điều khiển ném đi là gì?

Tôi đã thử sử dụng SQL Server Management Studio (với tùy chọn "kết quả cho tệp") nhưng kết quả này tạo ra chuỗi nhị phân được mã hóa hex vào tệp chứ không phải dữ liệu nhị phân thô.

+3

Tôi không chắc chắn nếu đây là những gì bạn đang tìm kiếm, nhưng bạn có biết về LINQPad? Về cơ bản nó là một ứng dụng mà bạn có thể viết các ứng dụng C# "ném đi". –

Trả lời

3

tôi đã tìm thấy this solution với bcp lệnh (chạy từ dấu nhắc lệnh):

c:\temp>bcp "select MYVARBINARYCOL from MYTABLE where id = 1234" queryout "c:\filename.pdf" -S MYSQLSERVER\MYINSTANCE -T 

Enter the file storage type of field filedata [varbinary(max)]: 
Enter prefix-length of field filedata [8]: 0 
Enter length of field filedata [0]: 
Enter field terminator [none]: 

Do you want to save this format information in a file? [Y/n] n 

Starting copy... 

1 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.) Total : 15 Average : (66.67 rows per sec.) 

tôi đã sử dụng các tùy chọn -T sử dụng cửa sổ xác thực để kết nối với DB. Nếu bạn sử dụng mật khẩu auth, bạn sẽ cần phải sử dụng các chuyển đổi -U và -P để chỉ định tên người dùng và mật khẩu.

Nhưng tôi cũng thích LinqPad đề xuất trong Robb Sadler's answer và bằng cách nào đó thích nó hơn.

6

Tôi không thể nghĩ ra cách nào dễ dàng hơn để làm điều này hơn một ném đi chút C# ...

static void Main(string[] args) 
    { 
     GetBinaryDataToFile("Server=localhost;Initial Catalog=ReportServer;Integrated Security=true", "D:\\temp.dat"); 
    } 

    public static void GetBinaryDataToFile(string connectionString, string path) 
    { 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 

      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandText = "SELECT Sid FROM Users WHERE UserID = '62066184-8403-494E-A571-438ABF938A4F'"; 
       command.CommandType = CommandType.Text; 

       using (SqlDataReader dataReader = command.ExecuteReader()) 
       { 
        if (dataReader.Read()) 
        { 
         SqlBinary sqlBinary = dataReader.GetSqlBinary(0); 
         File.WriteAllBytes(path, sqlBinary.Value); 
        } 

        dataReader.Close(); 
       } 
      } 

      connection.Close(); 
     } 
    } 

Mã này đã được thử nghiệm bằng cách sử dụng cột Users.Sid ​​(đó là kiểu varbinary) trong cài đặt mặc định của Dịch vụ báo cáo SQL Server wih.

4

Tôi thích đề xuất LINQPad. Tôi đã thử nó và đã có một truy vấn mà nhổ ra nhị phân vào một tập tin trong vòng 10 phút. Không có dự án VS, không xây dựng - và bây giờ kịch bản được lưu và tôi có thể kéo nó lên bất cứ lúc nào. Thật tuyệt!

LinqPad kịch bản:

var g = from pd in Archives 
    where pd.ArchiveId == 123 
    select pd; 

var q = from p in printDocs 
where p.DocumentId == g.SingleOrDefault().DocumentId 
select p; 

File.WriteAllBytes("C:\\temp.pdf", q.SingleOrDefault().Pdf.ToArray()); 
+0

Tôi không hiểu. Làm thế nào để làm việc này trong LinqPad? 'Lưu trữ' được định nghĩa ở đâu? Bạn có tham khảo một số thư viện bên ngoài nơi các thực thể LINQ-to-SQL/EntityFramework của bạn được định nghĩa không? –

+0

Tôi gắn liền với cơ sở dữ liệu của tôi và LinqPad đã tự động xây dựng lớp dữ liệu LINQ to Sql. Sau đó tôi có thể truy cập và sử dụng nó. Đó là một phần của những gì làm cho nó mát mẻ. Đó là một tải về nhanh chóng - Tôi khuyên bạn nên cho nó một whirl. Đây là mã duy nhất tôi viết. –

Các vấn đề liên quan