我有几个模型: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的尝试都给我带来错误。 感谢所有帮助
答案 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简洁美观通常会带来更好的可维护性。