【问题标题】:SQL Server stored procedure with condition带条件的 SQL Server 存储过程
【发布时间】:2016-05-14 19:44:45
【问题描述】:

当我在 C# 中按下 <asp:button> 时,我试图创建一个条件事件。

我有一个与两个数据库表相关的GridView(在 SQL Server 中)。我应该每天在其中一个中插入不同的值。

GridView里面:

  • 我有一个 BoundFieldID 用于数据库表中的每个项目
  • 我有两个带有文本框的TemplateFields,分别命名为StartGVEndGV

GridView外:

  • 我有一个<asp:TextBox> 和一个AjaxCalendarExtender。在那里我应该选择日期。文本框是TextDate

所以,当我按下<asp:button> 时,事件应该:

  • 检查Gridview 中的每一行(使用GridView 的第一列中的IDGridView 之外的文本框中选择的日期)如果该记录已存在于数据库中

    • 如果是,则应使用新值更新数据库记录
    • 如果否,则应插入带有值的新记录

我正在使用存储过程进行更新和插入。

这是 C# 中的代码:

protected void BotonSubmit_Click(object sender, EventArgs e)
{
        foreach (GridViewRow row in GridView1.Rows)
        {
            //HERE I SAVE THE TEXTBOXS FROM GRIDVIEW INSIDE A VARIABLE
            TextBox StartGV = row.FindControl("StartGV") as TextBox;
            TextBox EndGV = row.FindControl("EndGV") as TextBox;
            DateTime Date = DateTime.ParseExact(TextDate.Text, "MM/dd/yyyy", CultureInfo.InvariantCulture);

            //HERE I EXTRACT THE VALUE FROM THE FIRST COLUMN (THE ID)
            if (row.RowType == DataControlRowType.DataRow)
            {
                string ID = row.Cells[0].Text;

            //HERE I CHECK IF THE ROW ALREADY EXISTS IN DATABASE TABLE:

                //IF YES, UPDATE:
                if (CADCATOPS.CADBatchHandoff.CheckTableDB(Convert.ToInt32(ID), Convert.ToString(Date)))
                {
                    string connectionString = @"MY CONNECTION STRING";
                    SqlConnection Connection1 = null;
                    SqlTransaction Transaction1 = null;
                    {
                        Connection1 = new SqlConnection();
                        Connection1.ConnectionString = connectionString;
                        Connection1.Open();
                        Transaction1 = Connection1.BeginTransaction(System.Data.IsolationLevel.Serializable);
                        SqlCommand command1 = new SqlCommand("UPDATE", Connection1, Transaction1);
                        command1.CommandType = CommandType.StoredProcedure;
                        command1.Parameters.Clear();
                        command1.Parameters.AddWithValue("@Start", Convert.ToDateTime(StartGV.Text));
                        if (EndGV.Text != "")
                        {
                            command1.Parameters.AddWithValue("@End", Convert.ToDateTime(EndGV.Text));
                        }
                        command1.ExecuteNonQuery();
                        Transaction1.Commit();
                        Connection1.Close();
                    }
                }

                //IF NO, INSERT:
                if (!CADCATOPS.CADBatchHandoff.CheckTableDB(Convert.ToInt32(IDBatch), Convert.ToString(FechaCT1)))
                {
                    //FIRST OF ALL, CHECK IF THE "STARTGV" TEXTBOX IS NOT EMPTY. IF IT'S EMPTY, THE PROCESS WILL NOT START FOR THIS ROW.
                    if (StartGV.Text != "")
                    {
                        string connectionString = @"MY CONNECTION STRING";
                        SqlConnection Connection1 = null;
                        SqlTransaction Transaction1 = null;
                        {
                        Connection1 = new SqlConnection();
                        Connection1.ConnectionString = connectionString;
                        Connection1.Open();
                        Transaction1 = Connection1.BeginTransaction(System.Data.IsolationLevel.Serializable);
                        SqlCommand command1 = new SqlCommand("INSERT", Connection1, Transaction1);
                        command1.CommandType = CommandType.StoredProcedure;
                        command1.Parameters.Clear();
                        command1.Parameters.AddWithValue("@Start", Convert.ToDateTime(StartGV.Text));
                        if (EndGV.Text != "")
                        {
                            command1.Parameters.AddWithValue("@End", Convert.ToDateTime(EndGV.Text));
                        }
                        comando.Parameters.AddWithValue("@ID", Convert.ToInt32(ID));
                        comando.Parameters.AddWithValue("@DATE", Convert.ToDateTime(DATE.Text));
                        command1.ExecuteNonQuery();
                        Transaction1.Commit();
                        Connection1.Close();
                        }
                    }
                }
            }
        }
    }

所以,这是可行的,但出了点问题:

  • INSERT 条件工作正常。

  • UPDATE 无法正常工作:为进程选择的“StartGV”和 EndGV“值始终与最后一行相同。INSERT 进程不会发生这种情况。

为什么会这样?

编辑

我忘记在我的项目中显示SELECT 语句:

在表适配器中,我创建了这个查询,命名为CheckTableDB

SELECT COUNT(*) 
FROM BatchDatos 
WHERE (ID = @ID) and (DATE=@DATE)

然后,在 c# 中:

public static bool CheckTableDB(int ID, string DATE)
{
    return adapter.CheckTableDB(ID, DATE) != 0;
}

我将它用于UPDATEINSERTINSERT 工作正常,这意味着问题不在这里。

【问题讨论】:

  • 您没有在更新中使用 id。这可能会导致您的问题。
  • 是的,我正在使用它,在“如果存在”的条件下开始更新过程。我使用了“foreach”,这意味着 UPDATE 和 INSERT 在同一行中工作。然后我检查数据库中是否已经存在 ID 和日期。如果是,则更新该行,如果不是,则插入该行。
  • 在 UPDATE 中我不需要更新 ID(日期也不需要),这就是我不使用它的原因。
  • 您不需要更新 ID,但您需要根据ID在DB中找到一行。我错了吗?
  • 问题不在您的select 中。它在您的update 中。没有条件where你更新表中的所有行。

标签: c# asp.net sql-server gridview


【解决方案1】:

没有条件更新表中的所有行。您需要使用 GV 中的 ID 来更新数据库中的确切行。

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 2015-02-21
    • 2012-08-17
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多