Я создал программу, которая будет заселяться в отель и обновлять серверную часть. У меня проблема с подключением и изменением идентификатора пользователя в моей таблице комнат. Таблицы:
UserID - PK, Auto Number
Username - Short Text
Password - Short Text
RoomID - PK, Auto Number
Room_Number - Number
UserID - FK, Number
PARAMETERS parUsername Short, parRoom_Number Short;
UPDATE Rooms SET UserID = (SELECT UserID FROM Users WHERE Username = [parUsername])
WHERE Room_Number=[parRoom_Number];
MessageBox.Show("Login Successful");
Home home = new Home();
home.Show();
home.LabelText = this.txtUsername.Text;
public string LabelText
{
get
{
return this.lblUsername.Text;
}
set
{
this.lblUsername.Text = value;
}
}
Home home = new Home();
try
{
string ConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " + Application.StartupPath + "/Hotel.accdb";
using (var con = new OleDbConnection(ConnString))
{
con.Open();
using (var cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Query2";
cmd.Parameters.Add("parUsername", home.LabelText);
cmd.Parameters.Add("parRoom_Number", lbRooms.SelectedItem);
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
@OlivierJacot-Descombes Все еще выдает ошибку: операция должна использовать обновляемый запрос
Попробуйте: ...UserID IN (SELECT...)...
@June7 Выдает синтаксическую ошибку: ошибка в выражении UPDATE
Извините, я неправильно прочитал SQL. Невозможно установить поле для вложенного подзапроса. Это попытка установить в поле набор записей, а не одно значение.
@June7 June 7 Итак, как мне получить t, чтобы найти UserID, когда у меня есть имя пользователя, и указать UserID в качестве значения для запроса на обновление?
В VBA я бы, вероятно, использовал DLookup. Но оказывается есть ответ, предложенный для C#.





Вместо использования подзапроса попробуйте это
PARAMETERS parUsername Text ( 255 ), parRoom_Number Long;
UPDATE Rooms, Users SET Rooms.UserID = Users.UserID
WHERE Rooms.Room_Number = [parRoom_Number] AND Users.Username = [parUsername];
Это больше не дает мне ошибку, но ничего не обновляет в базе данных.
Я сделал тест. Меня устраивает. Но вы можете адаптировать типы параметров, чтобы они точно соответствовали типам в ваших таблицах.
Спасибо, проблема была в коде С#, я не поместил .ToString() в текст home.Label.
Сначала я изменил хранимую процедуру Query2. Передача идентификатора пользователя и номера комнаты (изменил его на числовой тип данных, чтобы он соответствовал определению таблицы (а не короткий, как в вашем вопросе).
PARAMETERS parUserID Number, parRoom_Number Number;
UPDATE Rooms SET UserID = [parUserID]
WHERE Room_Number=[parRoom_Number];
Затем я изменил ваш код на отдельный запрос, чтобы получить UserId.
Home home = new Home();
int userID;
try
{
string ConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " + Application.StartupPath + "/Hotel.accdb";
using (var con = new OleDbConnection(ConnString))
{
con.Open();
//Passing the query and the connection directly to the constructor
using (OleDbCommand cmd1 = new OleDbCommand("SELECT UserID FROM Users WHERE Username = @UserName;", con))
{
cmd1.Parameters.Add("@UserName", OleDbType.VarChar).Value = home.LabelText;
userID = (int)cmd1.ExecuteScalar();
}
using (var cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Query2";
cmd.Parameters.Add("parUserID", OleDbType.Numeric).Value = userID;
cmd.Parameters.Add("parRoom_Number",OleDbType.Numeric ).Value = (int)lbRooms.SelectedItem;
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Пожалуйста, попробуйте следующий вариант, он должен работать
UPDATE Rooms A,(SELECT UserID FROM Users WHERE Username = 'Test') B SET A.UserID = B.UserID WHERE Room_Number=1;
Попробуйте
cmd.CommandType = CommandType.Text; cmd.CommandText = "EXEC Query2";