我正在尝试更新表格以记录访问者离开的时间和访问的状态。 我有一个datagridview通过选择一个单元格它获取整行的信息,然后获取来宾的ID,并设置离开时间和来访者的状态。 这是结帐方法:
private void CheckOutButton_Click(object sender, EventArgs e)
{
int outId = 0;
DateTime dT = (DateTime)selectRow.Cells[4].Value;
try
{
using (SqlCommand com = new SqlCommand("SELECT PersonID as ID from Person where Name = @Name AND Surname = @Surname AND IdNumber = @IdNumber AND DocType = @DocType", connect))
{
connect.Open();
com.Parameters.Add("@Name", SqlDbType.NVarChar).Value = selectRow.Cells[0].Value.ToString();
com.Parameters.Add("@Surname", SqlDbType.NVarChar).Value = selectRow.Cells[1].Value.ToString();
com.Parameters.Add("@DocType", SqlDbType.NVarChar).Value = selectRow.Cells[2].Value.ToString();
com.Parameters.Add("@IdNumber", SqlDbType.NVarChar).Value = selectRow.Cells[3].Value.ToString();
com.ExecuteNonQuery();
SqlDataReader r = com.ExecuteReader();
r.Read();
outId = Int32.Parse(r["ID"].ToString());
r.Close();
connect.Close();
}
MessageBox.Show(outId.ToString());
using (SqlCommand command = new SqlCommand("UPDATE Visits SET Out = @Leaving , State = @State FROM Visits WHERE PersonID = @PersonID AND Out is NULL AND Entrance = @Entrance", connect))
{
connect.Open();
command.Parameters.Add("@PersonID", SqlDbType.Int).Value = outId;
command.Parameters.Add("@Leaving", SqlDbType.DateTime).Value = DateTime.Now;
command.Parameters.Add("@Entrance", SqlDbType.DateTime).Value = dT;
command.Parameters.Add("@State", SqlDbType.Bit).Value = 0;
string query = command.CommandText;
foreach (SqlParameter p in command.Parameters)
{
query = query.Replace(p.ParameterName, p.Value.ToString());
}
command.ExecuteNonQuery();
SqlTransaction trans = connect.BeginTransaction();
trans.Commit();
connect.Close();
}
goodCheckOut.Visible = true;
updateTable();
}
catch (SqlException exc)
{
MessageBox.Show(exc.Message);
}
}
这是表格设计:
CREATE TABLE [dbo].[Visits](
[PersonID] [int] NOT NULL,
[CompanyID] [int] NOT NULL,
[Delivery] [bit] NOT NULL,
[Entrance] [datetime] NOT NULL,
[Out] [datetime] NULL,
[WorkerId] [int] NOT NULL,
[cardNumber] [int] NULL,
[VisitingCompany] [nvarchar](50) NOT NULL,
[State] [bit] NULL,
[Address] [nvarchar](50) NULL,
[Comment] [nvarchar](max) NULL,
PRIMARY KEY CLUSTERED
(
[PersonID] ASC,
[Entrance] ASC
)
我可能做错了什么?
答案 0 :(得分:2)
您的查询是错误的,因此我怀疑这会使它发生故障(或者采取与您尝试实现的方式不同的方式):
您需要的是它(它将使用提供的值更新与过滤器匹配的所有记录):
function checkedUsers() {
$('#quantity_wanted').val($(':checkbox:checked').length);
$('.product-message').val(
$(":checkbox:checked").map(function () {
return this.value;
}).get().join(', ')
);
}
这是你的
UPDATE [Table] SET [field assignment] WHERE [filter]
此查询类型的查询从与过滤器匹配的UPDATE [table1] SET [field assignment] FROM [table2] WHERE [filter]
条记录中更新table1
条记录。 这种查询不适用于您的情况,它们通常在where子句中具有table2
或1-to-1
关系设置,以清楚地指示正在从哪些记录中更新哪些记录。
答案 1 :(得分:0)
问题出在其他地方。 添加新人员时,我无法正确检查该人员是否已添加。这样,当尝试添加新的访问时,总是会得到编号较低的人。
感谢您提供的所有提示和帮助。