Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否向数据库中添加一行而不是多行?_C#_Asp.net_Sql Server_Stored Procedures_Repeater - Fatal编程技术网

C# 是否向数据库中添加一行而不是多行?

C# 是否向数据库中添加一行而不是多行?,c#,asp.net,sql-server,stored-procedures,repeater,C#,Asp.net,Sql Server,Stored Procedures,Repeater,因此,目前我的代码动态地将数据从VisualStudio中继器添加到数据库中。我下面的代码运行良好,除了一个主要问题。在我的foreach循环中,它为每个Repeater文本框创建一个新行。相反,我希望它总共创建一行 例如,我的中继器可以将FirstName和LastName作为列。在我的中继器中,它可以收集这些数据,比如约翰的名字和史密斯的姓氏。它应该在表的一行中输入John Smith,但实际上它将John添加为第1行,将Smith添加为第2行 我怎样才能解决这个问题 以下是我动态将数据添加

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

例如,我的中继器可以将FirstName和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

这是因为您将每个字段分隔为insert。按照这种方式,您必须将第一个作为插入,另一个作为更新

请注意:

'INSERT into Registrant(DateCreated,EventId,FormId,'+ 
        (@ColumnName) +') values (CURRENT_TIMESTAMP, @EventId, @FormId, @ColumnValue)
@ColumnName
是可变的,每次只插入一个字段


可能您从某个示例中获得了该代码,但不适合您的程序。您需要重新编写代码来执行您尝试执行的操作,在一处插入所有字段,或者如果行all ready存在,则运行UPDATE命令。

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

如果我执行insert,然后执行UPDATE路由,是否有办法在初始插入后获取该行id?否则,我无法确定如何更新正确的行。请查看我编辑的代码。我创建了一个插入,然后进行了更新。仍然在多个列中放置。。。我这里遗漏了一些东西。有没有办法避免使用foreach?我认为我需要循环遍历中继器中的每个项,以便动态地获取字段。这是正确的,但您应该在读取一行所需的所有值后执行存储过程。当前,您为从中继器读取的每个参数执行它,并期望它创建一行。