en-UShe-IL
You are here:   Blog
Register   |  Login

Blog Archive:

Maximize
* Can be used in order to search for older blogs Entries

Search in blogs


Blog Categories:

Maximize
* Can be used in order to search for blogs Entries by Categories

Blog Tags:

Maximize
* Can be used in order to search for blogs by keywords

TNWikiSummit


Awared MVP 


 


Microsoft® Community Contributor 


Microsoft® Community Contributor


 Read first, before you you use the blog! Maximize
אוג3

Written by: ronen ariely
03/08/2011 19:16 RssIcon

קריאה וכתיבה של קבצים אל מסד הנתונים וממסד הנתונים אל הדיסק

 

בלוג קצר יהווה הדגמה פשוטה של כיצד ניתן לקרוא קבצים ששמרנו בשדה בינארי ישירות ממסד הנתונים ולשמור את הקבצים לדיסק, והפוך... נראה כיצד להכניס קבצים אל שדה בינארי.

כמו רוב הפעולות הרי שגם עבודה עם קבצים ושדה בינארי ניתן לבצע בדרכים שונות. במדריך זה נתבסס על העבודה עם הפרוצדורה השמורה sp_OACreate. פרוצדורה זו מאפשרת לנו לעבוד עם אובייקטים שונים במערכת ההפעלה שלנו ישירות משרת ה SQL.

* הערה: לפני המשך עבודה יש לוודא הרשאות מלאות בתקייה בה רוצים לשמור את הקבצים או לקרוא אותם.

מי שיש לו ניסיון בפיתוח קודים מכיר בוודאי את האובייקט Scripting.FileSystemObject בעזרתו אנחנו יכולים לגשת לתיקיות או קבצים במערכת ההפעלה (לצפות/למחוק/לייצר). כאשר אנחנו עובדים עם נתונים בינאריים אנחנו עובדים עם אלמנטים מסוג Stream. אובייקט נוסף בו אנו עושים שימוש בעיקר כאשר נרצה לעבוד עם ערכים בינאריים הוא ADODB.Stream.

כפי שהסברנו הפרוצדורה sp_OACreate מאפשרת לנו לגשת לאלמנטים אלו ולהפעיל אותם ישירות משרת ה SQL כפי שנראה בהדגמות הבאות

הדגמה 1: Scripting.FileSystemObject

/*****************************************************************/

/**************** write to text file *****************************/

/*****************************************************************/

print '************* Start *************'

 

-- declare var

DECLARE @FS int, @OLEResult int, @FileID int

 

-- Create an object.

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject' , @FS OUT

print 'creating object Result: ' + cast(@OLEResult as nvarchar(100))

 

-- Opens the file specified by the path

execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, 'C:\MyTest01.txt', 8, 1

print 'Opens the file Result: ' + cast(@OLEResult as nvarchar(100))

 

-- Appends the string value line to the file specified by the @File input parameter

execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, 'My Strin to write at the file'

print 'Appends the string Result: ' + cast(@OLEResult as nvarchar(100))

 

EXECUTE @OLEResult = sp_OADestroy @FileID

EXEC @OLEResult = sp_OAMethod @FileID, 'Close'

EXECUTE @OLEResult = sp_OADestroy @FS

 

print 'End Result: ' + cast(@OLEResult as nvarchar(100))

 

הדגמה 2: ADODB.Stream

-- נעבור למסד הנתונים של ההדגמות שלנו

USE [qq]

GO

 

-- נייצר טבלה חדשה על מנת לשמור בה קבצים

CREATE TABLE [qq].[dbo].[MyPic](

      [Id] [int] NULL,

      [Name] [varchar](50) NOT NULL,

      [Photo] [varbinary](max) NOT NULL

) ON [PRIMARY]

GO

 

-- Insert Picture:

INSERT INTO MyPic (Id, Name, Photo) 

SELECT 10, 'John', BulkColumn FROM Openrowset( Bulk 'C:\YesICan.jpg', Single_Blob) as EmployeePicture

 

-- check our data

select * from MyPic

 

-- Update Picture if we need:

UPDATE MyPic

SET [Photo] = (SELECT MyImage.* from Openrowset(Bulk 'C:\YesICan.jpg', Single_Blob) MyImage) where Id = 10

 

-- get our date into Variable

declare @MyStream as varbinary(max)

select @MyStream =

      qq.dbo.MyPic.Photo

      from qq.dbo.MyPic

      where qq.dbo.MyPic.Id = 10

--write image file from our Variable to the Disk

DECLARE @ObjectToken INT

EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT

EXEC sp_OASetProperty @ObjectToken, 'Type', 1

EXEC sp_OAMethod @ObjectToken, 'Open'

EXEC sp_OAMethod @ObjectToken, 'Write', NULL,@MyStream

EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, 'C:\21212121\YesICan.jpg', 2

EXEC sp_OAMethod @ObjectToken, 'Close'

EXEC sp_OADestroy @ObjectToken

go

 

הודעת שגיאה:

SQL Server blocked access to procedure 'sys.sp_OACreate' of component 'Ole Automation Procedures' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ole Automation Procedures' by using sp_configure. For more information about enabling 'Ole Automation Procedures', see "Surface Area Configuration" in SQL Server Books Online.

הפתרון

הגדרות ברירת המחדל של השרת נועדו להקל על המשתמש ולאבטח את המערכת ככל האפשר במצב ההתחלתי. שימוש בפרוצדורה זו מחייב שינוי הגדרות אבטחה.

ההודעה שקיבלנו נראית דיי ברורה ומדווחת לנו על כך שהאלמנט Ole Automation Procedures מכובה.

נבדוק שאכן זה המצב על ידי הרצת הפרוצדורה הבאה

sp_configure

GO

 

בתוצאה ניתן לחפש את השורה בה מופיע "Ole Automation Procedures". תעתיקו ושמרו את המצב הנוכחי (פשוט העתיקו את השורה) כדי שתוכלו לחזור אליו אם תרצו בהמשך. כמו כן העתיקו את הנתונים של השורה בה מופיע "show advanced options". עתה נשנה הגדרות של נתונים אלו:

sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

sp_configure 'Ole Automation Procedures', 1;

GO

RECONFIGURE;

GO