我有几个模型: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插入到用户表中,但是我需要从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)在显示的两个查询中,在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简洁美观通常会带来更好的可维护性。

关于c# - Dapper使用where子句插入外键ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56761133/

10-11 22:37
查看更多