sazmuelz Ответов: 1

Как несколько пользователей могут запросить таблицу SQL с помощью параметра, переданного в текстовое поле на VB.NET форма без перезаписи результатов друг друга


У меня есть таблица SQL, я хочу, чтобы несколько пользователей могли запрашивать таблицу на основе параметра, передаваемого через текстовое поле в форме в visual basic, и результатов, отображаемых в отчете Crystal.

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

Я пробовал использовать представления, но мне не удалось передать параметры в представление из текстового поля. Я попробовал использовать временные таблицы, но проблема с ними заключается в том, что я не могу передать временную таблицу в Crystal Report.

Я прошу любой помощи о том, как этого достичь.

Любой пример кода, который поможет мне, будет высоко оценен.

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

Private Sub SelectViewClientInvoices()
    myconnection.Open()
    mycommand = New SqlCommand("Select MacAddress,InvoiceNo,ClientNo,ClientName,TelephoneNo,EmailAddress,PhysicalAddress,LoggedInUser FROM View_ClientSelectedInvoices WHERE ClientNo = '" & TxtClientNo.Text & "' and InvoiceNo = '" & TxtInvoiceNo.Text & "' ", myconnection)
    mycommand.ExecuteNonQuery()
    myconnection.Close()
End Sub


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

Sandeep Mewara

Объясните: "к сожалению, я не получаю желаемых результатов."

sazmuelz

Представление по-прежнему извлекает все данные из таблицы, а не только данные, связанные со значением, переданным в текстовое поле

Garth J Lancaster

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

Я не уверен, в чем заключается ваша проблема с этим, за исключением того, что OriginalGriff указывает ниже в качестве решения / исправления вашего выбранного кода.

Если ваша проблема заключается в том, что все пользователи должны использовать одни и те же параметры для запроса, то это совершенно отдельная проблема - вам может понадобиться использовать контрольную таблицу или что-то подобное для хранения параметров для запуска, но как вы ее обновите/укажите продолжительность, в течение которой набор параметров является допустимым/набор для использования станет "интересным"

sazmuelz

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

1 Ответов

Рейтинг:
2

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

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

Во - вторых, команда SELECT - это запрос, поэтому использование ExecuteNonQuery вообще не будет работать-вместо этого вам нужно использовать DataAdapter или DataReader:
Using con As New SqlConnection(strConnect)
	con.Open()
	Using cmd As New SqlCommand("SELECT iD, description FROM myTable", con)
		Using reader As SqlDataReader = cmd.ExecuteReader()
			While reader.Read()
				Dim id__1 As Integer = CInt(reader("iD"))
				Dim desc As String = DirectCast(reader("description"), String)
				Console.WriteLine("ID: {0}" & vbLf & "    {1}", iD, desc)
			End While
		End Using
	End Using
End Using

Using con As SqlConnection = New SqlConnection(strConnect)
    con.Open()

    Using da As SqlDataAdapter = New SqlDataAdapter("SELECT MyColumn1, MyColumn2 FROM myTable WHERE mySearchColumn = @SEARCH", con)
        da.SelectCommand.Parameters.AddWithValue("@SEARCH", myTextBox.Text)
        Dim dt As DataTable = New DataTable()
        da.Fill(dt)
        myDataGridView.DataSource = dt
    End Using
End Using