表未在C#上更新

时间:2018-07-17 09:16:21

标签: c# .net sql-server visual-studio

我正在尝试更新表格以记录访问者离开的时间和访问的状态。 我有一个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
   )

我可能做错了什么?

2 个答案:

答案 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子句中具有table21-to-1关系设置,以清楚地指示正在从哪些记录中更新哪些记录。

答案 1 :(得分:0)

问题出在其他地方。 添加新人员时,我无法正确检查该人员是否已添加。这样,当尝试添加新的访问时,总是会得到编号较低的人。

感谢您提供的所有提示和帮助。