C# 表未在C上更新#
我正在尝试更新一个表,以注册访客离开的时间和访问状态。 我有一个datagridview,通过选择一个单元格,它获取整行的信息,然后获取访问者的de ID,并设置访问者的离开时间和状态。 以下是签出方法:C# 表未在C上更新#,c#,.net,sql-server,visual-studio,C#,.net,Sql Server,Visual Studio,我正在尝试更新一个表,以注册访客离开的时间和访问状态。 我有一个datagridview,通过选择一个单元格,它获取整行的信息,然后获取访问者的de ID,并设置访问者的离开时间和状态。 以下是签出方法: private void CheckOutButton_Click(object sender, EventArgs e) { int outId = 0; DateTime dT = (DateTime)selectRow.Ce
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
)
我可能做错了什么?您的查询是错误的,因此我怀疑这会导致它出现故障(或者以与您尝试实现的方式不同的方式进行操作): 您需要的是(它使用提供的值更新与筛选器匹配的所有记录): 你有的是这个
UPDATE [table1] SET [field assignment] FROM [table2] WHERE [filter]
此查询类型的查询从与筛选器匹配的
table2
记录更新table1
记录这种类型的查询不适用于您的情况,它们通常在where子句中设置了1对1
或1对多
关系,以清楚地指示哪些记录正在从哪些记录更新。您的查询是错误的,因此我怀疑这会导致它出现故障(或者更确切地说,以一种不同于你试图实现的方式行事):
您需要的是(它使用提供的值更新与筛选器匹配的所有记录):
你有的是这个
UPDATE [table1] SET [field assignment] FROM [table2] WHERE [filter]
此查询类型的查询从与筛选器匹配的
table2
的记录更新table1
的记录。此查询类型不适用于您的情况,它们通常在where子句中设置了1对1
或1对多
关系,以明确指示哪些记录正在更新d从哪个记录中。问题出在另一个地方。
当添加一个新的人时,我不能正确地检查这个人是否已经被添加。因此,当尝试添加一个新的访问时,它总是得到编号较低的人
感谢您提供的所有提示和帮助。问题出在其他地方。 当添加一个新的人时,我不能正确地检查这个人是否已经被添加。因此,当尝试添加一个新的访问时,它总是得到编号较低的人
感谢您提供的所有提示和帮助。您的实际问题是什么?它是否引发异常?我尝试将设置为当前时间,将状态设置为true,但它不会改变任何内容。完全没有更改。我将编辑问题以使其清晰。好的,那么您做了哪些调试?您是否在调试模式下运行它并检查段落是否正确正在使用您期望的值绑定仪表值?数据库中是否确实有匹配的行?如果您在SQL中使用与C#代码使用的参数相同的值手动运行查询,它是否按预期工作?我尝试运行它以查看它是否获取了正确的用户ID,并尝试更改表上的值但我不知道为什么,我没有试着改变我想从“访问”中删除的东西在SQL语句中。您的实际问题是什么?它是否引发异常?我尝试将设置为“当前时间”,将状态设置为“真”,但它不会改变任何内容。完全没有更改。我将编辑问题以使其清晰确定,那么您做了什么调试?是否在调试模式下运行它并检查参数值是否绑定到u使用您期望的值?数据库中是否确实有匹配的行?如果您在SQL中使用与C代码使用的参数相同的值手动运行查询,它是否按预期工作?我尝试运行它以查看它是否获取正确的用户ID,并尝试更改表上的值,但我不知道为什么,不是吗在SQL语句中,我需要运行alter来删除“FROM visions”中我想要删除的内容。