سؤال

أود أن أعزز بعض البيانات الثنائية من أ varbinary(max) العمود في قاعدة بيانات SQL Server لأغراض تصحيح الأخطاء.

ما هي أسهل طريقة لإدخال هذه البيانات في ملف ثنائي محلي ، ويفضل أن يكون ذلك دون الحاجة إلى كتابة تطبيق وحدة تحكم رمي؟

لقد حاولت استخدام SQL Server Management Studio (مع خيار "النتائج إلى ملف") ولكن هذا يخرج سلسلة ثنائية مشفرة في الملف ، بدلاً من البيانات الثنائية الخام.

هل كانت مفيدة؟

المحلول

لقد وجدت هذا الحل مع bcp الأمر (تشغيل من موجه الأوامر):

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 لاستخدام مصادقة Windows للاتصال بـ DB. إذا كنت تستخدم Auth Password ، فستحتاج إلى استخدام مفاتيح -U و -P لتحديد اسم المستخدم وكلمة المرور.

لكني أحب أيضا Linqpad اقتراح في إجابة روب سادلر ويفضل ذلك بطريقة ما.

نصائح أخرى

لا أستطيع التفكير في أي طريقة أسهل للقيام بذلك من رمي قليلاً من 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();
        }
    }

تم اختبار هذا الرمز باستخدام Users.sid Column (وهو نوع من النوع) في التثبيت الافتراضي لخدمات الإبلاغ عن خادم SQL Server.

أحببت اقتراح linqpad. جربته وكان استعلام يبصق ثنائيًا في ملف في غضون 10 دقائق. لا مشروع مقابل مشروع ، لا بناء - والآن يتم حفظ البرنامج النصي ويمكنني سحبه في أي وقت. لطيف جدا!

نص Linqpad:

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());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top