【问题标题】:Add one row to database instead of multiple rows?向数据库添加一行而不是多行?
【发布时间】:2015-12-27 01:42:28
【问题描述】:

所以目前我的代码动态地将来自 Visual Studio 中继器的数据添加到数据库中。我下面的代码运行良好,除了一个主要问题。在我的 foreach 循环中,它为每个 Repeater 文本框创建一个新行。相反,我希望它总共创建 1 行。

例如,我的中继器可以将 FirstName 和 LastName 作为列。在我的中继器中,它可以收集这些数据,例如 John 用于 FirstName,Smith 用于 LastName。它应该在表格的一行中输入 John Smith,但实际上将 John 添加为第 1 行,将 Smith 添加为第 2 行。

我该如何解决这个问题?

这是我将数据动态添加到数据库的代码:

protected void BtnSubmit_Click(object sender, EventArgs e)
{
    using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Events2"].ConnectionString))
    {
        sqlConn.Open();

        using (SqlCommand sqlCmd = new SqlCommand())
        {

            foreach (RepeaterItem rpItem in RepeaterForm.Items)
            {

                Label lblDisplayName = rpItem.FindControl("lblDisplayName") as Label;
                Label lblColumnName = rpItem.FindControl("lblColumnName") as Label;
                TextBox txtColumnValue = rpItem.FindControl("txtColumnValue") as TextBox;

                if (txtColumnValue != null)
                {
                    sqlCmd.Connection = sqlConn;
                    sqlCmd.CommandType = CommandType.StoredProcedure;
                    sqlCmd.CommandText = "spInsFormRegistrant";
                    sqlCmd.Parameters.Clear();

                    sqlCmd.Parameters.Add("@EventId", SqlDbType.Int).Value = eventId;
                    sqlCmd.Parameters.Add("@FormId", SqlDbType.Int).Value = formId;
                    sqlCmd.Parameters.Add("@ColumnName", SqlDbType.NVarChar).Value = lblColumnName.Text;
                    sqlCmd.Parameters.Add("@ColumnValue", SqlDbType.NVarChar).Value = txtColumnValue.Text;

                    sqlCmd.ExecuteNonQuery();
                }
            }
        }
    }
    PnlNone.Visible = false;
    PnlExist.Visible = false;
    PnlSuccess.Visible = true;
    PnlFail.Visible = false;
}

存储过程代码:

ALTER PROCEDURE [dbo].[spInsFormRegistrant]
    -- Add the parameters for the stored procedure here
     @EventId int,
     @FormId int,
     @ColumnName varchar(100),
     @ColumnValue varchar(100)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

 -- Insert statements for procedure here
declare @Query nvarchar(4000)
declare @ParmDefinition nvarchar(500);

set @Query = 'INSERT into Registrant(DateCreated,EventId,FormId,'+ 
             (@ColumnName) +') values (CURRENT_TIMESTAMP, @EventId, @FormId, @ColumnValue)'
set @ParmDefinition = N'@ColumnValue varchar(100), @EventID int, @FormID int'
exec sp_executesql @Query, @ParmDefinition, 
                   @ColumnValue = @ColumnValue,
                   @EventID = @EventID,
                   @FormID = @FormID

END

编辑

ALTER PROCEDURE [dbo].[spInsFormRegistrant]
    -- Add the parameters for the stored procedure here
     @EventId int,
     @FormId int,
     @ColumnName varchar(100),
     @ColumnValue varchar(100)
AS

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @searchID int

 -- Insert statements for procedure here

IF  @searchID IS null
 BEGIN

declare @Query nvarchar(4000)
declare @ParmDefinition nvarchar(500)

    set @Query = 'INSERT into Registrant(DateCreated,EventId,FormId,'+ 
             (@ColumnName) +') values (CURRENT_TIMESTAMP, @EventId, @FormId, @ColumnValue)
                set @searchID = SCOPE_IDENTITY()'

    set @ParmDefinition = N'@ColumnValue varchar(100), @EventID int, @FormID int, @searchID INT OUTPUT'
    exec sp_executesql @Query, @ParmDefinition, 
                   @ColumnValue = @ColumnValue,
                   @EventID = @EventID,
                   @FormID = @FormID,
                   @searchID = @searchID OUTPUT;
END
IF  @searchID IS NOT null
BEGIN
declare @Query2 nvarchar(4000)
declare @ParmDefinition2 nvarchar(500)

    set @Query2 = 'UPDATE Registrant SET DateCreated = CURRENT_TIMESTAMP, EventId = @EventId, FormId = @FormId, ' +quotename(@ColumnName)+ ' =  @ColumnValue WHERE RegistrantId = @searchID'
    set @ParmDefinition2 = N'@ColumnValue varchar(100), @EventID int, @FormID int, @searchID int'
    exec sp_executesql @Query2, @ParmDefinition2, 
                   @ColumnValue = @ColumnValue,
                   @EventID = @EventID,
                   @FormID = @FormID,
                   @searchID = @searchID
END
 END

【问题讨论】:

    标签: c# asp.net sql-server stored-procedures repeater


    【解决方案1】:

    这是因为您为分隔的每个字段进行了插入。你这样做的方式,你必须将第一个作为插入,另一个作为更新。

    请注意:

    'INSERT into Registrant(DateCreated,EventId,FormId,'+ 
            (@ColumnName) +') values (CURRENT_TIMESTAMP, @EventId, @FormId, @ColumnValue)
    

    @ColumnName 是可变的,每次只插入一个字段!

    您可能从某个示例中获得该代码,但不适合您的程序。您需要重写代码以执行您尝试执行的操作,方法是在其中插入所有字段,或者如果已准备就绪的行存在,则运行 UPDATE 命令。

    【讨论】:

    • 如果我先插入然后更新路由,有没有办法在它进行初始插入后获取该行 ID?否则我将不确定如何更新正确的行
    • 请看我编辑的代码。我创建了一个插入然后更新。仍然在多个列中......我在这里遗漏了一些东西。
    【解决方案2】:

    那是因为您正在为转发器中的每个项目执行存储过程。

    【讨论】:

    • 有没有办法避免使用foreach?我相信我需要遍历转发器中的每个项目才能动态获取字段。
    • 这是正确的,但是一旦读取了一行所需的所有值,就应该执行存储过程。目前,您为从中继器读取的每个参数执行它,并期望它创建一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2019-09-22
    • 2014-09-11
    • 2018-07-15
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多