Сохранение бинарный данных в БД через XML.
От: pukapin  
Дата: 28.01.07 07:18
Оценка:
Есть вот такая хранимая процедура:

CREATE      PROCEDURE [dbo].[spSaveMyProfile] 
(
    @data ntext = null
)
AS

SET NOCOUNT ON

DECLARE @hDoc int

if (@data is not null)
BEGIN

    EXEC sp_xml_preparedocument @hDoc OUTPUT, @data

--UPDATE
    UPDATE Users
    SET
        Name = XmlUsers.Name,
        [Family name] = XmlUsers.[Family name],
        [Logo] = XmlUsers.Logo
    FROM 
        OPENXML(@hDoc, '/NewDataSet/My_x0020_profile')
    WITH (
        ID int,
        Name nvarchar(50),
        [Family name] nvarchar(50),
        [Logo] image
    ) XmlUsers
    WHERE
        Users.ID = XmlUsers.ID

--INSERT
    INSERT INTO Users 
        (ID, 
        Name, 
        [Family name], 
        Logo)
    SELECT 
        XmlUsers.ID,
        XmlUsers.Name,
        XmlUsers.[Family name],
        XmlUsers.[Logo]
    FROM 
        OPENXML(@hDoc, 'NewDataSet/My_x0020_profile')
    WITH (
        ID int,
        Name nvarchar(50),
        [Family name] nvarchar(50),
        [Logo] image
    ) XmlUsers
    WHERE
        XmlUsers.ID NOT IN (SELECT ID FROM Users)


    EXEC sp_xml_removedocument @hDoc

END    --if (@data is not null)
GO


Вышеуказанная хранимая процедура вызывается следующим образом:

Public Sub XmlSaveData(table as DataTable)

        Dim sb As System.Text.StringBuilder
        Dim sw As IO.StringWriter


        Try

            If (table.GetChanges() IsNot Nothing) Then

                For Each col As DataColumn In table.Columns

                    col.ColumnMapping = MappingType.Attribute
                Next    'col As DataColumn In table.Columns
                'NEW AND MODIFIED VALUES
                If (table.GetChanges(DataRowState.Added Or DataRowState.Modified) IsNot Nothing) Then

                    sb = New System.Text.StringBuilder(1000)
                    sw = New IO.StringWriter(sb)

                    table.GetChanges(DataRowState.Added Or _
                        DataRowState.Modified).WriteXml(sw, XmlWriteMode.WriteSchema)
                    Debug.WriteLine(sb.ToString())
                    _cmdXmlSave.Parameters(0).Value = sb.ToString()

                    sw.Close()

                End If  '(table.GetChanges(DataRowState.Added Or DataRowState.Modified) IsNot Nothing)

                OpenDBConnection(True)
                _cmdXmlSave.ExecuteNonQuery()
            End If  '(table.GetChanges() IsNot Nothing) 

        Catch ex As Exception

            ...

        Finally

            CloseDBConnection(True)
        End Try

    End Sub


Поле Logo (тип image) не сохраняется.
ПОЧЕМУ? И как сделать так чтобы сохранялось?
Re: Сохранение бинарный данных в БД через XML.
От: _d_m_  
Дата: 28.01.07 20:45
Оценка:
Здравствуйте, pukapin, Вы писали:

P>Поле Logo (тип image) не сохраняется.

P>ПОЧЕМУ? И как сделать так чтобы сохранялось?

Я уже догадался, что это MS SQL. А вот версию угадать не смог. Неужели сразу нельзя это писать в исходном посте ?
Re[2]: Сохранение бинарный данных в БД через XML.
От: pukapin  
Дата: 29.01.07 06:15
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, pukapin, Вы писали:


P>>Поле Logo (тип image) не сохраняется.

P>>ПОЧЕМУ? И как сделать так чтобы сохранялось?

___>Я уже догадался, что это MS SQL. А вот версию угадать не смог. Неужели сразу нельзя это писать в исходном посте ?

Извиняюсь.
MS SQL 2000 sp4.
Re: Сохранение бинарный данных в БД через XML.
От: _d_m_  
Дата: 29.01.07 11:30
Оценка:
Здравствуйте, pukapin, Вы писали:

P> UPDATE Users

P> SET
P> Name = XmlUsers.Name,
P> [Family name] = XmlUsers.[Family name],
P> [Logo] = XmlUsers.Logo
P> FROM
P> OPENXML(@hDoc, '/NewDataSet/My_x0020_profile')
P> WITH (
P> ID int,
P> Name nvarchar(50),
P> [Family name] nvarchar(50),
P> [Logo] image
P> ) XmlUsers
P> WHERE
P> Users.ID = XmlUsers.ID

P>Поле Logo (тип image) не сохраняется.

P>ПОЧЕМУ? И как сделать так чтобы сохранялось?

Документации по 2000-му под рукой нет, а так на вскидку не помню — разве можно использовать тип image в openxml? В 2000, кажется, нет.
Re[2]: Сохранение бинарный данных в БД через XML.
От: pukapin  
Дата: 30.01.07 06:14
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, pukapin, Вы писали:


P>> UPDATE Users

P>> SET
P>> Name = XmlUsers.Name,
P>> [Family name] = XmlUsers.[Family name],
P>> [Logo] = XmlUsers.Logo
P>> FROM
P>> OPENXML(@hDoc, '/NewDataSet/My_x0020_profile')
P>> WITH (
P>> ID int,
P>> Name nvarchar(50),
P>> [Family name] nvarchar(50),
P>> [Logo] image
P>> ) XmlUsers
P>> WHERE
P>> Users.ID = XmlUsers.ID

P>>Поле Logo (тип image) не сохраняется.

P>>ПОЧЕМУ? И как сделать так чтобы сохранялось?

___>Документации по 2000-му под рукой нет, а так на вскидку не помню — разве можно использовать тип image в openxml? В 2000, кажется, нет.


Похоже, что и ntext нельзя.
Re[3]: Сохранение бинарный данных в БД через XML.
От: _d_m_  
Дата: 30.01.07 07:07
Оценка:
Здравствуйте, pukapin, Вы писали:

P>>>Поле Logo (тип image) не сохраняется.

P>>>ПОЧЕМУ? И как сделать так чтобы сохранялось?

___>>Документации по 2000-му под рукой нет, а так на вскидку не помню — разве можно использовать тип image в openxml? В 2000, кажется, нет.


P>Похоже, что и ntext нельзя.


Ну это из одной оперы — BLOB-ы: text, ntext, image. А в 2005 такого ограничения нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.