【发布时间】:2016-05-14 19:44:45
【问题描述】:
当我在 C# 中按下 <asp:button> 时,我试图创建一个条件事件。
我有一个与两个数据库表相关的GridView(在 SQL Server 中)。我应该每天在其中一个中插入不同的值。
GridView里面:
- 我有一个
BoundField和ID用于数据库表中的每个项目 - 我有两个带有文本框的
TemplateFields,分别命名为StartGV和EndGV
GridView外:
- 我有一个
<asp:TextBox>和一个AjaxCalendarExtender。在那里我应该选择日期。文本框是TextDate
所以,当我按下<asp:button> 时,事件应该:
-
检查
Gridview中的每一行(使用GridView的第一列中的ID和GridView之外的文本框中选择的日期)如果该记录已存在于数据库中- 如果是,则应使用新值更新数据库记录
- 如果否,则应插入带有值的新记录
我正在使用存储过程进行更新和插入。
这是 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;
}
我将它用于UPDATE 和INSERT。 INSERT 工作正常,这意味着问题不在这里。
【问题讨论】:
-
您没有在更新中使用 id。这可能会导致您的问题。
-
是的,我正在使用它,在“如果存在”的条件下开始更新过程。我使用了“foreach”,这意味着 UPDATE 和 INSERT 在同一行中工作。然后我检查数据库中是否已经存在 ID 和日期。如果是,则更新该行,如果不是,则插入该行。
-
在 UPDATE 中我不需要更新 ID(日期也不需要),这就是我不使用它的原因。
-
您不需要更新 ID,但您需要根据ID在DB中找到一行。我错了吗?
-
问题不在您的
select中。它在您的update中。没有条件where你更新表中的所有行。
标签: c# asp.net sql-server gridview