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