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

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


Выпуск # 725

Друзья! Прошло совсем мало времени с момент последнего выпуска, и вот уже новый! Удивительно, как быстро летит время в Интернете, сколько всего нового происходит ежедневно, да что там, ежесекундно. И Kbyte.Ru в этом плане не исключение, на сайте столько всего произошло, столько всего, что многое даже и не влезло в этот выпуск! И кто только придумал ограничения скорости интернет-соединения и объемов писем! Эх..., благо на сайте есть живая лента событий, которая не даст потеряться среди гущи событий.
Надеюсь, этот выпуск будет интересен для вас. Если вы хотите увидеть в следующих выпусках что-то конкретное, напишите мне об этом на ящик subscribe@kbyte.ru.


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

Читайте в этом выпуске:

Если у вас есть вопросы по программированию или работе с компьютером, не стесняйтесь, спрашивайте.

Форумы Kbyte.Ru

На форумах Kbyte.Ru постоянно появляются новые интересные темы и обсуждения. В этом выпуске представлены лишь новые темы, с момента прошлой рассылки.

Кстати, любой желающий может на форумах Kbyte.Ru совершенно свободно получить помощь грамотных специалистов в области программирования, да и в целом информационных технологий.

Задать свой вопрос прямо сейчас

Среда Visual Basic STUDIO’2010 Professional
Помогите с помощью параметризованного запроса выбрать
Записи из таблицы Pensioner в таблицу Pensioner_2. Access - тип базы.
Структура обоих таблиц одинакова. Надо выбрать 2 поля: Фамилию и Имя
Критерием отбора является год рождения, например, 1953. Пользователь вводит
Или выбирает из определённого контрола ( допустим, ComboBox, алендарья) год и
В талбице появляется список, родившихся в 1953 году.
Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CD_MY_new\DATA\My_Pension.mdb;")
        conn.Open()
        Dim cmd As New OleDbCommand()
        cmd.Connection = conn
        cmd.CommandType = CommandType.Text
        cmd.CommandText = "SELECT * INTO Pensioner_2 FROM Pensioner WHERE Pensioner.BirthDate=?"
	' Несоответствие типов данных в выражении условия отбора.
	' как применить, например, CDate(TextBox1.text) в качестве параметра?
        With cmd.Parameters
		' как в этом месте выбрать фамилию и имя из таблицы?
'  я временно поставил = ""
            .Add("@pLastName", OleDbType.VarChar).Value = ""
            .Add("@pFirstName", OleDbType.VarChar).Value = ""
        End With
        cmd.ExecuteNonQuery()
        conn.Close()
СПАСИБО!

[- к содержанию -]

Ответ #1 @Алексей Немиро 17.04.2013 15:34
Для дат лучше использовать функцию DateDiff, которая возвращает разницу из двух дат:
cmd.CommandText =
"SELECT * INTO Pensioner_2 FROM Pensioner WHERE DateDiff('y', ?, Pensioner.BirthDate) = 0"
cmd.Parameters.Add("@BirthDate", OleDb.OleDbType.Date).Value = Now 'вместо now любая другая дата
DateDiff('y', ?, Pensioner.BirthDate) = 0
--количество лет из входящей в запрос даты и поля BirthDate таблицы Pensioner должно быть равно нулю
--вместо ноль может быть любое значение
cmd.CommandText = "SELECT * INTO Pensioner_2 FROM Pensioner WHERE DateDiff('y', Now(), Pensioner.BirthDate) = ?"
cmd.Parameters.Add("@Age", OleDb.OleDbType.Integer).Value = 5 'возраст 5 лет
Еще есть функция Year, ну и соответственно Month, Day, которые позволяют выделить из даты год, месяц и день отдельно:
cmd.CommandText = "SELECT * INTO Pensioner_2 FROM Pensioner WHERE Year(Pensioner.BirthDate) = ?"
cmd.Parameters.Add("@BirthYear", OleDb.OleDbType.Integer).Value = 1953 'год рождения 1953
Думаю, для данной задачи проще всего использовать именно функцию Year. А DateDiff больше для точного расчета интервалов годится.
как в этом месте выбрать фамилию и имя из таблицы?
Параметры должны идти в том же порядке, что и в SQL-запросе. Например:
cmd.CommandText = "SELECT * INTO Pensioner_2
FROM Pensioner WHERE Year(Pensioner.BirthDate) = ? AND Pensioner.FirstName = ? AND Pensioner.LastName = ?"
cmd.Parameters.Add("@BirthYear", OleDb.OleDbType.Integer).Value = 1953 'год рождения 1953
cmd.Parameters.Add("@FirstName", OleDb.OleDbType.WChar).Value = "Василий"
cmd.Parameters.Add("@LastName", OleDb.OleDbType.WChar).Value = "Пупкин"
Если понадобится использовать SQL-инструкцию LIKE, то будет так:
cmd.CommandText = "SELECT * INTO Pensioner_2 FROM Pensioner WHERE Year(Pensioner.BirthDate) = ? AND Pensioner.FirstName LIKE ?"
cmd.Parameters.Add("@BirthYear", OleDb.OleDbType.Integer).Value = 1953 'год рождения 1953
cmd.Parameters.Add("@FirstName", OleDb.OleDbType.WChar).Value = "В*" 'вернет пользователей, имя которых начинается с буквы "В"
cmd.ExecuteNonQuery()
Метод ExecuteNonQuery не возвращает никаких данных. Этот метод можно использовать только для запросов DELETE FROM или UPDATE SET, ну или в редких случаях для INSERT INTO.
Получить таблицу данных (результат выполнения запроса SELECT FROM) можно при помощи OleDbDataAdapter следующим образом:
Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CD_MY_new\DATA\My_Pension.mdb;")
conn.Open()

Dim cmd As New OleDbCommand("SELECT * INTO Pensioner_2 FROM Pensioner WHERE Year(Pensioner.BirthDate) = ?", conn)
cmd.Parameters.Add("@BirthYear", OleDb.OleDbType.Integer).Value = 1953

Dim myTable As New DataTable()
Dim DA As New OleDbDataAdapter(cmd)
DA.Fill(myTable)' в переменной myTable будет результат выполнения запроса - таблица данных
DataGridView1.DataSource = myTable 'можно передать таблицу данных в DataGridView
conn.Close()

[- к содержанию -]

Ответ #2 @capetownn 18.04.2013 17:29
Уважаемый Алексей, искренне благодарю Вас за решение
моей проблемы. Всё ОК! При изучении Вашего кода приходилось
сначала вручную из базы удалять таблицу "Pensioner_2", т.к. выводилось сообщение
Таблица 'Pensioner_2' уже существует.
Потом я поставил перед выполнением Вашего кода 3 строки,
удаляющие таблицу "Pensioner_2".

Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CD_MY_new\DATA\My_Pension.mdb;")
conn.Open()
Dim cmd2 As New OleDbCommand("", conn)
cmd2.CommandText = "Drop TABLE Pensioner_2"
cmd2.ExecuteNonQuery()
' Таблица 'Pensioner_2' не существует.
' она действительно отсутствует! Выводится указанное сообщение только первый раз,
' но когда уже таблица создана, то каждый раз удаляется и создаётся новая.
' А это, наверное, можно усовершенствовать?
Dim cmd As New OleDbCommand("", conn)
cmd.CommandText = "SELECT LastName, FirstName INTO Pensioner_2 FROM Pensioner WHERE Pensioner.FirstName = ?"
Как объединить в один запрос
cmd2.CommandText и cmd.CommandText,
содержащую проверку сущестование таблицы "Pensioner_2"?

Получается так: если таблица "Pensioner_2" не существует,
То нечего удалять. Если же таблица "Pensioner_2" существует,
То удалить и выполнить Select.

Как в одном запросе:
1. проверить, т.е. наподобие: If Exist table Pensioner_2, то Drop TABLE Pensioner_2
2. продолжить выполнять следущий оператор SELECT
СПАСИБО!

[- к содержанию -]

Ответ #3 @Алексей Немиро 18.04.2013 19:30
Только сейчас заметил, что в SQL-запросах используется конструкция SELECT * INTO.
SELECT INTO предназначена не для выборки данных, а для их переноса (копирования). Это действительно необходимо?

Для выборки данных нужно использовать инструкцию SELECT FROM:
cmd.CommandText = "SELECT * FROM Pensioner WHERE Year(Pensioner.BirthDate) = ?"
cmd.Parameters.Add("@BirthYear", OleDb.OleDbType.Integer).Value = 1953 'год рождения 1953

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


Проверить существование таблицы можно так:
Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CD_MY_new\DATA\My_Pension.mdb;")
conn.Open()
Dim dbSchema As DataTable = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, "Pensioner_2", "TABLE"})
If dbSchema.Rows.Count > 0 Then
  Dim cmd As New OleDb.OleDbCommand("DROP TABLE Pensioner_2", conn)
  cmd.ExecuteNonQuery()
End If
'...
conn.Close()
Или просто делать запрос к таблице Pensioner_2 и если он выполнится, удалить таблицу, а если нет, просто произойдет ошибка:
Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CD_MY_new\DATA\My_Pension.mdb;")
conn.Open()
Try
  Dim cmd As New OleDb.OleDbCommand("SELECT * FROM Pensioner_2", conn)
  cmd.ExecuteNonQuery()
  'запрос выполнился, удаляем
  cmd.CommandText = "SELECT * FROM Pensioner_2"
  cmd.ExecuteNonQuery()
Catch
End Try
'...
conn.Close()
А одним запросов все сделать в Acces не получится. Язык SQL у него скудный.

[- к содержанию -]

Добавить свой ответ в эту тему
Как самому сделать GIF картинку из выбраных картинок формата Jpeg Png в выбранном порядку с выбранным интервалом??

[- к содержанию -]

Ответ #2 @Crash666 17.04.2013 16:56
Проблека не могу понять ее

[- к содержанию -]

Ответ #3 @Алексей Немиро 17.04.2013 17:23
Есть дверь и есть ручка от двери. Дверь можно открыть без ручки, можно открыть дверь с ручкой, а вот открыть ручкой дверь, которой нет - нельзя. В данном случае как раз таки есть ручка, но нет двери

Если это проект из ссылки, которую я привел выше, то запускать нужно консольное приложение (дверь), а не библиотеку классов (ручку от двери). Консольное приложение зовется Example. Признаком того, что при отладке будет запущено именно консольное приложение, служит выделенности имени проекта жирным шрифтом в обозревателе решений.

Можно принудительно задать порядок запуска проектов в свойствах решения.
Правой кнопкой мышки по решению:

и выбрать "Один запускаемый проект" -> Example:

[- к содержанию -]

Добавить свой ответ в эту тему
Over (sql) @rusiko 16.04.2013 10:35
Привет. Скажите пожайлуста для чего применяется "over" в sql server 2008. Опять я тут в интернете нашел кучу статей насчет этого, но как всегда они все объясняют одинаково. Пожайлуста, если можно объясните своими словами. Спасибо большое.

[- к содержанию -]

Ответ #1 @Алексей Немиро 16.04.2013 11:23
OVER позволяет проводить некоторые расчеты/операции по полям, во многом позволяет заменить вложенные запросы.

Например:
DECLARE @example TABLE (id int identity primary key, name nvarchar(100), zarplata money)

INSERT INTO @example (name, zarplata) VALUES ('Вася', 100);
INSERT INTO @example (name, zarplata) VALUES ('Петя', 120);
INSERT INTO @example (name, zarplata) VALUES ('Маша', 50);
INSERT INTO @example (name, zarplata) VALUES ('Федя', 115);
INSERT INTO @example (name, zarplata) VALUES ('Света', 30);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 200);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 90);
INSERT INTO @example (name, zarplata) VALUES ('Петя', 180);
INSERT INTO @example (name, zarplata) VALUES ('Петя', 210);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 100);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 100);
INSERT INTO @example (name, zarplata) VALUES ('Маша', 30);
INSERT INTO @example (name, zarplata) VALUES ('Маша', 75);
INSERT INTO @example (name, zarplata) VALUES ('Света', 45);
INSERT INTO @example (name, zarplata) VALUES ('Света', 45);
INSERT INTO @example (name, zarplata) VALUES ('Света', 45);
INSERT INTO @example (name, zarplata) VALUES ('Света', 35);

-- выводим вложенным запросом количество записей для конкретного name
SELECT *, 
(SELECT COUNT(id) FROM @example WHERE name = a.name) AS 'количество записей'
FROM @example AS a;

-- выводим при помощи OVER количество записей для конкретного name
SELECT *,
COUNT(id) OVER(PARTITION BY name) AS 'количество записей'
FROM @example;
Если верить документации, то OVER будет работать быстрее, чем вложенный запрос.

Еще в T-SQL есть замечательная функция ROW_NUMBER, которая позволяет получить номер строки выборки, которую можно использовать только с инструкцией OVER:
SELECT ROW_NUMBER() OVER(PARTITION BY name ORDER BY name ASC) AS 'номер строки', *
FROM @example;
Это лишь микроскопическая часть применения OVER.

В SQL Server 2012 возможностей больше.

[- к содержанию -]

Добавить свой ответ в эту тему
Здравствуйте Нужна помощь….Пишу все еще на VB6
Задумал написать прогу: составить все возможные слова (если есть в словаре) из набора букв. (макс.набор символов =10), как в игре угадай слово из 3,4,5-ти…а дано 8 или9 или10 букв… Мои размышления:
1.Беру словарь, например из 83000 слов и кидаю в папку с проектом.
2. Ввожу в Textbox набор букв и перебираю все возможные комбинации их будет = N! (факториал)
3. Записываю все комбинации в массив
4. Допустим дано 8 букв из них составить слово из 5 букв => Обрезаю все имеемые комбинации до 5 знаков, сортирую, и убиваю дубликаты (они точно появятся, тем более если в наборе имеются одинаковые буквы) так комбинаций остается значительно меньше, что мне на руку.
5. сохраняю все это в файл .txt
6.Загружаю словарь из 83000 слов в массивы из 3,4,5…..10 слов (чтобы работать не со всем словарем 83 тыс. а с его куском например из 5 букв, их где-то 14000) т.к. в задании дано слово из 5 букв.
7. В зависимости от задания сравниваю массив словаря 5 букв с файлом из отсортированных слов см. п.4и5 и нахожу соответствия (если они есть) показываю в Lisbox.
Думал все задача решена…
А теперь проблемы:
1. набор до 7,8 букв обрабатываются довольно шустро, а при наличии еще и одинаковых букв (в дальнейшем после обрезки и сортировки) еще быстрее. Но 9, а тем более 10 букв (и если все буквы еще и уникальны) тормозит страшно, можно и не дождаться…конечно 10!=3628800 одних только комбинаций.
2. Может есть какие-то мнения как увеличить производительность в разы…Голову ломаю уже 2 недели…
3. В прикрепленном файле код (конечно, это не все чисто мое, кое какие куски я позаимствовал у умных людей в сети…)
4. Пожалуйста, есть идеи, может где то в коде некорректные процедуры или методы либо еще что-нибудь…Подскажите Спасибо….

[- к содержанию -]

Как программно зарегистрировать E-mail. Я глянул Fiddler там столько запросов... неужели все передавать??

[- к содержанию -]

Ответ #1 @Crash666 17.04.2013 00:49
Ответ #2 @Алексей Немиро 17.04.2013 11:58
Регистрировать программно майлы - это не файлы загружать в обменники, дело сомнительное :)
Бесплатные майл-серверы, типа mail.ru, Яндекс защищаются от подобных вещей разнообразными хитрыми способами. Будет непросто. Но безусловно, это возможно осуществить.

[- к содержанию -]

Ответ #3 @Crash666 17.04.2013 17:49
Ну там капча при регестрации но даже где то уже ответ на капчу хранится так как надо с чем то сравнить

[- к содержанию -]

Ответ #4 @Алексей Немиро 17.04.2013 18:21
Ответ хранится на сервере, в Session, доступ к нему получить невозможно. Т.е. нужно вводить капчу.

[- к содержанию -]

Ответ #5 @Crash666 17.04.2013 20:49
:DDD и что вообще без вариантов?

[- к содержанию -]

Добавить свой ответ в эту тему · В теме есть еще 9 ответов. Смотреть все ответы.
Как-то собрал эту программку для ребят-израильтян.
Пощелкайте. Формулы по электричеству и в Африке те-же.

[- к содержанию -]

Всем привет, как поместить объект (допустим кнопку) при максимизации формы по центру и так же при нормализации. Или что бы она всегда пропорциональна меняла своё положение при изменении размера формы??

[- к содержанию -]

Ответ #1 @Shark1 12.04.2013 18:42
Всем привет, как поместить объект (допустим кнопку) при максимизации формы по центру и так же при нормализации. Или что бы она всегда пропорциональна меняла своё положение при изменении размера формы??

Не привязывай кнопку к контейнеру :

Button1.Anchor = AnchorStyles.None

[- к содержанию -]

Добавить свой ответ в эту тему

Все темы и обсуждения

Вакансии в IT

Web-дизайнер

Россия, Нижний Новгород | Работа в офисе | 40 000,00 KBP

Инженер -конструктор, -технолог, -программист

Россия, Иркутск | Работа в офисе | 22 000,00 KBP

Web-дизайнер

Россия, Новосибирск | Работа в офисе

Инженер-программист на ORACLE

Россия, Самара | Работа в офисе | 40 000,00 KBP

Программист

Россия, Самара | Работа в офисе | 20 000,00 KBP

Программист ORACLE

Россия, Самара | Работа в офисе | 35 000,00 KBP

Инженер-программист,

Россия, Самара | Работа в офисе

Программист Разработчик 1С

Россия, Ростов-на-Дону | Работа в офисе | 40 000,00 KBP

Программист стажер 1С

Россия, Ростов-на-Дону | Работа в офисе | 15 000,00 KBP

Програмист 1С

Россия, Ростов-на-Дону | Работа в офисе | 40 000,00 KBP

Все вакансии в IT · Создать резюме

[- к содержанию -]

Новости мира IT

Созданы рекордно мощные литиевые батарейки

Инженеры разработали литиевые микробатареи, которые по мощности и скорости зарядки могут сравниться с лучшими суперконденсаторами и при этом сохраняют высокую емкость химических источников питания. Достичь этого удалось за счет создания сложной регулярной микроструктуры, которая убыстряет реакции в микробатарее.

18.04.2013 10:50 · Категория: Железо · Источник: Lenta.ru

[- к содержанию -]

HTC запатентовала смартфон с двумя экранами

HTC описала в патенте смартфон-слайдер с двумя экранами. Второй экран выдвигается из-под блока с основным дисплеем. Как и в планшете Sony Tablet P, два экрана способны составлять один большой дисплей. Планирует ли HTC запускать двухэкранный смартфон в производство, неизвестно.

18.04.2013 10:49 · Категория: Железо · Источник: Lenta.ru

[- к содержанию -]

Fujitsu превратит в планшет лист бумаги с печатным текстом

Fujitsu представила технологию, превращающую лист бумаги с печатным текстом в подобие планшета. Пользователь может выделять и копировать текст с листа пальцем (движения «захватывает» камера) и видеть на листе дополнительный виртуальный контент: видео и изображения (их передает проектор).

17.04.2013 10:07 · Категория: Железо · Источник: Lenta.ru

[- к содержанию -]

Все новости


Подпишитесь на тематические RSS-ленты Kbyte.Ru, чтобы быть в курсе последних новостей:

Основная лента · Форумы (темы и сообщения) · Visual Basic 5.0/6.0 · Visual Basic .NET · C# (Си шарп) · Delphi · JavaScript · ActionScript · ASP .NET · ASP .NET MVC

Ищите Kbyte.Ru в социальных сетях FaceBook, ВКонтакте, Twitter.

Если вы занимаетесь программированием, то наверняка вам пригодятся хитрые инструменты.


Международный портал для программистов и разработчиков Kbyte.Ru основан в 2006 году. Целью портала является объединение программистов и специалистов IT-бизнеса, студентов и преподавателей для обмена опытом и знаниями, оказания помощи во всех делах и начинаниях в области IT.
Kbyte.Ru является парнёром компаний Mail.Ru Group, WebMoney Transfer, Ozon.Ru и др.
Выпуск рассылки подготовлен автоматически. Все права на материалы выпуска принадлежат Kbyte.Ru если иное не указано отдельно.


В избранное