Mak Patel Ответов: 1

Я хочу создать отчет в VB, net из моей базы данных с помощью crystal report.


Привет,
Я новичок в Crystal Reports и vb.net. Я хочу разделить столбцы моей базы данных и показать эти столбцы в отчете, а также в datagridview. Пожалуйста, помогите мне как можно скорее.

Что я уже пробовал:

Я должен был найти код, но не нашел.

OriginalGriff

И что же?
Что вы пробовали?
Где ты застрял?
Какая помощь вам нужна?

Mak Patel

Частная суб методе button2_click(отправителя как объект, а равно EventArgs) обрабатывает btn_ms.Щелчок
Dim cmd как новая SqlCommand
Дим ДР в качестве объекта sqldatareader
Дим dtp1 как datetime
Дим dtp2 как datetime
Тусклый ss как строка

dtp1 = dtp_1. Value
dtp2 = dtp_2. Value

Dim da как новый SqlDataAdapter
Dim ds как новый набор данных
Дим ДТ в качестве нового объекта DataTable
- кон.Открыть()
УМК.Подключение = кон
ss = " select * from order_master where (order_date) CONVERT(VARCHAR,' " & dtp1.Метод toString("ДД/ММ/гггг") &ампер; "') и конвертировать(тип varchar,'" &амп; dtp2.Метод toString("ДД/ММ/гггг") &ампер; "')) и МС = '" &амп; cb_ms.Текст &"'"
УМК.Свойства commandtext = СС
да.Команды selectcommand = ЦМД
да.Заполнить(ДС)
DataGridView1.Источник данных = ДС.Столы(0)
dr = cmd.Метода executereader()
др.Рядом()
Форма 1. Показать()
Конец Подводной Лодки


Это мой код для отображения данных в datagridview. но я хочу разделить свою колонку datagridview.

1 Ответов

Рейтинг:
0

OriginalGriff

Никогда так не делай! Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку с точки зрения SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x'; DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

И ваш SQL указывает на более глубокие недостатки: вы берете значение DateTime, преобразуете его в строку в своем коде C#, а затем используете SQL для преобразования этой строки ... строка, которую затем вы пытаетесь использовать в качестве даты в операторе BETWEEN. Это означает, что ваш столбец order_date является строкой, а это означает, что ваш BETWEEN потерпит неудачу, так как он использует сравнения строк, которые останавливаются на первом различном символе в двух строках. Так
"31-01-1900" находится после "01-12-2017", потому что " 3 "находится после" 0 " в наборе символов, и SQL перестанет смотреть на эту точку.

Измените свою БД на использование DATE, DATETIME или DATETIME2 для хранения ваших дат и передайте значение DateTime непосредственно через параметризованный запрос, пока вы исправляете все остальные конкатенации в своем приложении!

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


Mak Patel

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

Заранее спасибо.

OriginalGriff

DateTime не имеет формата в SQL, VB или C# - это число тиков с определенного момента времени и получает любое форматирование (или даже понятие дней, месяцев или лет) только тогда, когда оно намеренно формируется для пользователя. Если ваша БД содержит "форматированные даты", то они хранятся в виде строк и имеют все проблемы, о которых я упоминал выше.

Mak Patel

Частная суб методе button2_click(отправителя как объект, а равно EventArgs) обрабатывает btn_ms.Щелчок
Dim cmd как новая SqlCommand
Дим ДР в качестве объекта sqldatareader
Dim dtp1 как дата
Dim dtp2 как дата
Тусклый ss как строка

dtp1 = dtp_1. Value
dtp2 = dtp_2. Value

Dim da как новый SqlDataAdapter
Dim ds как новый набор данных
Дим ДТ в качестве нового объекта DataTable
- кон.Открыть()
УМК.Подключение = кон
СС = "выбрать * из order_master где order_date между '" &амп; dtp1 &ампер; "' и '" &АМП; dtp2 &ампер; "' и г = '" &амп; cb_ms.Текст &"'"
УМК.Свойства commandtext = СС
да.Команды selectcommand = ЦМД
да.Заполнить(ДС)
DataGridView1.Источник данных = ДС.Столы(0)
dr = cmd.Метода executereader()
др.Рядом()
Конец Подводной Лодки

Теперь о том, как разделить мои колонки.

у меня есть столбцы p_name, которые содержат несколько продуктов в одной ячейке, разделенной запятой.
я хочу отобразить эти столбцы через split.

например.

в дБ

p_name

ABC,XYZ

я хочу показать в datagridview

p_name
АЗБУКА
XYZ

OriginalGriff

И вы не слушаете ничего из того, что я говорю...