Member 11856456 Ответов: 1

Как я могу передать определенные значения в VB.NET использование SQL-оператора?


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

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

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

Dim sql1 As String = "insert into [Accessed](ID, Username, Identification, [Date], [Time]) values(@ID, @Username, @Identification, @Date, @Time)"
           cmd = New SqlClient.SqlCommand(sql1, sqlcon)

           cmd.Parameters.AddWithValue("@ID", LoginDataSet.Tables("Accessed").Rows.Count + I)
           cmd.Parameters.AddWithValue("@Username", TextBox1.Text)
           cmd.Parameters.AddWithValue("@Identification", LoginDataSet.Tables("Login").Rows.Count + I)
           cmd.Parameters.AddWithValue("@Date", registerdate)
           cmd.Parameters.AddWithValue("@Time", registertime)


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

Я попытался использовать тот же метод, что и с идентификатором строки, который был
LoginDataSet.Tables("Login").Rows.Count + I
но я знаю, что это неправильно. В любом случае я пытаюсь использовать параметризованную ссылку.

Prifti Constantine

Какое значение имеет, LoginDataSet.Таблицы ("Логин"). Строки.Граф + я, возвращение?

Member 11856456

I+=1, но это не совсем то, чего я хотел. Я просто использовал тот же формат для ID, чтобы проверить код. но я не мог придумать творческий способ выразить UserID, который должен оставаться неизменным до тех пор, пока это один и тот же пользователь, конечно.

1 Ответов

Рейтинг:
11

OriginalGriff

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

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

Поэтому, когда вы храните информацию о доступе, вы используете сохраненное значение userID в качестве табличных данных:

cmd.Parameters.AddWithValue("@Identification", userID)

Кроме того, вы, вероятно, не хотите - или не нуждаетесь - устанавливать определенное значение для столбца ID вашей таблицы "доступ", поскольку это должен быть столбец IDENTITY или UNIQUEIDENTIFIER, о котором ваш код не должен заботиться (или поддерживать его в многопользовательской системе).
Доступная вам таблица не должна хранить имя пользователя - у нее есть идентификатор пользователя, поэтому она может получить имя пользователя с помощью простого запроса соединения, когда вам это нужно-хранить дублирующуюся информацию расточительно и опасно.
Вероятно, вам также было бы лучше хранить значения даты и времени в виде одного столбца DATETIME (или DATETIME2) - и хранить там значение UTC, чтобы оно было согласовано в базе данных независимо от того, где находится пользователь.
Моя версия таблицы доступа будет следующей:
ID         INT, IDENTITY, Primary Key, Not Null.
UserID     INT or GUID depending on your Users table, Foreign Key to Users table, Not Null
Timestamp  DATETIME (or DATETIME2), Not Null, Default Value = GETUTCDATE() (stored as UTC)
Action     INT (type of access, so you can store login, bad login attempt, update, etc.)
Затем все, что вы передаете ему при вставке значения, - это идентификатор пользователя и код действия через параметры.


Member 11856456

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

OriginalGriff

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

А что касается стола, то я уже сделал это, не так ли?: