Member 14832867 Ответов: 3

Как это сделать в хранимой процедуре?


SELECT DISTINCT CHARGE, NO FROM student, teacher WHERE CHARGE = ID  and NO = '" & myDataNvocc.Tables(0).Rows(y).Item("ID") & "' and CHARGE is not null


Кстати говоря
'" & table1.Tables(0).Rows(y).Item("ID") & "'
это из набора данных, и я хочу использовать это в хранимой процедуре

y - это от этого
For y = 0 To table1.Tables(0).Rows.Count.ToString() - 1


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

Пожалуйста помогите мне я действительно понятия не имею

Richard Deeming

Еще раз, НЕ удалите содержание вашего вопроса после того, как на него был дан ответ!

3 Ответов

Рейтинг:
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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

Не имеет значения, является ли этот код SP или SqlCommand: весь ваш подход - все ваше приложение - неверен и нуждается в исправлении.


Рейтинг:
0

Garth J Lancaster

В дополнение к решению 1, большая компьютерная работа означает, что вам нужна возможность поиска/повторного поиска для себя, так как вы приходите сюда с кодом-и мы не делаем работу людей за них ...

Вот несколько URL-адресов, которые помогут вам начать работу

Учебник по хранимым процедурам SQL Server[^]

Создание хранимых процедур для SQL сервера Майкрософт документы[^]

Хранимые процедуры SQL Server для начинающих[^]


Рейтинг:
0

MadMyche

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

Хотя это не является ни переводом кода, ни генерацией веб-сайта; то, что я предоставляю вам ниже, - это простой код котельной плиты, и я бы рекомендовал вам просмотреть ссылки на статьи в конце этого поста.

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

SELECT a.RecordName, b.DetailName
FROM Records a
JOIN Details b ON a.RecordID = b.RecordID
WHERE a.RecordID   = @RecordID
AND   b.DetailName IS NOT NULL


Теперь перейдем к созданию ИП

Вам просто нужно обернуть эту строку SQL в a CREATE PROCEDURE заявление; и определите @Параметр это будет использовано внутри него
CREATE PROCEDURE [SchemaName].[MyStoredProcedure] (
   @No INT 
) AS
BEGIN
   SELECT DISTINCT CHARGE, NO

   FROM student
   ,    teacher

   WHERE CHARGE = ID
   and   NO     = @No
   and   CHARGE is not null
END
GO
А затем измените свой SqlCommand код для ссылки на эту процедуру, определите ее как хранимую процедуру и добавьте Parameter в нее.
Вы все равно будете запускать это через ExecuteReader() и вы можете перебирать записи как обычно.
Пожалуйста, обратите внимание: VB не является моим родным языком, поэтому могут быть ошибки, как это было сделано в блокноте
Using connection As New SqlConnection(connectionString)
     Dim cmd As New SqlCommand("SchemaName.MyStoredProcedure", connection)

     cmd.CommandType = CommandType.StoredProcedure
     cmd.Parameters.AddWithValue("@No", myDataNvocc.Tables(0).Rows(y).Item("ID") )

     Try
          connection.Open()
          Dim sdr as SqlDataReader = cmd.ExecuteReader()

          ' Go through your dataset

     Catch ex As Exception
          Console.WriteLine(ex.Message)
     End Try
End Using
Рекомендации:
MS Docs => Создать процедуру[^]
MS Docs => SqlCommand.свойства параметров[^]


Member 14832867

Можно ли заполнить результат в dataset? Спасибо за вашу помощь, очень ценю это!