Вставной идентификатор внешнего ключа с предложением where - PullRequest
1 голос
/ 25 июня 2019

У меня есть пара моделей: User и ShiftWork:

public class User
{
    public long Id { get; set; }
    public string Username { get; set; }
    public string SSO { get; set; }
    public ShiftWork ShiftWork { get; set; }
}

public class ShiftWork
{
    public long Id { get; set; }
    public string ShiftName { get; set; }
}

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

Я хочу иметь возможность вставить ShiftWorkIdв таблицу User, но мне нужно получить идентификатор из ShiftName, который находится в текстовом поле Winform.

Пока мои усилия в основном выглядят так:

public void CreateUser(User user)
{
    using (IDbConnection cnn = SimpleDBConnection())
    {
        string sql = "INSERT INTO USER (Username, SSO, ShiftWorkId) Values (@Username, @SSO, (select @Id from ShiftWork Where ShiftName in (select ShiftName from ShiftWork)))";
        cnn.Execute(sql, new { user.Username, user.SSO, user.ShiftWork.Id });
    }
}

Я также пытался:

string sql = "INSERT INTO USER (Username, SSO, ShiftWorkId) Values (@Username, @SSO, (select @Id from ShiftWork Where ShiftName  = @ShiftName))";

Однако я не могу понять, как мне добавить параметры для ShiftName.

В текстовом поле есть пользовательский источник автозаполнения, который заполняется избаза данных:

public List<ShiftWork> GetShifts()
{
    using (IDbConnection cnn = SimpleDBConnection())
    {
        string sql = "SELECT * FROM ShiftWork";
        var output = cnn.Query<ShiftWork>(sql);
        return output.ToList();
    }
}

, которая в приведенном ниже коде выглядит следующим образом:

AutoCompleteStringCollection ac = new AutoCompleteStringCollection();
foreach (var s in _shiftWorkRepository.GetShifts())
{
    ac.Add(s.ShiftName);
}

tbShift.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
tbShift.AutoCompleteSource = AutoCompleteSource.CustomSource;
tbShift.AutoCompleteCustomSource = ac;

Пока все, что я пробовал в отношении присвоения текста из текстового поля для user.shiftworkId,давая мне ошибки.Вся помощь очень ценится

1 Ответ

5 голосов
/ 26 июня 2019

Существует множество причин, по которым это может произойти:

1) В обоих представленных запросах символ '@' используется перед Id.Символ @ используется только в том случае, если вы указываете переменную в запросе, а переменная case не может быть разрешена.

2) Корректность оператора SQL.

3) USER - это ключевое слово SQL, чтобы оно работало в качестве имени таблицы, следует использовать квадратные скобки.

4) В вызовеExecute - Shift Id передается в запрос.ShiftName должен быть передан, чтобы заставить его работать.

Вот опция, которая будет использоваться в этом случае для передачи допустимых параметров:

cnn.Execute(sql, new { 
    Username = "here goes your username", 
    SSO = "here goes SSO", 
    ShiftName = "shift name" 
});

И запрос ниже (при условии, что вы используете SQL Server):

INSERT INTO [USER] (Username, SSO, ShiftWorkId) 
SELECT @Username, @SSO, Id
FROM ShiftWork 
WHERE ShiftName = @ShiftName

Примечание: Как правило, не рекомендуется писать сложные SQL с помощью Dapper ORM.

Создание SQL в вашихХорошие и чистые запросы обычно приводят к лучшему удобству обслуживания.

...