【问题标题】:I'm having a SQL Insert issue in my gridview我的 gridview 中出现 SQL 插入问题
【发布时间】:2014-09-19 00:45:30
【问题描述】:

我设置了一个 gridview 以允许插入到表的下一行,但我有一个问题......我有 2 个插入语句和一个在插入后更新表视图的选择语句完毕。我将值插入到两个表中...第一个表更新人员信息,第二个表更新旅行时间表以将它们包含在旅行中。

第二个语句是我遇到问题的地方...当将新记录插入数据库时​​,会自动为一个人创建一个新的PersonID,因为我将它设置为 @ 的 PK 和标识符987654322@ 表,但我不确定如何将新创建的PersonID 插入到TripSchedule 表中。

这是我插入新用户的代码:

protected void AddNewCustomer(object sender, EventArgs e)
{
    string nFirstName = ((TextBox)GridView1.FooterRow.FindControl("txtFirstName")).Text;
    string nLastName = ((TextBox)GridView1.FooterRow.FindControl("txtLastName")).Text;
    string nEmergency = ((TextBox)GridView1.FooterRow.FindControl("txtEmergency")).Text;
    string nCell = ((TextBox)GridView1.FooterRow.FindControl("txtCell")).Text;
    string nAge = ((TextBox)GridView1.FooterRow.FindControl("txtAge")).Text;
    string nActivityCard = ((TextBox)GridView1.FooterRow.FindControl("txtActivityCard")).Text;
    string nInitials = ((TextBox)GridView1.FooterRow.FindControl("txtInitials")).Text;
    string nBoat = ((TextBox)GridView1.FooterRow.FindControl("txtBoat")).Text;
    string nGroup = ((TextBox)GridView1.FooterRow.FindControl("txtGroup")).Text;

    SqlConnection con = new SqlConnection(strConnString);
    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "insert into Person(FirstName, LastName, Emergency#, Cell#, Age, ActivityCard, CraftType, Initials, Group#) " +
        "values(@FirstName, @LastName, @Emergency, @Cell, @Age, @ActivityCard, @Boat, @Initials, @Group);" +
        "insert into TripSchedule(TripType, PersonID, Time, Date) values ('" + ddlTripType.SelectedItem + "', WHAT GOES HERE?, '" + ddlTripTime.SelectedItem + "', '" + TextBox1.Text + "');" + 
        "SELECT Person.PersonID, Person.FirstName AS FirstName, Person.LastName AS LastName, Person.Emergency# AS Emergency#, Person.Cell# AS Cell#, Person.Age AS Age, " +
        "Person.ActivityCard AS ActivityCard, Person.CraftType AS CraftType, Person.Initials AS Initials, Person.Group# AS Group# " +
        "FROM Person INNER JOIN " +
        "TripSchedule ON Person.PersonID = TripSchedule.PersonID where TripSchedule.Date = '" + TextBox1.Text + "' and " +
        "TripSchedule.Time = '" + ddlTripTime.SelectedItem + "' and TripSchedule.TripType = '" + ddlTripType.SelectedItem + "';";

    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = nFirstName;
    cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = nLastName;
    cmd.Parameters.Add("@Emergency", SqlDbType.NChar).Value = nEmergency;
    cmd.Parameters.Add("@Cell", SqlDbType.NChar).Value = nCell;
    cmd.Parameters.Add("@Age", SqlDbType.NChar).Value = nAge;
    cmd.Parameters.Add("@ActivityCard", SqlDbType.NChar).Value = nActivityCard;
    cmd.Parameters.Add("@Initials", SqlDbType.NChar).Value = nInitials;
    cmd.Parameters.Add("@Boat", SqlDbType.VarChar).Value = nBoat;
    cmd.Parameters.Add("@Group", SqlDbType.VarChar).Value = nGroup;

    GridView1.DataSource = GetData(cmd);
    GridView1.DataBind();
}

【问题讨论】:

  • 查看 SQL Server 的 SCOPE_IDENTITY() 函数以取回 PersonID。更好的是,请查看 @marc_s 对此的回答以及您应该考虑的更多内容。

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


【解决方案1】:

我个人会将其拆分为至少两个SqlCommand 调用——一个插入Person,另一个插入TripSchedule。另外:您应该在所有地方都使用参数化查询 - 而不仅仅是某些地方(而不是其他地方......)。

要获取新插入的 PersonID,请使用 SCOPE_IDENTITY() 调用 - 如下所示:

SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "INSERT INTO dbo.Person(FirstName, LastName, Emergency#, Cell#, Age, ActivityCard, CraftType, Initials, Group#) " +
                  "VALUES(@FirstName, @LastName, @Emergency, @Cell, @Age, @ActivityCard, @Boat, @Initials, @Group);" +
                  "SELECT SCOPE_IDENTITY();";

cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = nFirstName;
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = nLastName;
cmd.Parameters.Add("@Emergency", SqlDbType.NChar).Value = nEmergency;
cmd.Parameters.Add("@Cell", SqlDbType.NChar).Value = nCell;
cmd.Parameters.Add("@Age", SqlDbType.NChar).Value = nAge;
cmd.Parameters.Add("@ActivityCard", SqlDbType.NChar).Value = nActivityCard;
cmd.Parameters.Add("@Initials", SqlDbType.NChar).Value = nInitials;
cmd.Parameters.Add("@Boat", SqlDbType.VarChar).Value = nBoat;
cmd.Parameters.Add("@Group", SqlDbType.VarChar).Value = nGroup;

conn.Open();
int newPersonID = (int)cmd.ExecuteScalar();
conn.Close();

由于这个SqlCommand 调用只返回一行一列(新插入的PersonID),您可以轻松地使用.ExecuteScalar() 方法 - 并且您将返回新插入的PersonID 作为结果称呼。现在您可以将数据插入到TripSchedule 表中(同样:请在此调用中也使用所有参数!)。

或者:将这一切包装成一个存储过程,在内部处理所有这些 T-SQL 功夫。

或者更好:在这些日子和时代,我个人会切换到像实体框架这样的 ORM 以使这一切更容易

【讨论】:

  • 您能否解释一下存储过程的使用,或者指点我一个很好的资源,以便我可以更深入地研究它?另外,我认为对下拉列表进行参数化查询并不是完全必要的,而且这个应用程序只会面向内部。
  • @user3267755,即使是内部应用程序也可能受到滥用。参数化查询可能不是完全必要的,因为您可以在没有它的情况下获得工作结果;但参数化查询始终是可取的。在这里避免一个只会鼓励您应该避免的危险做法 - 没有真正的收益。
  • @j0e3gan 注意到了。我会尽快改变这些。你有什么好的材料或信息可以用来设置存储过程吗?甚至我可以从使用一个中受益?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2011-07-19
  • 2016-02-20
  • 1970-01-01
  • 2016-02-17
  • 2020-05-07
  • 1970-01-01
相关资源
最近更新 更多