Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Задолбало! Type mismatch :(


Автор: neutrino 27.7.2004, 19:11
Приветствую!

Я пишу фотоальбом в ASP на VBscript. Почти закончил - осталось сделать закачку фотографий на сервер. Для этих целей сделал вот такой скрипт:
Код

....
html code
....

<%

set o = new clsUpload

if o.Exists("cmdSubmit") then
'get client file name without path
'sFileSplit = split(o.FileNameOf("txtFile"), "\")
'sFile = sFileSplit(Ubound(sFileSplit))

o.FileInputName = "txtFile"

Set Conn = Server.CreateObject("ADODB.Connection")

With Conn
 .Provider = "Microsoft.Jet.OLEDB.4.0"
 .ConnectionString = "Data Source=" & Server.MapPath ("..\data.mdb")
 .Open()
End With

Set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open "SELECT * from Photos", Conn, 1, 3

Rs.AddNew
FileIdx = Rs("phID") 'Autonumber
o.FileFullPath = Server.MapPath("..") & "\photos\" & FileIdx & ".jpg" 'sFile
o.save

if o.Error = "" then
 'File uploaded successfully, add database record:
 Rs("phName") = o.ValueOf("PhotoNameEdit")
 Rs("phDescription") = o.ValueOf("PhotoDescEdit")
 Rs("phTopic") = cat_id
 Rs("phDate") = "#" & o.ValueOf("PhotoDateEdit") & "#"
 Rs.Update
 
 response.write "Success. File saved to  " & o.FileFullPath & "<br>"
 response.write "Photo Name=" & o.ValueOf("PhotoNameEdit") & "<br>"
 response.write "Photo Description=" & o.ValueOf("PhotoDescEdit") & "<br>"
 response.write "Photo Date=" & o.ValueOf("PhotoDateEdit") & "<br>"
else
 Rs.Close
 Rs.Open "SELECT * from Photos WHERE (phID=" & FileIdx & ")", Conn, 1, 3
 if not rs.EOF then Rs.Delete
 Rs.Close
 response.write "Failed due to the following error: " & o.Error
end if
set Rs = nothing
end if
set o = nothing
%>

clsUpload - класс для закачки, написанный на VB. Закачка фоток работает отлично. Но запись в базе данных не обновляется. Все время пишет ошибку в строках:
Код

 Rs("phName") = o.ValueOf("PhotoNameEdit")
 Rs("phDescription") = o.ValueOf("PhotoDescEdit")
 Rs("phTopic") = cat_id
 Rs("phDate") = "#" & o.ValueOf("PhotoDateEdit") & "#"
 Rs.Update


[/quote]
Microsoft VBScript runtime error '800a000d'

Type mismatch: 'rs'

/webtech/neutrino/database/forms/uploadphoto.asp, line 135

[quote]

В чем может быть дело?

Спасибо!

Автор: neutrino 27.7.2004, 19:23
Извините, писал в порыве гнева и забыл про несколько аспектов:
База данных - MS ACCESS
Метод o.ValueOf() - возвращает содержимое некоторых полей. Т.е. тип - строка.

Я пытался просто присвоить:
RS("phName") = "test"
Тоже не работает, хоть и в БД тип поля - Text.

Автор: cardinal 27.7.2004, 19:37
Попробуй написать
Код
RS!phName = "test"

или сделать что-нибудь по типа
Код
Rs("phName") = CStr(o.ValueOf("PhotoNameEdit"))

Ни в чем что написал не уверен, но гляди поможет. Еще посмотри здесь:
http://forum.vingrad.ru/index.php?showtopic=22447
http://forum.vingrad.ru/index.php?showtopic=6018
http://forum.vingrad.ru/index.php?showtopic=20694
adv/hello.gif

Автор: neutrino 27.7.2004, 20:51
Ни первый, ни второй вариант не прошел.
Вот посмотри: http://brd92.ort.org.il/webtech/neutrino/database/index.asp?username=neutrino
Нажми на любую категорию и попробуй добавить картинку.

Спасибо!
Добавлено @ 20:56
Если тебе поможет могу кинуть в приват мой логин на сервер. Если надо будет посмотреть сами скрипты.

Автор: cardinal 28.7.2004, 08:51
Попробовал и ничего не получилось smile.gif

Спроси в разделе VB лучше, гляди чего подскажут.

Автор: boevik 28.7.2004, 09:51
neutrino, какая строка это 135?

И в качестве улучшения кода (tip):
Замени SQL "SELECT * from Photos" на "SELECT * from Photos WHERE 1=2"
а то когда таблица разрастется, твой select будет подтормаживать.

Автор: neutrino 28.7.2004, 12:09
Цитата(boevik @ 28.7.2004, 08:51)
neutrino, какая строка это 135?

Код
135: Rs("phName") = o.ValueOf("PhotoNameEdit")
136: Rs("phDescription") = o.ValueOf("PhotoDescEdit")
137: Rs("phTopic") = cat_id
138: Rs("phDate") = "#" & o.ValueOf("PhotoDateEdit") & "#"
139: Rs.Update

Неважно, на простое присваивание Rs("phDescription")="траляля", точно так же ругается.
Добавлено @ 12:11
Цитата

И в качестве улучшения кода (tip):
Замени SQL "SELECT * from Photos" на "SELECT * from Photos WHERE 1=2"
а то когда таблица разрастется, твой select будет подтормаживать.


Не понял ... Это же всегда будет FALSE ...

Автор: boevik 28.7.2004, 13:30
Непонятки какие то с твоим кодом, вроде всё написано правильно.
Единственное могу предложить поменять на Conn.Execute "INSERT INTO ...."

Цитата
Не понял ... Это же всегда будет FALSE ...

Вот именно. Для чего ты делаешь select?
На сколько я вижу только для того что б добавить новую запись.
Что произойдет при твоём selecte?
Вся таблица скопируется в рекордсет. Если таблица большая то это займет время.
А теперь подумай, нужна ли тебе таблица в рекордсете.

При моем запросе (условие всегда не верно) в рекордсет не зайдет ни единой записи, но при этом рекордсет получит всю информацию о строении таблицы. То что нам и надо.

Автор: neutrino 28.7.2004, 18:44
Цитата

Вот именно. Для чего ты делаешь select?
На сколько я вижу только для того что б добавить новую запись.
Что произойдет при твоём selecte?
Вся таблица скопируется в рекордсет. Если таблица большая то это займет время.
А теперь подумай, нужна ли тебе таблица в рекордсете.


Спасибо, что-то я сам не догнал.

Автор: neutrino 28.7.2004, 19:43
Проблема в том, что у меня первое поле - autonumber. Я его использую как имя для файла, который закачивается поэтому я сначала добавляю запись, потом считываю это поле и сщхраняю файл под таким именем. Если будет запрос "INSERT ...", то я не смогу узнать этот авто-номер.

Автор: neutrino 29.7.2004, 00:22
ХЕРНЯ ЭТО ;%:*:%? ПРОГРАММИРОВАНИЕ БАЗ ДАННЫХ :?:* МАТЬ ИХ!!!!

Я уже все попробовал. Ничего не идет. Последнее, что сделал:
Код

set o = new clsUpload

if o.Exists("cmdSubmit") then
o.FileInputName = "txtFile"

Set Conn = Server.CreateObject("ADODB.Connection")

With Conn
 .Provider = "Microsoft.Jet.OLEDB.4.0"
 .ConnectionString = "Data Source=" & Server.MapPath ("..\data.mdb")
 .Open()
End With

Set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open "SELECT * from Photos WHERE 2=1", Conn, 1, 3

Здесь я получаю этот номер и закрываю рекордсет. Это работает, я проверил - в базу добавляется новая пустая запись только с авто-номером.
'Gen an autonumber
Rs.AddNew 'Add blank record
FileIdx = Rs("phID") 'Get new Autonumber
Rs.Update
Rs.Close

o.FileFullPath = Server.MapPath("..") & "\photos\" & FileIdx & ".jpg" 'sFile
'o.save

if o.Error = "" then
 'File uploaded successfully, add database record:
 SqlUpdate = "UPDATE Photos SET " & _
  "Photos.phName = """ & o.ValueOf("PhotoNameEdit") & """, " & _
  "Photos.phDescription = """ & o.ValueOf("PhotoDescEdit") & """, " & _
  "Photos.phTopic = " & cat_id & ", " & _
  "Photos.phDate = """ & o.ValueOf("PhotoDateEdit") & """ " & _
  "WHERE (Photos.phID=" & FileIdx & ")"
 response.Write SqlUpdate & "<br>"
 Conn.Execute SqlUpdate ' LINE 146 is HERE !!!!!!!
else
 response.write "Failed due to the following error: " & o.Error
end if
set Rs = nothing
set Conn = nothing
end if
set o = nothing


И что вы думаете? Это мне вывело такую ошибку (я уже видел по моему их всех):
Цитата

Microsoft JET Database Engine error '80040e07'

Data type mismatch in criteria expression.

/webtech/neutrino/database/forms/uploadphoto.asp, line 146


Такое ощущение, что глючит галимый движок БД.

Автор: boevik 29.7.2004, 07:57
neutrino, давай начнем разбираться.
1. Покажи структуру таблицы
2. Приведи содержание переменой SqlUpdate
3. Обычно для стрингов использую одну кавычку (апостроф " ' ")

Автор: neutrino 29.7.2004, 21:06
ОК.
1.
Таблица Photos:
Цитата

Field name      | Field type
------------------------------------
phID              | Autonumber
phName          | Text
phDescription |  Memo
phTopic          | Number
phDate          | Date/Time

2.
Результат команды response.Write SqlUpdate & "<br>"
Код

UPDATE Photos SET Photos.phName = "ass", Photos.phDescription = "ass ddd", Photos.phTopic = 2, Photos.phDate = "2.3.2001" WHERE (Photos.phID=48)


3. По правилам SQL неважно апостроф или двойные кавычки, но после всего и это проверю.

Автор: boevik 1.8.2004, 07:50
neutrino, из всего что я вижу мне не нравится формат даты.
Попробуй поставить дату в формате mm/dd/yyyy и объзательно между решетками (знак #).
Код
UPDATE Photos SET Photos.phName = "ass", Photos.phDescription = "ass ddd", Photos.phTopic = 2, Photos.phDate = #3/2/2001# WHERE (Photos.phID=48)


Автор: neutrino 1.8.2004, 10:52
Да, но он выводит, что ошибка в условии:
Цитата

Data type mismatch in criteria expression.


Да и решетки я пробовал ... вот только вместо слэшей точки были. Попробую твой вариант.

Автор: neutrino 1.8.2004, 11:07
boevik
Емае! Вот это гон!!! Все работает smile.gif

Премного благодарен.

Спасибо!!!!

Автор: boevik 1.8.2004, 11:10
Цитата
Да, но он выводит, что ошибка в условии

Видел, видел. Но в чем у него проблема понять не могу.

А напрямую в Аксесе этот SQL проходит?

Автор: neutrino 1.8.2004, 11:19
Да, у меня проходил с решетками, но вместо слэшей - точки.

Автор: cardinal 1.8.2004, 21:57
neutrino, видишь, я же знал, что тебе здесь помогут. thumbs-up.gif

Автор: arilou 2.8.2004, 21:16
Цитата(neutrino @ 1.8.2004, 11:19)
Да, у меня проходил с решетками, но вместо слэшей - точки.

Привет,

Почитал ветку форума, и вот, что мне это навеяло. Твой код не будет работать в том случае, если на сервере указан другой формат даты. Поэтому, предлагаю использовать параметрические запросы, типа

Код
INSERT INTO tbl1(f1, f2) VALUES(?, ?)


А параметры передавать через Command.Parameters

Вот.

Автор: neutrino 2.8.2004, 22:00
arilou
Спасибо. Ну это в следуюшей версии.

cardinal
Спасибо!

Автор: cardinal 2.8.2004, 23:53
Не за что! thumbs-up.gif

Автор: boevik 3.8.2004, 07:21
Цитата
Твой код не будет работать в том случае, если на сервере указан другой формат даты.

Неверно.
При использовании SQL statment нет зависимости от формата даты сервера. Дату надо указывать всегда в американском формате mm/dd/yyyy

При использовании Command.Parameters дата должна подаваться в формате компа на котором создается Command.Parameters.

Автор: arilou 3.8.2004, 12:03
Цитата(boevik @ 3.8.2004, 07:21)
Цитата
Твой код не будет работать в том случае, если на сервере указан другой формат даты.

Неверно.
При использовании SQL statment нет зависимости от формата даты сервера. Дату надо указывать всегда в американском формате mm/dd/yyyy

При использовании Command.Parameters дата должна подаваться в формате компа на котором создается Command.Parameters.

Не согласен.
Не один раз встречал проблему с датой в Access. Даже при указывании оной в американском формате, при запуске не других машинах не работает.
Что касается Command.Parameters, дату надо передавать не строкой, а объектом типа Date, соответственно, не важно, в каком она формате. Для избежания проблем с спец. символами и форматами даты и следует использовать Command.Parameters.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)