Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Доброго время суток :)
Решила в своем курсовом использовать FileStream, у меня к вам вопросик, а как писать хранимые процедуры для загрузки файлов?

Код создания таблицы с полем varbinary(max):
CREATE TABLE ResultWork
(Ik_ResultWork [uniqueidentifier] ROWGUIDCOL 
CONSTRAINT ResultWorkPrimary PRIMARY KEY,
idUspevDocs INT NOT NULL,
Ik_ReqWork INT NOT NULL,
LoadDoc VARBINARY(MAX) FILESTREAM NOT NULL
CONSTRAINT ResultWorkReqWorkForeign FOREIGN KEY 
(Ik_ReqWork) REFERENCES ReqWork,
CONSTRAINT ResultWorkUspevKPThemeForeign FOREIGN KEY 
(idUspevDocs) REFERENCES UspevKPTheme);
Заранее огромное спасибо :)
2 июн 11, 00:27    [10749611]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Управление данными FILESTREAM с помощью языка Transact-SQL
Данные FILESTREAM в SQL Server 2008 (ADO.NET)

Куча готовых примеров прямо в документации. Лучше бы взяли тему курсовика - использование документации, обучение на рабочем месте, современные тенденции леньтяйства работников и к чему это приведёт отрасль в будущем, отсутствие базовых умений и понятий и навыков обучения и поиска информации у современных выпускников и молодёжи в общем.
2 июн 11, 02:32    [10749787]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Mnior,
зачем же быть таким грубым?
Я прочитала эти статьи, там написано как создавать файл и добавление в него данных...
Мне надо реализовать в системе загрузку работ документов, скорее всего просто архивы...
Первый раз сталкиваюсь с FileStream, и не очень понимаю как с ним работать...
2 июн 11, 11:18    [10751013]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Lesimel, а вот так вы умеете? Не? Нужно учиться.
2 июн 11, 11:22    [10751045]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Lesimel
зачем же быть таким грубым?
Констатация фактов это не грубость, а наоборот одолжение. Известно над чем работать.
2 июн 11, 11:27    [10751088]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
обычную вставку я поняла, пример:
INSERT INTO ResultWork
SELECT newid(), 1,1, * FROM OPENROWSET(BULK N'C:\net_share.bmp', SINGLE_BLOB) AS LoadDoc

А с хранимой процедурой все равно не очень понятно:
CREATE PROC PResultWorkINSERT
@LoadDoc VARBINARY(max),
@Ik_ReqWork INT,
@idUspevDocs INT
AS
INSERT INTO ResultWork (Ik_ReqWork,idUspevDocs,LoadDoc)
VALUES ....
2 июн 11, 12:32    [10751645]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Lesimel
А с хранимой процедурой все равно не очень понятно


Что именно Вам не очень понятно с ХП? Что было сделано? Какие результаты/ошибки имеете на руках? Все сюда!
2 июн 11, 13:24    [10752139]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
SamMan
Lesimel
А с хранимой процедурой все равно не очень понятно


Что именно Вам не очень понятно с ХП? Что было сделано? Какие результаты/ошибки имеете на руках? Все сюда!



Мне сам синтаксис не очень понятен, я пишу примерно так, как в обычной вставке:
CREATE PROC PResultWorkINSERT
@LoadDoc VARBINARY(max),
@Ik_ReqWork INT,
@idUspevDocs INT
AS
INSERT INTO ResultWork (Ik_ReqWork,idUspevDocs,LoadDoc)
VALUES 
(SELECT 1,1,*
FROM OPENROWSET(BULK @LoadDoc, SINGLE_BLOB) AS LoadDoc)

Ошибка: Неправильный синтаксис около ключевого слова "SELECT"
Неправильный синтаксис около конструкции "@LoadDoc".
2 июн 11, 13:41    [10752317]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Описание синтаксиса есть в хелпе.
2 июн 11, 13:42    [10752338]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Lesimel
CREATE PROC PResultWorkINSERT
@LoadDoc VARBINARY(max),
@Ik_ReqWork INT,
@idUspevDocs INT
AS
INSERT INTO ResultWork (Ik_ReqWork,idUspevDocs,LoadDoc)
VALUES 
(SELECT 1,1,*
FROM OPENROWSET(BULK @LoadDoc, SINGLE_BLOB) AS LoadDoc)

Ошибка: Неправильный синтаксис около ключевого слова "SELECT"
Неправильный синтаксис около конструкции "@LoadDoc".


1. Параметр @LoadDoc. В нем передаётся сам документ или путь к файлу на диске?
2. Для чего параметры @Ik_ReqWork и @idUspevDocs? Они нигде не используются.
3. Либо VALUES, либо SELECT без в скобок.
4. OPENROWSET не допускает параметров. Если параметры всё же нужны, то используйте динамический SQL.
2 июн 11, 13:52    [10752456]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Если я делаю тупо в лоб:

CREATE PROC PResultWorkINSERT
@LoadDoc VARBINARY(max),
@Ik_ReqWork INT,
@idUspevDocs INT
AS
INSERT INTO ResultWork (Ik_ReqWork,idUspevDocs,LoadDoc)
VALUES 
(@Ik_ReqWork,@idUspevDocs,@LoadDoc)

EXEC PResultWorkINSERT 
'1','1','C:\net_share.bmp'

он выдает, конечно, же ошибку:
Неявное преобразование из типа данных varchar в varbinary(max) не разрешено.
2 июн 11, 14:15    [10752706]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Prolog
Lesimel
CREATE PROC PResultWorkINSERT
@LoadDoc VARBINARY(max),
@Ik_ReqWork INT,
@idUspevDocs INT
AS
INSERT INTO ResultWork (Ik_ReqWork,idUspevDocs,LoadDoc)
VALUES 
(SELECT 1,1,*
FROM OPENROWSET(BULK @LoadDoc, SINGLE_BLOB) AS LoadDoc)

Ошибка: Неправильный синтаксис около ключевого слова "SELECT"
Неправильный синтаксис около конструкции "@LoadDoc".


1. Параметр @LoadDoc. В нем передаётся сам документ или путь к файлу на диске?
2. Для чего параметры @Ik_ReqWork и @idUspevDocs? Они нигде не используются.
3. Либо VALUES, либо SELECT без в скобок.
4. OPENROWSET не допускает параметров. Если параметры всё же нужны, то используйте динамический SQL.



1. Я предполагаю, что @LoadDoc путь к файлу
2. @Ik_ReqWork и @idUspevDoc это просто FOREIGN KEY, я задаю их в селекте 1,1
3. вроде все скобочки на месте :)
2 июн 11, 14:18    [10752746]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Lesimel
1. Я предполагаю, что @LoadDoc путь к файлу

зачем тогда пармаетр имеет тип
@LoadDoc VARBINARY(max)
2 июн 11, 14:38    [10752985]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Lesimel,

1. Тот кто пишет процедуру должен не предполагать, а знать. И если @LoadDoc - это пусть к файлу, то параметр должен быть типа varchar, а не varbinary.
2. Если вы передаёте параметры в процедуру, то дожны их использовать. Напимер в SELECT'е:
SELECT  @Ik_ReqWork,@idUspevDocs, ...
3. Либо конструкция типа VALUES(@Ik_ReqWork,@idUspevDocs,...). Либо типа: SELECT @Ik_ReqWork,@idUspevDocs, ... from ....
4. OPENROWSET не допускает параметров. Если параметры всё же нужны, то используйте динамический SQL
2 июн 11, 14:45    [10753063]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
HandKot
Lesimel
1. Я предполагаю, что @LoadDoc путь к файлу

зачем тогда пармаетр имеет тип
@LoadDoc VARBINARY(max)


блииииин......
блин ни фига не понятно как писать эти хранимые процедуры...
2 июн 11, 14:47    [10753091]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Lesimel
блииииин......
блин ни фига не понятно как писать эти хранимые процедуры...
И это только начало. Вы ещё должны обеспечить логину, подкоторым выполняется ваша прроцедура доспут к файлу, которые переписываете в базу данных. А в базе данных создать файловую группу под FILESTREAM (вам удалось создать таблицу?). Да и почему-то в вашей процедуре упущено заполнение столбца Ik_ResultWork [uniqueidentifier] ROWGUIDCOL. Без него FILESTREAM не получится.
2 июн 11, 15:04    [10753268]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Prolog
Lesimel
блииииин......
блин ни фига не понятно как писать эти хранимые процедуры...
И это только начало. Вы ещё должны обеспечить логину, подкоторым выполняется ваша прроцедура доспут к файлу, которые переписываете в базу данных. А в базе данных создать файловую группу под FILESTREAM (вам удалось создать таблицу?). Да и почему-то в вашей процедуре упущено заполнение столбца Ik_ResultWork [uniqueidentifier] ROWGUIDCOL. Без него FILESTREAM не получится.


про логин это понятно, файловую группу я уже создала, и таблицу тоже)
а разве заполнение Ik_ResultWork [uniqueidentifier] ROWGUIDCOL не идет автоматически, типо int identity?
2 июн 11, 15:14    [10753396]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Lesimel
а разве заполнение Ik_ResultWork [uniqueidentifier] ROWGUIDCOL не идет автоматически, типо int identity?
Вот если при создании таблицы для столбца Ik_ResultWork указадть default newid(), тогда и будет "автоматически".
2 июн 11, 15:19    [10753448]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Prolog
Lesimel
а разве заполнение Ik_ResultWork [uniqueidentifier] ROWGUIDCOL не идет автоматически, типо int identity?
Вот если при создании таблицы для столбца Ik_ResultWork указадть default newid(), тогда и будет "автоматически".


А не подскажите как написать процедуру:

CREATE PROC PResultWorkINSERT
@LoadDoc VARBINARY(max),
@Ik_ReqWork INT,
@idUspevDocs INT
AS
INSERT INTO ResultWork (Ik_ReqWork,idUspevDocs,LoadDoc)
VALUES
(@Ik_ReqWork,@idUspevDocs,....)

Чтобы при ее вызове я написала путь к файлу на компьютере, а он записал файл в файловой системе и записал ссылку в поле LoadDoc типа VARBINARY(max)

Такое вообще возможно?)
2 июн 11, 15:33    [10753619]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Т.е. на уровне приложения это будет выглядеть примерно так, нажимаем загрузить документ, открывается окно, где можно выбираешь файл на своем компе, нажимаем ОК, и в строке появляется полный адрес загружаемого файла жмем ОК он отправляется на сервер все как обычно :)

вопрос как написать эту ХП, мать ее...
2 июн 11, 15:45    [10753748]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Мне непонятно: вас не учат писать хранимые процедуры, а сразу задают курсовые?
2 июн 11, 15:56    [10753863]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
На скорую руку, без тестирования:
set quoted_identifier, ansi_nulls on
go
CREATE PROC PResultWorkINSERT
  @LoadDoc      VARCHAR(max),
  @Ik_ReqWork   INT,
  @idUspevDocs  INT
as
  set nocount on

  DECLARE @sql nvarchar(4000)
  SELECT  @sql = N'SELECT newid(),'+CAST(@Ik_ReqWork as nvarchar)+N','+CAST(@idUspevDocs as nvarchar)+N',* FROM OPENROWSET(BULK N'''+@LoadDoc+''', SINGLE_BLOB) AS Document'

  INSERT INTO dbo.ResultWork(Ik_ResultWork,Ik_ReqWork,idUspevDocs,LoadDoc) EXECUTE(@sql)

  RETURN @@error
go
2 июн 11, 16:00    [10753909]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Prolog
Мне непонятно: вас не учат писать хранимые процедуры, а сразу задают курсовые?


ХП написать горем пополам я смогу , просто не умею работать с FILESTREAM, в инете как-то не густо...
2 июн 11, 16:01    [10753919]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Lesimel
Member

Откуда:
Сообщений: 32
Prolog
На скорую руку, без тестирования:
set quoted_identifier, ansi_nulls on
go
CREATE PROC PResultWorkINSERT
  @LoadDoc      VARCHAR(max),
  @Ik_ReqWork   INT,
  @idUspevDocs  INT
as
  set nocount on

  DECLARE @sql nvarchar(4000)
  SELECT  @sql = N'SELECT newid(),'+CAST(@Ik_ReqWork as nvarchar)+N','+CAST(@idUspevDocs as nvarchar)+N',* FROM OPENROWSET(BULK N'''+@LoadDoc+''', SINGLE_BLOB) AS Document'

  INSERT INTO dbo.ResultWork(Ik_ResultWork,Ik_ReqWork,idUspevDocs,LoadDoc) EXECUTE(@sql)

  RETURN @@error
go


можно вопросик? а зачем тут производится перевод int в nvarchar

хотя он выдает ошибку:Ошибка при преобразовании типа данных varchar к int.
2 июн 11, 16:16    [10754040]     Ответить | Цитировать Сообщить модератору
 Re: Работа с документооборотом, технология FileStream  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Lesimel,

Вставьте между SELECT и INSERT строку
PRINT @sql
Выложите на форум результат PRINT'а.
2 июн 11, 16:29    [10754147]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить