Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Varbinary(Max) разрешает занести только 400кб / 13 сообщений из 13, страница 1 из 1
11.09.2008, 14:31
    #35534174
x33x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Всем привет.
Имеется интерфейс на аксе, через который в таблицу на SQL сервере 2005 заносятся изображения. И если размер такого файла больше 400кб, то в базу данный рисунок уже не заносится. Почему такое происходит, ведь максимальный размер 2^31-1 байт, который можно занести?
Вот функция, которая заносит файл в базу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Function SaveFileToDB(sFiles As String) As Double
    Dim s As String
    
    On Error GoTo  1 
    s = Nz(sFiles, "")
    ImgPath = s
    For i =  1  To Len(ImgPath)
        If Mid(ImgPath, i,  1 ) = "." Then last_dot = i
    Next i
    ExtImg = Mid(ImgPath, last_dot +  1 ,  1000 )
    ExtImg = "." & ExtImg
    Me.ExtensImg.Value = ExtImg
    
    If (Dir(s) = "") Or (s = "") Then MsgBox "Файл не найден": Exit Function
    
    Set MStream = CreateObject("ADODB.Stream")
    MStream.Type = adTypeBinary
    MStream.Open
    MStream.LoadFromFile s
    Me.ScanDocField = MStream.Read
ex:
    Set MStream = Nothing
    Exit Function
 1 
    SaveFileToDB = Err.Number
    GoTo ex
End Function
...
Рейтинг: 0 / 0
22.09.2008, 11:43
    #35551706
x33x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Подниму темку, так как 400 кб это слишком мало как оказалось. Нужно хотя бы мегабайт, лучше 2.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Function SaveFileToDB(sFiles As String) As Double
    Dim s As String
    Dim fso As Object, file As Object

    On Error GoTo  1 
    s = Nz(sFiles, "")
    ImgPath = s
    For i =  1  To Len(ImgPath)
        If Mid(ImgPath, i,  1 ) = "." Then last_dot = i
    Next i
    ExtImg = Mid(ImgPath, last_dot +  1 ,  1000 )
    ExtImg = "." & ExtImg
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set file = fso.GetFile(ImgPath)
    If file.size > CLng( 400 ) *  1024  Then
        MsgBox "Размер файла превышает 400 килобайт"
        flag = True
        Exit Function
    End If
    
    Me.ExtensImg.Value = ExtImg
    
    If (Dir(s) = "") Or (s = "") Then MsgBox "Файл не найден": Exit Function
    
    Set MStream = CreateObject("ADODB.Stream")
    MStream.Type = adTypeBinary
    MStream.Open
    MStream.LoadFromFile s
    Me.ScanDocField = MStream.Read
    Set MStream = Nothing
    Set fso = Nothing
ex:
    Set MStream = Nothing
    Exit Function
 1 
    SaveFileToDB = Err.Number
    GoTo ex
End Function

Подскажите пожалуйста выход из ситуации.
...
Рейтинг: 0 / 0
22.09.2008, 12:16
    #35551810
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Нужен тип поля image, а не varbinary.
...
Рейтинг: 0 / 0
22.09.2008, 15:10
    #35552280
x33x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
AntonariyНужен тип поля image, а не varbinary.

С этим типом у меня SQL ругается:
'MyTable' table
- Unable to preserve trigger 'trChanges'.
Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables.

А этот тригер мне нужен...
...
Рейтинг: 0 / 0
22.09.2008, 15:29
    #35552342
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Покажи текст триггера.
...
Рейтинг: 0 / 0
22.09.2008, 15:56
    #35552428
x33x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
AntonariyПокажи текст триггера.

Вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
BEGIN
	SET NOCOUNT ON;

	declare @EventID as uniqueidentifier
	declare @UserAddress as varchar( 50 )
	Set @EventID=newid()

IF not UPDATE(WorkStatusDate) or not UPDATE(DateAddImage)

begin
	Update dbo.MyTable
	SET dbo.MyTable.DateUpdate = Getdate(), dbo.MyTable.UpdateEvent = @EventID
	FROM dbo.MyTable inner Join
	(SELECT Inserted.* FROM Inserted inner join Deleted On Inserted.RowID=Deleted.RowID) as Upd on
	dbo.MyTable.RowID=Upd.RowID
end 

Insert changes.MyTable (ClientID,DateUpdate,RowID,UpdateEvent,UpdateUser,UserMachine,UserApp)
SELECT Deleted.ClientID,GetDate(),Deleted.RowID, @EventID,
	SUSER_SNAME(),HOST_NAME(),APP_NAME()
FROM Inserted inner join Deleted On Inserted.RowID=Deleted.RowID

END
...
Рейтинг: 0 / 0
22.09.2008, 15:59
    #35552440
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Вот что я нашел (цитата из http://www.sqlteam.com/Forums/topic.asp?TOPIC_ID=10813):
автор
You can't do any text/image column comparisons in a trigger. Those types of columns are not stored the same as the rest of the data, so they can't be made accessible using the deleted and inserted tables.

Secondly, text and image column modifications are not logged by default, and I believe they can only be logged using the WRITETEXT and UPDATETEXT commands. Basically this means the trigger can't tell if the text columns were updated anyway.

Reconsider whether you truly need text columns. There are far more limitations than advantages. You can always use multiple varchar columns if you need to store more than 8000 characters. Also read Books Online about text columns, and the READTEXT, WRITETEXT, and UPDATETEXT commands. You could rewrite your trigger as a stored procedure, and may be able to utilize these commands to do what you want.
...
Рейтинг: 0 / 0
22.09.2008, 16:00
    #35552447
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Вам перевод нужен?
...
Рейтинг: 0 / 0
22.09.2008, 16:09
    #35552469
x33x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
VladConnВам перевод нужен?

Спасибо. В целом понял.
...
Рейтинг: 0 / 0
22.09.2008, 17:50
    #35552796
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Код: plaintext
1.
2.
3.
4.
Update dbo.MyTable
	SET dbo.MyTable.DateUpdate = Getdate(), dbo.MyTable.UpdateEvent = @EventID
	FROM dbo.MyTable inner Join
	(SELECT Inserted.* FROM Inserted inner join Deleted On Inserted.RowID=Deleted.RowID) as Upd on
	dbo.MyTable.RowID=Upd.RowID
Никогда не пользовался конструкцией inner join (select … ) as , но думаю, что тут достаточно заменить Inserted.* на Inserted.RowID. И image заработает.
...
Рейтинг: 0 / 0
23.09.2008, 12:49
    #35554053
x33x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Antonariy
Код: plaintext
1.
2.
3.
4.
Update dbo.MyTable
	SET dbo.MyTable.DateUpdate = Getdate(), dbo.MyTable.UpdateEvent = @EventID
	FROM dbo.MyTable inner Join
	(SELECT Inserted.* FROM Inserted inner join Deleted On Inserted.RowID=Deleted.RowID) as Upd on
	dbo.MyTable.RowID=Upd.RowID
Никогда не пользовался конструкцией inner join (select … ) as , но думаю, что тут достаточно заменить Inserted.* на Inserted.RowID. И image заработает.

Image то вроде заработал, но что-то всё равно больше 400 килобайт файл цеплять у меня не хочет...
...
Рейтинг: 0 / 0
23.09.2008, 14:36
    #35554464
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
Чем мотивирует на этот раз?
...
Рейтинг: 0 / 0
23.09.2008, 15:55
    #35554749
x33x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Varbinary(Max) разрешает занести только 400кб
AntonariyЧем мотивирует на этот раз?

Тут уже всё трудно, даже затрудняюсь объяснить.
В аксесе выпадает с сообщением, что "Действие прерывано со связанным объектом" на строке:
Код: plaintext
1.
Me.Recordset.FindFirst strcrit
Me.Bookmark = Me.Recordset.Bookmark
когда я пытаюсь занести любой файл более 400 килобайт.
И файл как-то то попадает в базу, то нет.

В общем буду сам копаться, или просто оставлю ограничение в 400 килобайт.
В любом случае спасибо за помощь.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Varbinary(Max) разрешает занести только 400кб / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]