Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование (VB,C#,ASP,.NET): новости, советы, примеры



Выпуск # 316


http://www.kbyte.ru/

 

Новый выпуск!

Доброе время суток!
Меня зовут R-KDR-19826, представляю Вам очередной выпуск рассылки Kbyte.Ru!

 

Содержание выпуска

Система ЭКСПЕРТ

    Вопрос #000952: Обработка файлов в C# (.NET 2.0)

    Вопрос #000947: Секундомер

    Вопрос #000937: DLOOKUP??

    Вопрос #000935: VB работа с веб-камерой

    Вопрос #000929: MsgBox с двумя кнопками

Последнее на форумах

    Подработка

    Что действует на Вас деградирующе

    Простой Excel

    Сохранение текста в текстовы файл

    Вернуть объект из базы

Последние статьи

    Нестандартная форма

    Как узнать размер базы данных MySQL через php

    Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)

    Работа с SQL – Запросы

    Использование XML.Serialization

Интересные коды и решения

Юмор на Kbyte.Ru

 

Система ЭКСПЕРТ

 

Система «Эксперт» - уникальная система, которая поможет решить, если не все, то многие Ваши проблемы с программированием и разработкой! Если у Вас есть какой-либо вопрос по программированию или разработке, то Вы всегда можете задать его нашим Экспертам! При этом каких-либо особых действий от Вас не потребуется! Просто отправьте Ваш вопрос на адрес mailto:expert@kbyte.ru, в теме письма укажите тему вопроса, в тексте – сам вопрос, и все! Эксперты дадут Вам ответ в течение 12-24 часов, на тот адрес, с которого Вы отправите вопрос. Все проще простого! Никакой регистрации и заполнение бесконечных форм, просто спросите и получите ответ ;-)


Вопрос #000952: Обработка файлов в C# (.NET 2.0)

Автор вопроса: Сергей // 09.05.2008 / 18:07

Доброе время суток!
В общих словах, такая задача поставлена передо мной: На веб-странице
пользователь выбирает файл, нажимает кнопку "Импорт" и из этого файла
данные импортируются в таблицу БД Oracle.
Файл должен быть текстовым, первые 2 строки- информация о времени и
логине того, кто выгружал. После них идут строки данных, поля
разделяются симоволом | .
Просьба дать ссылки на документацию по работе с файлами, которые могут
помочь :-)

Отвечает: Алексей Немиро // 12.05.2008 / 10:34

Здравствуйте, Сергей.

Необходимые классы и функции для работы с файлами лежак в пространстве имен System.IO. Также Вам могут понадобиться классы для работы с регулярными выражениями, которые лежат в пространстве имен System.Text.RegularExpressions.
Что касается импорта файлов, то данные можно взять прямо из потока FileUpload.PostedFile.InputStream, передать их в StreamReader и обработать при помощи регулярных выражений.

--
С наилучшими пожеланиями,
Немиро Алексей http://aleksey.nemiro.ru/

 

Вопрос #000947: Секундомер

Автор вопроса: Александр // 08.05.2008 / 17:40

Добрый день!
Как сделать секундомер на сайте kbyte.ru много но вот все они выдают результат как 345сек, а мне надо 1:45:01 то есть в временом формате. Как сделать???

.....

Отвечает: Алексей Немиро // 09.05.2008 / 08:29

Здравствуйте, Александр.

Зная, что в минуте 60 секунд, в часе 60 минут, а в сутках 24 часа, можно легко превратить 345 секунд в нужный формат.
001:
002:
003:
004:
005:
006:
007:
008:
009:
Dim sec As Integer
sec = 345
Dim ssec As Integer, min As Integer, hour As Integer
If sec > 59 Then
 min = Int(sec / 60)
 ssec = sec Mod 60
End If
If min > 59 Then hour = Int(min / 60)
MsgBox sec & " сек. = " & hour & " ч. " & min & " мин. " & ssec & " сек."



--
С наилучшими пожеланиями,
Немиро Алексей http://aleksey.nemiro.ru/

 

Вопрос #000937: DLOOKUP??

Автор вопроса: Алексей // 05.05.2008 / 16:37

Почему те поля формы, которые имеют в ControlSource функцию Dlookup не записывают значение полей в конечную таблицу?

--------------------------------------
Категория: --- MS Access

Отвечает: Алексей Немиро // 06.05.2008 / 05:24

Здравствуйте, Алексей.

Из справки MS Access: Функция Dlookup
При использовании этой функции не учитываются
несохраненные изменения записей подмножества. Если функция
DLookup должна использовать измененные значения, необходимо сначала сохранить
изменения с помощью команды Сохранить запись в меню
Записи, с помощью перемещения фокуса на другую запись или
метода Update.


--
С наилучшими пожеланиями,
Немиро Алексей http://aleksey.nemiro.ru/

 

Вопрос #000935: VB работа с веб-камерой

Автор вопроса: Анна // 05.05.2008 / 02:35

Язык: Visual Basic 2008 Express Edition.
Подскажите, пожалуйста, как из приложения (Windows Form Application) получить доступ к вебкамере, а именно получить снимок в виде bitmap (отобразить его на форме или же сохранить как bmp-файл).
Заранее очень благодарна!
P.S. Просматривая архив вопросов я уже нашла некоторые решения возникавших у меня проблем - Спасибо огромное!

.....

Отвечает: Алексей Немиро // 05.05.2008 / 09:33

Здравствуйте, Анна.

Попробуйте воспользоваться этим классом

--
С наилучшими пожеланиями,
Немиро Алексей http://aleksey.nemiro.ru/

 

Вопрос #000929: MsgBox с двумя кнопками

Автор вопроса: Алекс // 01.05.2008 / 23:53

Есть поле со списком на форме, необходимо при выборе определенной позиции из списка вывести MsgBox и две кнопки на нем, при нажатии на которую, в другой TextBox всавлялся бы выбранный вариант ответа
Подскажите, как можно это сделать или в каком направлении копать??

--------------------------------------
Категория: --- MS Access

Отвечает: Алексей Немиро // 02.05.2008 / 04:09

Здравствуйте, Алекс.

001:
002:
003:
If MsgBox("Вставить?", vbQuestion Or vbYesNo) = vbYes Then
 '...
End If


--
С наилучшими пожеланиями,
Немиро Алексей http://aleksey.nemiro.ru/

 


Чтобы задать Ваш вопрос, отправьте его на адрес expert@kbyte.ru

Раздел Эксперт на сайте Kbyte.Ru

Наверх

 

 

Последнее на форумах

Подработка | Автор: Евгений
Добавлено: 26.05.2008 / 16:34 | ответов: 0 | просмотров: 24

Если кому интересно.
Ты можешь деньги зарабатывать объщаясь в форуме. за сообщение от 0.005 до 0.025 WMZ.
У меня почти 100 сообщений уже заработал 1.10 WMZ. Снимать можно минимум 1$.
Вот ссылка http://***
Будешь моим рефералом, тебе от этого нечего плохово, а мне бонус, Я этим бонусом с табой поделюсь.

--- Сообщение изменено Администратором, т.к. нарушает п. 1.10 правил форума Kbyte.Ru

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Что действует на Вас деградирующе | Автор: Arti
Добавлено: 25.05.2008 / 20:01 | ответов: 2 | просмотров: 49

На меня следующее, с учетом того что алкаголь и табак не употребляю:
1. Музыка.
2. Новости, в частности канал "Вести"
3. Юмористические передачи (в общем телевизор в целом, дальше продолжать не буду).
4. Молоко. (сам не знаю почему, может и бред, но после него включается мозговой тормоз и хочется спать) :(
5. Женщины. (пудрят мозги прибегая к разным сложным алгоритмам бесструктурного управления)
:(

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Алексей
Добавлено:26.05.2008 / 12:52
с учетом того что алкаголь и табак не употребляю

+1 :)

1. Музыка.

не слушаю, мешает работать
2. Новости, в частности канал "Вести"

Телевизор? Вечером полезно, можно отдохнуть :)
3. Юмористические передачи (в общем телевизор в целом, дальше продолжать не буду).

обычно тоже вечером, и по выходным. Полезно иногда.
4. Молоко.

Пейте дети молоко, будете здоровы! Я уже не пью, вследствие чего, недавно в организме закончились запасы кальция и стали ломаться зубы :)
5. Женщины. (пудрят мозги прибегая к разным сложным алгоритмам бесструктурного управления)

Это их любимое занятие. Можно сделать вид, что ты их слушаешь, настроить свой мозг на несколько ключевых слов, на которые автоматом реагировать, а остальное в игнор :)

6. Погода.
7. Еда, любая. Как поел, так работа не прёт.
8. Форум, аська и прочие чаты. Стоит одним глазом посмотреть в их сторону, и всё, работа не прёт.
8.5. Одноклассники.Ру :-)
9. Спам! Часто отвлекает, иногда я даже забываю, чем занимался, пока все посмотрю и удалю (у меня 15 рабочих майлов).

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: EROS
Добавлено:27.05.2008 / 19:36
5. Женщины

Ууууу ... а вот это уже настораживает! Друг, ты меня пугаешь!!

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Простой Excel | Автор: DemonX
Добавлено: 25.05.2008 / 14:57 | ответов: 0 | просмотров: 36

Хочу написать прогу простеньки Microsoft Excel. Просто создать таблицу забитьеё и сохранить. Проблема в том,что я немогу создать таблицу графически.

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Сохранение текста в текстовы файл | Автор: DemonX
Добавлено: 25.05.2008 / 12:04 | ответов: 3 | просмотров: 92

У меня проблема пишу прогу, нужно штобы она информацию из TextBox'а сохраняля в тектсовый файл.
Если можно, то подробно опишите эту процедуру.

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Neco
Добавлено:25.05.2008 / 12:18
всё зависит от множества факторов - простейший путь:
001:
002:
003:
System.IO.File.WriteAllText("file", "content");

Colorized by: Eros.CodeSyntaxColor Engine

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: DemonX
Добавлено:25.05.2008 / 12:57
Например?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: Neco
Добавлено:25.05.2008 / 13:44
пардон - оказывается вопрос в разделе vb6
там что-то вроде
001:
002:
003:
004:
005:
006:
007:
Dim nfile As Integer
nfile= freefile
open "c:\1.txt" For output As #nfile
Print #nfile,textbox1.Text;
close #nfile

Colorized by: Eros.CodeSyntaxColor Engine

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Вернуть объект из базы | Автор: Arti
Добавлено: 25.05.2008 / 06:04 | ответов: 27 | просмотров: 450

Здравствуйте, есть класс для проверки пользователя в базе данных. Он ищет наличие совпадение по логину и паролю если находит то возвращает True, вопрос заключается в том что можноли как-то возвратить из функции (базы) объект "Пользователь" со всеми его атрибутами, т.е наверно в самой функции нужно объявить объект "Пользователь", а потом каждому его свойству задать соответствующие значения из найденной строки и вернуть. Как это можно сделать через OleDBReader или DataReader или ещё чем, вобщем запутался окончательно что для чего и как этим правильно пользоваться :(

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Arti
Добавлено:25.05.2008 / 08:54
Посмотрите что имеетя сейчас, в комментариях все написано
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
Public Function PoluchitUsera(ByVal UserName As String, ByVal UserPassword As String) As User
    Dim User As New User
    ' Подключаемся к базе
    Dim OleConnection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Users.accdb")
    OleConnection.Open()
    Try
      ' Делаем командоса
      Dim OleCommand As New OleDbCommand
      ' показываем какое подключение надо использовать
      OleCommand.Connection = OleConnection
      ' задаем строку с инструкциями
      OleCommand.CommandText = "SELECT User_ID FROM UsersList " & "WHERE UserName='" & UserName & "' AND UserPass='" & UserPassword & "'"
      ' присваиваем объекту "Пользователь" UID
      User.UID = OleCommand.ExecuteScalar
      ' А вот дальше как делать? Так же неправильно наверно 
      'OleCommand.CommandText = "SELECT UserName FROM UsersList " & "WHERE UserName='" & UserName & "' AND UserPass='" & UserPassword & "'"
      'User.FirstName = OleCommand.ExecuteScalar()
      ' и т д. для каждого свойства объекта User делать новый запрос
    Catch oEx As Exception
      _ConnectionStatus = oEx.Message
    End Try
    ' проверяем прошел ли пользователь проверку
    If User.UID = Nothing Then
      Return Nothing
    Else
      Return User
    End If
  End Function

Colorized by: Eros.CodeSyntaxColor Engine

т.е. как сделать так чтобы не выполнять для каждого свойства объекта User новый запрос :(

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: Neco
Добавлено:25.05.2008 / 09:21
во-первых, используй параметры, а не склеивание запроса
001:
002:
003:
OleCommand.CommandText = "SELECT * from some_table where id=:id"

Colorized by: Eros.CodeSyntaxColor Engine

не знаю как в ole указывается параметр - написал ":" как у оракла, но возможно, что "@" как у сиквела.

далее, если пара username&userpass у тебя в таблице является уникальной (есть constraint), то можно работать через datareader
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
cmd.commandtext = "select * from userslist where userid=:userid and userpass=:userpass"
cmd.parameters.add("userid",varchar).value = userid
cmd.parameters.add("userpass",varchar).value = userpass
Dim rdr As oledatareader = cmd.executereader()
If (rdr.read())
Dim user As New myuser
user.id = to_int(rdr("id"))
user.name = to_str(rdr("name"))
user.description = to_str(rdr("desription"))
Else
Throw New myexception("no such user/pass")
End If

Colorized by: Eros.CodeSyntaxColor Engine


третье - в базе лучше хранить хэш пароля с подсаливанием username+constant.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: Neco
Добавлено:25.05.2008 / 09:57
да, и пара советов:
1. лучше приучиться использовать using везде, где возможно. в приведённом тобой примере ты открыл соединение и не закрыл.
2. надо понять как пользоваться исключениями. по-моему:
001:
002:
003:
004:
005:
Catch oEx As Exception
   _ConnectionStatus = oEx.Message
  End Try

Colorized by: Eros.CodeSyntaxColor Engine

и
001:
002:
003:
004:
005:
006:
007:
If User.UID = Nothing Then
   Return Nothing
  Else
   Return User
  End If

Colorized by: Eros.CodeSyntaxColor Engine

только усложняют всё дело. процесс авторизации подразумевает два результата - либо юзер авторизован, либо нет. если авторизован, то выполняем следующие шаги, ну если не авторизован (неважно какая причина - неправильный пароль, база умерла, сетка накрылась, памяти не хватило), то это ошибка и надо донести её до "верхов". лучше всего это делать через exception, а не через результаты функции.
к примеру, ты сделал свою функцию с возможным возвратом null'а. тут сразу подразумевается, что использоваться функция будет как-то так:
001:
002:
003:
004:
005:
006:
007:
If (poluchitusera(param) IsNot Nothing) Then
' good!
Else
' а что здесь? почему nothing? база умерла? неправильный пароль? чтобы ответить на этот вопрос надо смотреть исходники.
End If

Colorized by: Eros.CodeSyntaxColor Engine

а если всё делать через исключения, то не надо никакой условной логики при использовании метода.

участок
001:
002:
003:
004:
005:
Catch oEx As Exception
   _ConnectionStatus = oEx.Message
  End Try

Colorized by: Eros.CodeSyntaxColor Engine

тоже меня смущает, ибо - зачем?
потом будет какой-то интелектуальный код по анализу _ConnectionStatus? а если предположить, что код формы находится от данной процедуры в пятидесяти вызовах методов, то как передать этот _ConnectionStatus в MessageBox.Show(Message)? а если пользователю станет мало Message - он захочет посмотреть CallStack? Ибо, если Message будет Not enough memory, то вообще ничего не будет понятно.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 4 | Автор: Arti
Добавлено:25.05.2008 / 12:30
Спасибо за подробный пример. Написал класс и метод добавления пользователя в базу
вот код посудите немного.
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms

Public Class AccessData

  ' Поставщик данных
  Private _DataProvider As String
  ' Источник
  Private _DataSource As String
  ' Статус подключения
  Private _ConnectionStatus As String
  ' ошибка базы данных
  Private _DataBaseErrorMessage As String

  ''' <summary>
  ''' Получаем поставщика данных
  ''' </summary>
  ''' <value></value>
  ''' <remarks>Например для Access 2007 (Microsoft.ACE.OLEDB.12.0) для старых версий (Microsof.Jet.OleDb.4.0)</remarks>
  Public WriteOnly Property DataProvider() As String
    Set(ByVal value As String)
      _DataProvider = "Provider=" & value
    End Set
  End Property

  ''' <summary>
  ''' Путь к фалу данных
  ''' </summary>
  ''' <value></value>
  ''' <remarks>Например D:\MyBase.accdb</remarks>
  Public WriteOnly Property DataSource() As String
    Set(ByVal value As String)
      _DataSource = ";Data Source=" & value
    End Set
  End Property

  ''' <summary>
  ''' Смотрим что у нас там с подключением
  ''' </summary>
  ''' <value></value>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Public ReadOnly Property ConnectionStatus() As String
    Get
      ConnectionStatus = _ConnectionStatus
    End Get
  End Property

  Public ReadOnly Property DataBaseErrorMessage() As String
    Get
      DataBaseErrorMessage = _DataBaseErrorMessage
    End Get
  End Property

  Public Sub New()
  End Sub
  ''' <summary>
  '''
  ''' </summary>
  ''' <param name="Provider">Microsoft.ACE.OLEDB.12.0 или Microsof.Jet.OleDb.4.0</param>
  ''' <param name="Source">D:\MyBase.accdb или D:\MyBase.mdb</param>
  ''' <remarks></remarks>
  Public Sub New(ByVal Provider As String, ByVal Source As String)
    _DataProvider = "Provider=" & Provider
    _DataSource = ";Data Source=" & Source
  End Sub

  ' делаем уничтожитель


  Public Sub RegisterUser(ByVal UserName As String, ByVal UserPass As String, ByVal FirstName As String, ByVal LastName As String)
    ' создаем подключение
    Dim OleConnection As New OleDbConnection(_DataProvider & _DataSource)
    Dim OleCommand As New OleDbCommand
    Try
      OleConnection.Open()
      ' Пишем в переменную класса результат подключения
      _ConnectionStatus = OleConnection.State.ToString

      OleCommand.CommandText = "INSERT INTO UsersList (UserName, UserPass, FirstName, LastName) VALUES (@UserName, @UserPass, @FirstName, @LastName)"
      OleCommand.Parameters.Add("UserName", OleDbType.VarChar).Value = UserName
      OleCommand.Parameters.Add("UserPass", OleDbType.VarChar).Value = UserPass
      OleCommand.Parameters.Add("FirstName", OleDbType.VarChar).Value = FirstName
      OleCommand.Parameters.Add("LastName", OleDbType.VarChar).Value = LastName
      OleCommand.Connection = OleConnection
      OleCommand.ExecuteNonQuery()
      OleConnection.Close()
      ' Пишем в переменную класса результат подключения
      _ConnectionStatus = OleConnection.State.ToString
    Catch err As Exception
      _DataBaseErrorMessage = err.Message
    Finally
      OleCommand.Dispose()
      OleConnection.Dispose()
    End Try
  End Sub
End Class

Colorized by: Eros.CodeSyntaxColor Engine


Если не затруднит ответьте ещё на пару вопросов, как лучше сделать проверку на наличе уже существующего пользователя(сейчас в базе поле UserName стоит как "Совпадения не допускаются") в случае такой ошибки в базе, уведомление можно получить через свойство DataBaseErrorMessage.
По поводу
лучше приучиться использовать using
как тогда сделать мой класс Disposable пример из MSDN не помог?
лучше хранить хэш пароля с подсаливанием username+constant
а вот это для меня совсем темный лес если не трудно расскажите как это дело реализовать и как работать потом с такими паролями?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 5 | Автор: Neco
Добавлено:25.05.2008 / 13:23
делать класс disposable надо через реализацию интерфейса IDisposable.
но критично важно это только, если ты используешь неуправляемые ресурсы, если же всё управляемое, то можно и using даже не использовать и Dispose никогда не вызывать - среда рано или поздно сама начнёт вызывать финализаторы, а те в свою очередь Dispose методы. Но чем раньше высвобождаешь, тем лучше.
вообще, лучше стремиться к тому, чтобы не объявлять у своих классов поля, которые требуют dispose и инстанцируются внутри твоего класса - это усложняет разрушение. в методах Dispose как правило преобладают тупые If m_conn isnot nothing then m_conn.dispose и про них несложно забыть.
стремление к этому достигается за счёт того, чтобы использовать некий объект с Dispose только внутри метода - создал, разрушил.
у тебя все эти условия соблюдаются: у тебя в полях одни только string, значит тебе не нужно реализовывать IDisposable; все использования классов с Dispose в рамках одной процедуры.

использование в примере Try не вполне верное. предположим в строке 074 произойдёт ошибка - когда в этом случае закроется Connection?
по-моему, самый правильный способ (сам для себя решил - точных выдержек у авторитетных источников не помню), такой
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
OracleConnection conn = null;
      OracleCommand cmd = null;
      try {
        conn = new OracleConnection();
        cmd = new OracleCommand();
        // work;
      } finally {
        if (conn != null) conn.Dispose();
        if (cmd != null) cmd.Dispose();
      }

Colorized by: Eros.CodeSyntaxColor Engine

инициализация с null нужна, чтоб компилятор не пел нам про то, что мы неинициализированную переменную можем использовать.
тут две хреновости, по крайней мере - многа букафф и никто не запрещает нам продолжать использовать conn и cmd после этого блока, хотя это гарантированно приведёт к ошибке выполнения.
теперь пример с using:
001:
002:
003:
004:
005:
006:
007:
using (OracleConnection conn = new OracleConnection()) {
        using (OracleCommand cmd = new OracleCommand()) {
          // work;
        }
      }

Colorized by: Eros.CodeSyntaxColor Engine

и букв мало и scope жёсткий.

проверку существования имени пользователя - я бы сделал тупо пытаясь вставить, база бы ругалась с указанием имени constraint'а, я бы перехватывал это сообщение и переводил его на пользовательский язык.
я уже так делал на реальной системе - все OracleException, какие часто попадаются (остальные выводил в оригинальном виде), я перехватывал, смотрел на номер ошибки, если это был constraint'овый, то я в тексте ошибки пытался искать названия constraint'ов (длинющий такой список с if'ами получился) и если что-то находил, то перепаковывал в новый exception с более человечным названием и толкал исключение дальше к верху. хотя вся эта штука у меня была уже довольно близко к "поверхности" и там пости сразу просто message показывался юзеру и всё.
в результате "unique constraint UQ_USERNAME" превращался в "Пользователь с таким именем существует" или типа того.

сразу хочу предупредить, что проверять перед вставкой select'ом не вполне правильно по той причине, что может происходить множество вставок в одно и то же время и получится так:
1. юзер1 проверяет имя "вова" и не находит в базе
2. юзер2 проверяет имя "вова" и тоже не находит в базе
3. юзер2 вставляет имя "вова" в базу и фиксирует транзакцию (стуки-стуки)
4. юзер1 вставляет имя "вова" и обламывается.

т.е. как не проверяй - всё равно существует вероятность получить оригинальный текст ошибки - т.е. фактически на одну и ту же логическую ошибку получаем два вида ошибок - один свой, другой от БД.

по хэшу, делаю так, хотя может и не совсем правильно, но мне хватает:
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
public static string MD5Hash(string data, string salt)
    {
      using (MemoryStream ms = new MemoryStream(Encoding.default.GetBytes(data + (785).ToString() + salt + (159).ToString())))
      {
        MD5 md = MD5.Create();
        return Convert.ToBase64String(md.ComputeHash(ms));
      }
    }

Colorized by: Eros.CodeSyntaxColor Engine

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 6 | Автор: Arti
Добавлено:25.05.2008 / 18:11
предположим в строке 074 произойдёт ошибка - когда в этом случае закроется Connection?

с Using-ом не врубился, если в блок Try и в его конец End Using тогда опять же если в 074 строчке ошибка то до End Using дело не дойдет, вобщем не совсем понял если не трудно покажите на примере моего кода.
Ну а если без Nothing тогда вот так
001:
002:
003:
004:
005:
006:
Finally
      If Me.ConnectionStatus = "Open" Then OleConnection.Close()
      OleConnection.Dispose()
      OleCommand.Dispose()

Colorized by: Eros.CodeSyntaxColor Engine

или тогда смысла нету, лучше через Nothing?
проверку существования имени пользователя - я бы сделал тупо пытаясь вставить, база бы ругалась с указанием имени constraint'а, я бы перехватывал это сообщение и переводил его на пользовательский язык.

вот это действительно задача не простая, во вложении пример того что возвращает база когда пытаемся создать уже существующего пользователя. Сразу попутный вопрос, как получать от базы коды ошибок а не разъяснение что там случилось чтобы потом проще было через Selec Case переводить на пользовательский язык.
по хэшу, делаю так, хотя может и не совсем правильно, но мне хватает:

а стоит ли его шифровать, если ни у кого из пользователей доступа к файлу базы данных не будет.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 7 | Автор: Neco
Добавлено:25.05.2008 / 19:21
если в 074 строчке ошибка то до End Using дело не дойдет

до end using'а дело дойдёт всегда - я же написал, что конструкция
001:
002:
003:
004:
005:
006:
007:
using (OracleConnection conn = new OracleConnection()) {
    using (OracleCommand cmd = new OracleCommand()) {
     // work;
    }
   }

Colorized by: Eros.CodeSyntaxColor Engine

это аналог конструкции
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
OracleConnection conn = null;
   OracleCommand cmd = null;
   try {
    conn = new OracleConnection();
    cmd = new OracleCommand();
    // work;
   } finally {
    if (conn != null) conn.Dispose();
    if (cmd != null) cmd.Dispose();
   }

Colorized by: Eros.CodeSyntaxColor Engine

только короче и с жёстко ограниченным scope'ом действия

Ну а если без Nothing тогда вот так
Finally
If Me.ConnectionStatus = "Open" Then OleConnection.Close()
OleConnection.Dispose()
OleCommand.Dispose()
или тогда смысла нету, лучше через Nothing?

не - чёт я тебя совсем запутал - юзай using'и не ошибёшся.

вот это действительно задача не простая, во вложении пример того что возвращает база когда пытаемся создать уже существующего пользователя. Сразу попутный вопрос, как получать от базы коды ошибок а не разъяснение что там случилось чтобы потом проще было через Selec Case переводить на пользовательский язык.

это зависит от провайдера, думаю - у оракла что-то было.

у меня sql 2005 возвращает
Cannot insert duplicate key row in object 'dbo.employee' with unique index 'IX_employee'.
The statement has been terminated.

т.е. имя constraint'а тоже указывается.

но вот номера ошибки что-то я не нашёл :)
у exception'а в Data есть какие-то поля, но это уже хождение по мукам...

ничего не поделаешь - придётся юзеру показывать что-то типа "ошибка БД", а в качестве деталей - вот это твоё сообщение (лучше его напрямую не показывать поскольку язык может отличаться от языка программы).

а стоит ли его шифровать, если ни у кого из пользователей доступа к файлу базы данных не будет.

это не шифрование - это хэширование. делается для того, чтобы даже если ты админ - всё равно не мог получить пароли пользователей. из хэша невозможно получить пароль обратно - только подбором (да и то - надо знать методы подсаливания).

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 8 | Автор: Arti
Добавлено:25.05.2008 / 19:44
до end using'а дело дойдёт всегда

Ну так до Finally тоже, наверно. Если через Using где тогда должен быть Catch чтобы перехватить исключение базы? Если для Вас не трудно пожалуйста на VB.NET потому как я начинающий, а с C# даже рядом не стоял :)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 9 | Автор: Neco
Добавлено:25.05.2008 / 20:06
а, ну я недосмотрел немного - оказывается там соединение открывается уже внутри блока try. это меняет дело в пользу того, что висеть открытое соединение не будет - но вот некие ресурсы могут инициализироваться во время выполнения конструктора - вот эти ресурсы и будут висеть пока эти объекты не уничтожит сборщик мусора.
важно понимание, что на участке
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
Dim OleConnection As New OleDbConnection(_DataProvider & _DataSource)
  Dim OleCommand As New OleDbCommand
  Try
   OleConnection.Open()
   ' Пишем в переменную класса результат подключения
   _ConnectionStatus = OleConnection.State.ToString

   OleCommand.CommandText = "INSERT INTO UsersList (UserName, UserPass, FirstName, LastName) VALUES (@UserName, @UserPass, @FirstName, @LastName)"
   OleCommand.Parameters.Add("UserName", OleDbType.VarChar).Value = UserName
   OleCommand.Parameters.Add("UserPass", OleDbType.VarChar).Value = UserPass
   OleCommand.Parameters.Add("FirstName", OleDbType.VarChar).Value = FirstName
   OleCommand.Parameters.Add("LastName", OleDbType.VarChar).Value = LastName
   OleCommand.Connection = OleConnection
   OleCommand.ExecuteNonQuery()
   OleConnection.Close()
   ' Пишем в переменную класса результат подключения
   _ConnectionStatus = OleConnection.State.ToString
  Catch err As Exception
   _DataBaseErrorMessage = err.Message
  Finally
   OleCommand.Dispose()
   OleConnection.Dispose()
  End Try

Colorized by: Eros.CodeSyntaxColor Engine

ошибка может произойти на строке Dim OleCommand As New OleDbCommand и метод OleCommand.Dispose() не выполнится.
насчёт catch - using нужен только для гарантированного уничтожения объектов. но по-моему в твоём коде все эти махинации с ex.message лишние и catch там и не нужен вовсе.

насчёт vb.net - ну не установлен он у меня дома. установлен тока c# да и тот express. :)
а с работы если буду писать - то на vb :)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 10 | Автор: Алексей
Добавлено:26.05.2008 / 12:33
сори, если не в тему, много написано, все не читал :)

Сразу попутный вопрос, как получать от базы коды ошибок а не разъяснение что там случилось чтобы потом проще было через Selec Case переводить на пользовательский язык.

001:
002:
003:
004:
005:
006:
007:
008:
Try
Catch ex As Exception
 MessageBox.Show(ex.Message)'уже все готово для пользователя :)
 'блоков Catch может быть много, можно обрабатывать любые исключения, подробности см. в MSDN
 'просто Exception - это универсальное исключение.
End Try

Colorized by: Eros.CodeSyntaxColor Engine


Finally
OleCommand.Dispose()
OleConnection.Dispose()
End Try

лиший код.
Обычно:
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
'try
Conn.Open()
Try
 Dim Cmd As New OleDbCommand("SELECT * FROM Table", Conn)
 '...
 '...
 '...
Catch
Finally
 'If Conn IsNot Nothing AndAlso Conn.State = ConnectionState.Open Then Conn.Close()
 If Conn.State = ConnectionState.Open Then Conn.Close()
End Try
'catch
'end try[c]
если через Using, то примерно так:
[c]
Try
 Using Conn As New OleDbConnection(_DataProvider & _DataSource)
   Dim Cmd As New OleDbCommand("SELECT * FROM Table", Conn)
   'соединение если откроется, то закроется в любом случае
 End Using
Catch
End Try

Colorized by: Eros.CodeSyntaxColor Engine

_ConnectionStatus = OleConnection.State.ToString

наверное, тогда лучше сделать глобальный Connection...

По Dispose:
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
Public Class ClassName
  Implements IDisposable

  Public Overloads Sub Dispose() Implements IDisposable.Dispose
   GC.SuppressFinalize(Me)
  End Sub

  Protected Overrides Sub Finalize()
   MyBase.Finalize()
  End Sub

  '...
  'любой другой код
  '...
  '...
End Class

Colorized by: Eros.CodeSyntaxColor Engine

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 11 | Автор: Arti
Добавлено:26.05.2008 / 13:34
Благодарю Алексей, как всегда приятно иметь с Вами дело. :)

Еще такой вот вопрос как правильно короче сделать такую запись
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
Do While ColReader.Read
      Product.Code = ColReader("PID")
      Product.MNN = ColReader("MNN")
      Product.TNLP = ColReader("TNLP")
      Product.Cost = ColReader("Cost")
      Product.CurentRest = ColReader("CurentRest")
      ProductList.Add(Product)
    Loop

Colorized by: Eros.CodeSyntaxColor Engine


вот так не получаеся :(
001:
002:
003:
004:
005:
006:
007:
008:
009:
Do While ColReader.Read
      ProuctList.AddRange(New Product() {Product.Code = ColReader("PID"), _
                        Product.MNN = ColReader("MNN"), _
                        Product.TNLP = ColReader("TNLP"), _
                        Product.Cost = ColReader("Cost"), _
                        Product.CurentRest = ColReader("CurentRest")})
Loop

Colorized by: Eros.CodeSyntaxColor Engine

при попытке запустить метод выдает следующее исключение
Unable to cast object of type 'System.Boolean' to type 'LeOrdinator.Product'.

P.S. ProductList = New List (Of Product), задача получить весь список товара из базы за один заход.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 12 | Автор: Алексей
Добавлено:26.05.2008 / 15:36
ProuctList.AddRange(New Product() {Product.Code = ColReader("PID"), _
Product.MNN = ColReader("MNN"), _
Product.TNLP = ColReader("TNLP"), _
Product.Cost = ColReader("Cost"), _
Product.CurentRest = ColReader("CurentRest")})

одновременно присвоить и добавить в бэйсике - никак :)
а в шарпе, и любом сишном языке, можно такое провернуть.
В данном случае бэйсик их пытается сравнить и получается либо True, либо False.

А что такое Product, зачем он тут? Он хранит последний загруженный продукт?

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 13 | Автор: Arti
Добавлено:26.05.2008 / 16:15
а в шарпе, и любом сишном языке, можно такое провернуть.

я так понимаю для таких случаев и придумали "=" "==" ???

Product это класс описывающий товар, задача в том чтобы запихать все товары из базы в List (Of Product), а дальше работать с ними.

Рабочий код
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
Imports System.Data.OleDb
Public Class DBWriterReader
  Implements IDisposable

  Private _CurentConnectStatus As String
  
  Private _ConnectString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\MUZ.mdb"

  Public ReadOnly Property CurentConnectStatus() As String
    Get
      CurentConnectStatus = _CurentConnectStatus
    End Get
  End Property

  Public Function DBGetList() As List(Of Product)
    Dim ProductList As New List(Of Product)
    Dim str As String = Nothing
    Dim Product As Product
    Try
      Using Connection As New OleDbConnection(_ConnectString)
        Using Commander As New OleDbCommand
          Connection.Open()
          _CurentConnectStatus = Connection.State.ToString
          Commander.Connection = Connection
          Commander.CommandText = "SELECT PID, MNN, TNLP, Cost, RestOfYear, CurentRest FROM List"
          Dim ColReader As OleDbDataReader = Commander.ExecuteReader
          Product = New Product
          Do While ColReader.Read
            Product.Code = ColReader("PID")
            Product.MNN = ColReader("MNN")
            Product.TNLP = ColReader("TNLP")
            Product.Cost = ColReader("Cost")
            Product.CurentRest = ColReader("CurentRest")
            ProductList.Add(Product)
          Loop
          Product.Dispose()
          Connection.Close()
          _CurentConnectStatus = Connection.State.ToString
        End Using
      End Using
    Catch ex As Exception
      MessageBox.Show(ex.Message)
    End Try
    Return ProductList
  End Function




  Public Overloads Sub Dispose() Implements IDisposable.Dispose
    GC.SuppressFinalize(Me)
  End Sub

  Protected Overrides Sub Finalize()
    MyBase.Finalize()
  End Sub

End Class

Colorized by: Eros.CodeSyntaxColor Engine

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 14 | Автор: Arti
Добавлено:26.05.2008 / 17:57
Блин накосячил
001:
002:
003:
Product = New Product

Colorized by: Eros.CodeSyntaxColor Engine
должно быть внутри цикла Do While ... Loop
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
Do While ColReader.Read
      Product = New Product
      Product.Code = ColReader("PID")
      Product.MNN = ColReader("MNN")
      Product.TNLP = ColReader("TNLP")
      Product.Cost = ColReader("Cost")
      Product.CurentRest = ColReader("CurentRest")
      ProductList.Add(Product)
     Loop

Colorized by: Eros.CodeSyntaxColor Engine

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 15 | Автор: Алексей
Добавлено:27.05.2008 / 04:20
я так понимаю для таких случаев и придумали "=" "==" ???

да, просто равно - это присваивание, а два равно - это сравнение.

"SELECT PID, MNN, TNLP, Cost, RestOfYear, CurentRest FROM List"

Все колонки перечислять не обязательно, особенно когда нужно получить их все, можно просто звездочку поставить:
SELECT * FROM List

ProductList.Add

можно сделать, чтобы метод Add принимал OleDbDataReader.

Product.Dispose()
Connection.Close()

это опять же лишний код, оно и так удалится и закроется.
Connection.Close()
_CurentConnectStatus = Connection.State.ToString

угадай с трех раз, какой будет Connection.State после Connection.Close :)
вообще, зачем этот CurentConnectStatus нужен, и зачем его в строку превращать?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 16 | Автор: Arti
Добавлено:27.05.2008 / 07:54
Понятно, по поводу ProductList.Add имеется ввиду путем наследования от List (of сделать свой метод Add ? _CurentConnectionStatus нужен чтобы из внешнего кода можно было через это свойство получить состояние подключения., т.е открыто идет запрос к базе пока он выполняется как выполнился подключение закрылось, идея была в этом.
Подскажите еще по такому вопросу в рамках этой темы, небходимо подсчитать остатки по товарам таблица List, из таблицы Movements(движения) и записать эти остатки в List.CurentRest, т.е. надо посмотреть в таблице Movement: код товара PID, тип операции OT, и количество QTT, затем сложить весь приход, весь расход по заданному PID, а разницу между приходом и расходом записать в List.CurentRest напротив соответствующего PID, как это все написать в командах SQL чтобы получить данные посчитать в программе, а потом записать в базу?
P.S. на всякий случай если не совсем понятен мой бред, база во вложении.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 17 | Автор: Алексей
Добавлено:27.05.2008 / 08:39
Понятно, по поводу ProductList.Add имеется ввиду путем наследования от List (of сделать свой метод Add ?

а, ProductList - это просто коллекция продуктов :) тогда это можно
в конструктор Product сделать, чтоб было что-то типа:
001:
002:
003:
004:
005:
006:
Do While ColReader.Read
 ProductList.Add(New Product(ColReader))
Loop

_______________________
Colorized by: Eros.CodeSyntaxColor Engine


как это все написать в командах SQL чтобы получить данные посчитать в программе, а потом записать в базу?

примерно так:
001:
002:
003:
004:
005:
006:
SELECT ((SELECT SUM(QTT) FROM Movements WHERE OT='in' AND PID=l.PID) - (SELECT SUM(QTT) FROM Movements WHERE OT='out' AND PID=l.PID)) AS TotalCount, *
FROM List AS l
WHERE l.PID = 10

_______________________
Colorized by: Eros.CodeSyntaxColor Engine


_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 18 | Автор: Arti
Добавлено:27.05.2008 / 11:21
Не получается, говорит отсутсвует значение для одного или нескольких требуемых параметров
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
Using Connection As New OleDbConnection(_ConnectString)
        Using cmd As New OleDbCommand
          Dim rdr As OleDbDataReader
          Connection.Open()
          cmd.Connection = Connection
          cmd.CommandText = "SELECT ((SELECT SUM(QTT) FROM Movements WHERE OT='in' AND PID=l.PID) - (SELECT SUM(QTT) FROM Movements WHERE OT='out' AND PID=l.PID)) AS TotalCount, * FROM List AS l WHERE l.PID = 10"
          rdr = cmd.ExecuteReader
          MessageBox.Show(rdr("TotalCount"))
        End Using
      End Using

Colorized by: Eros.CodeSyntaxColor Engine

:(

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 19 | Автор: Алексей
Добавлено:27.05.2008 / 11:28
rdr = cmd.ExecuteReader
MessageBox.Show(rdr("TotalCount"))

если мне не изменяет память, в Reader-е нужно вызвать Read, прежде, чем что-то читать.
rdr = cmd.ExecuteReader
If rdr.Read() Then MessageBox.Show(rdr("TotalCount").ToString())

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 20 | Автор: Arti
Добавлено:27.05.2008 / 11:40
Точно забыл про Reader, но суть от этого не изменяется, после rdr = cmd.ExecuteReader отсутсвует значение для одного или нескольких требуемых параметров далее в MessageBox остаток выводится правильный 15. :(

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 21 | Автор: Arti
Добавлено:27.05.2008 / 13:08
Короче затупил я очень сильно :) Забыл про вызов другого метода в коде, который и выдавал эту ошибку. Немного прогулялся и сразу нашел свой косяк. А я ещё думаю как это так и ошибку выдает и результат :))) вобщем полный ...

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 22 | Автор: Arti
Добавлено:27.05.2008 / 15:32
Не получается записать значение в таблицу List в столбик CurentRest соответствующего PID, SELECT возвращает два значения PID и результат вычисления, нужно записать результат вычисления соответствующему PID в таблице List(обе таблицы связаны этим столбиком), как правильно записать следующий запрос?
001:
002:
003:
UPDATE List SET CurentRest=(SELECT PID, SUM(QTT*IIF(OT='in',1,-1)) AS TotalCount FROM Movements GROUP BY PID)

Colorized by: Eros.CodeSyntaxColor Engine

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 23 | Автор: Алексей
Добавлено:27.05.2008 / 15:48
Не получается записать значение в таблицу List в столбик CurentRest

SELECT возвращает два значения PID

---
как правильно записать следующий запрос?

Наверное, придется писать запрос SELECT два раза, один на сумму, другой на PID.
Кстати, еще WHERE не хватает, вот PID как паз туда нужно писать, типа:
001:
002:
003:
004:
005:
UPDATE List SET CurentRest=(SELECT SUM(QTT*IIF(OT='in',1,-1)) AS TotalCount FROM Movements GROUP BY PID)
WHERE PID = (SELECT PID FROM Movements GROUP BY PID)

_______________________
Colorized by: Eros.CodeSyntaxColor Engine

---
SUM(QTT*IIF(OT='in',1,-1))

зачёт ;)

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 24 | Автор: Arti
Добавлено:27.05.2008 / 16:08
зачёт ;)

Спасибо, но идея не моя http://kbyte.ru/Forum/Show.aspx?id=8481&lang=ru&page=3 ответ #57 от EROS, в зависимости от Movement.Id (1 или -1) приход или расход, сдесь также если in то 1 если что-то другое то -1. :)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 25 | Автор: Arti
Добавлено:27.05.2008 / 17:34
Не получает побороть В операции должен использоваться обновляемый запрос :(

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 26 | Автор: Arti
Добавлено:27.05.2008 / 17:58
Вобще проблема имеет следующие черты, если сделать такой UPDATE например
001:
002:
003:
UPDATE List SET CurentRest=10 WHERE PID=20

Colorized by: Eros.CodeSyntaxColor Engine
то все нормально срабатывает, если в запросе использовать значения из другой таблицы нежели та в которой проводится UPDATE например
001:
002:
003:
UPDATE List SET CurentRest=(SELECT SUM(QTT*IIF(OT='in',1,-1)) FROM Movements) WHERE PID=10

Colorized by: Eros.CodeSyntaxColor Engine
то получаем ошибку В операции должен использоваться обновляемый запрос

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 27 | Автор: Arti
Добавлено:27.05.2008 / 22:16
Вобщем все гораздо сложнее, запрос в таком виде считается не обновляемым, почему так я не знаю, что такого плохого в SELECT из другой таблицы не понятно, зачем эти лишние ограничения?

Чтобы запрос стал обновляемым его нужно записать в следующем виде.
001:
002:
003:
cmd.CommandText = "UPDATE List SET CurentRest=DSum(""QTT*IIF(OT='in',1,-1)"", ""Movements"", ""PID="" & PID)"

Colorized by: Eros.CodeSyntaxColor Engine

тогда все работает

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Наверх

 

Последние статьи

Нестандартная форма
Автор: Zhenik Ipatov | добавлено: 05.05.2008 / 12:42 | просмотров: 206

Первое что бросается в глаза, когда первый раз используешь программу это конечно же её облик, внешний вид. Есть вероятность что если пользователю не понравится внешний вид окна, то он не будет пользоваться продуктом. Значит нам, не побоюсь этого слова, программистам нужно как можно лучше, удобнее, понятнее, красивее и приветливее сделать лицо программы. Нужно как можно эффектнее преподнести программу. С самого первого появления Windows окна получили прямоугольный стандарт и все User Control’ы

Как узнать размер базы данных MySQL через php
Автор: Николай Рудченко | добавлено: 14.02.2008 / 13:01 | просмотров: 695

В этой небольшой статье вы узнаете, как получить размер вашей базы данных (БД) MySQL используя язык программирования PHP.

Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)
Автор: Немиро Алексей | добавлено: 27.07.2007 / 14:01 | просмотров: 5336

В данной статье речь пойдет о том, как можно программно заполнить и отправить Web-форму, а также получить результат с использованием довольно простых классов - HttpWebRequest и HttpWebResponse.

Работа с SQL – Запросы
Автор: Хабибулин А. (aka Bille Gates) | добавлено: 22.07.2007 / 04:43 | просмотров: 8666

В данной статье рассмотрены часто используемые SQL-запросы и приведены примеры их использования.

Использование XML.Serialization
Автор: Немиро Алексей | добавлено: 19.07.2007 / 15:38 | просмотров: 2361

В данном обзоре речь пойдет об использование XML.Serialization в .NET и ее применении на примере сохранения и считывания настроек программы с использованием синтаксиса языка Visual Basic .NET.

 

Статьи на Kbyte.Ru

Наверх

 

Интересные коды и решения

Как очистить корзину?
Дата добавления: 24.03.2007 / 11:35 | просмотров: 1231 | платформа: VB .NET

DataGridView: Как добавить новую строку?
Дата добавления: 02.08.2006 / 09:31 | просмотров: 3748 | платформа: VB .NET

Как узнать IP-адрес посетителя?
Дата добавления: 01.09.2006 / 12:23 | просмотров: 3215 | платформа: ASP .NET (VB)

Проверка существования директории
Дата добавления: 31.07.2006 / 12:41 | просмотров: 2872 | платформа: VB

Поиск слов
Дата добавления: 24.03.2007 / 11:01 | просмотров: 1189 | платформа: RegEx

Как узнать текущее разрешение экрана?
Дата добавления: 24.03.2007 / 12:25 | просмотров: 1905 | платформа: VB .NET

Подсчет количества определенных символов в тексте
Дата добавления: 31.07.2006 / 12:30 | просмотров: 1785 | платформа: VB

Как узнать размер открытого файла?
Дата добавления: 31.07.2006 / 12:43 | просмотров: 1451 | платформа: VB

Как отправить E-Mail?
Дата добавления: 01.08.2006 / 11:52 | просмотров: 2982 | платформа: ASP

Как динамически добавить элемент управления?
Дата добавления: 17.08.2006 / 17:02 | просмотров: 1845 | платформа: ASP .NET (VB)

 

Универсальные коды на Kbyte.Ru

Наверх

 

Юмор на Kbyte.Ru

- У меня чёрный пояс по карате!
- А у меня жёлтая резинка от трусов по плаванию!

 

Рейтинг: 357
Всего голосов: 475
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

- Когда Microsoft будет выпускать то, что не тормозит?
- Когда начнет выпускать автомобили

 

Рейтинг: 237
Всего голосов: 393
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Приходит учительница Вовочки к нему домой и жалуется папе, ваш сын нарисовал на моём столе муху я её била, била даже руку сломала. Это ещё ничего, отвечает папа он в ванне нарисовал крокодила, я так испугался, что даже из нарисованной двери выбежал.

 

Рейтинг: 303
Всего голосов: 468
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

На международных соревнованиях американские вооруженные силы совершили больше всех промахов при прицельной стрельбе, а российские - больше всего попаданий при предупредительной.

 

Рейтинг: 333
Всего голосов: 569
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Идет Илья Муромец по полю. Видит - Змей Горыныч сидит. Ну, тот подкрался к нему и срубил ему голову. У Змея Горыныча две
выросло. Срубил Илья ему две - четыре выросло! Срубил четыре - выросло восемь!!! И так далее... И вот когда Илья Муромец
срубил 65535 голов, Змей Горыныч помер...
Потому что был он 16-ти битным.

 

Рейтинг: 218
Всего голосов: 381
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

- "Hе" с глаголами пишется вместе или отдельно?
- Через пробел!

 

Рейтинг: 316
Всего голосов: 556
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Недавно начал работу в фирме коммерческой недвижимости. Сделал им сеть пару недель назад, а до этого, несколько дней бухгалтера данными между компьютерами при помощи флэшки обменивались (фирма экономит на всём, дисководов нет). К одному из компьютеров по USB были подключены принтер и мышь. USB портов в том компьютере всего два, оба и заняли. Подключили, пока меня не было, флэшку, а для этого отключили принтер. Перекинули нужные данные и снова подключили принтер.
Прошло время, звонят мне по телефону и жалуются, мол, принтер не работает, работа стоит, приезжай скорее! Приехал, как только смог, посмотрел настройки принтера - все в норме. Стал подключение принтера к компьютеру смотреть. Каково же было моё изумление, когда я увидел USB коннектор аккуратненько насаженный на штырьки COM порта! До этого, мне даже не представлялось, что такое возможно! Судя по всему, не зря у женщины, осуществившей такое подключение, на рабочем столе изображение девушки, едущей в автомобиле из которого она забыла вынуть пистолет бензозаправки...

 

Рейтинг: 1000
Всего голосов: 1504
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Самый трудный год в семейной жизни - это текущий.

 

Рейтинг: 1135
Всего голосов: 1663
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Пpиходит обалденная блондинка к сексопатологy:
- Доктоp, со мною что-то не в поpядке!
- По-моемy, y вас все отлично.
- Тогда почемy мой мyж входит в меня в пять pаз pеже, чем в Интернет?

 

Рейтинг: 287
Всего голосов: 481
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Собирается жена с мужем на праздник, жена прихорашивается и спрашивает у мужа:
- Я похожа на фотомодель?
- Скорее на фоторобот.

 

Рейтинг: 352
Всего голосов: 541
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Весь юмор на Kbyte.Ru

Наверх


Выпуск подготовил: R-KDR-19826

Редактор: Немиро Алексей

Copyright (c) Nemiro AS, 2005-2007


В избранное