Dapper使用where子句插入外键ID

时间:2019-06-25 19:53:55

标签: c# winforms sqlite dapper

我有几个模型: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; }
}

我还有选择和插入数据的类。到目前为止,我已经能够找到我想做的所有事情的解决方案,但是似乎无法插入要尝试做的User中的内容。

我希望能够将ShiftWorkId插入到User表中,但是我需要从Winform文本框中的ShiftName获取ID。

到目前为止,我的努力基本上是这样的:

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 个答案:

答案 0 :(得分:5)

发生这种情况的原因实际上有很多:

1)在给出的两个查询中,在ID之前使用'@'字符。 @字符仅在您向查询提供变量并且无法解析变量时使用。

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

注意: 通常,使用Dapper ORM编写复杂的SQL并不是一个好习惯。

使Dapper查询中的SQL简洁美观通常会带来更好的可维护性。