Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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# SQL Server或C中列中的行组_C#_Sql Server - Fatal编程技术网

C# SQL Server或C中列中的行组

C# SQL Server或C中列中的行组,c#,sql-server,C#,Sql Server,我正在使用SQL Server 2014和.NET 4.5,用C语言编程 我正在导入一个Excel表格,其中包含一些动态列和相应的数据,并保存到数据库中。到目前为止,我是成功的,但一些数据显示在网格中我遇到了一个问题 导入数据屏幕: 我尝试了一些事情,但没有成功 数据保存到数据库中。直到totalPh是下一个记录开始后的一个记录: 预期结果 此网站提供了一些帮助Hmm您可以尝试以下内容: SQL端的解决方案 --drop cached TempCacheTable if exists and c

我正在使用SQL Server 2014和.NET 4.5,用C语言编程

我正在导入一个Excel表格,其中包含一些动态列和相应的数据,并保存到数据库中。到目前为止,我是成功的,但一些数据显示在网格中我遇到了一个问题

导入数据屏幕:

我尝试了一些事情,但没有成功

数据保存到数据库中。直到totalPh是下一个记录开始后的一个记录:

预期结果


此网站提供了一些帮助

Hmm您可以尝试以下内容: SQL端的解决方案

--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
CREATE TABLE [#TempCacheTable] ( [Index] [int] IDENTITY(1,1) NOT NULL ) 

DECLARE @fName nvarchar(30), @val nvarchar(30);
DECLARE @columns nvarchar(max) = '', @col nvarchar(max) = '', @sql varchar(max) = '', @valStr nvarchar(max) = '';
DECLARE @first bit = 1, @counter int = 0;

--create cursor to loop through @TempTable
        DECLARE Column_Cur CURSOR
            FOR SELECT FieldName, FieldValue FROM AttImportDetail WHERE AttImportID = 1;

            OPEN Column_Cur;
                FETCH NEXT FROM Column_Cur INTO @fName, @val;
                    WHILE @@FETCH_STATUS = 0
                    BEGIN

                        --set the dynamic column
                        IF @first = 1 BEGIN                         
                            SET @col = '[' + @fName + '] nvarchar(20)';
                            SET @columns = '[' + @fName + ']';
                            SET @valStr = @val;
                            SET @first = 0;
                        END ELSE BEGIN                          
                            SET @col = @col + ', [' + @fName + '] nvarchar(20)';
                            SET @columns = @columns + ', ' + '[' + @fName + ']';
                            SET @valStr = @valStr + ', ' + @val;
                        END

                        -- or you can filter by column name
                        IF @fName = 'TotalP' BEGIN
                          --  SET @col = @col + ', [' + @fName + '] int';
                        END                                         

                      -- break cursor after all 12 columns
                       IF @counter = 12 BEGIN
                          BREAK;
                       END
                        SET @counter = @counter + 1;                    

                        FETCH NEXT FROM Column_Cur INTO @fName, @val;
                    END

            CLOSE Column_Cur;
        DEALLOCATE Column_Cur;    

SELECT @sql = 'ALTER TABLE #TempCacheTable ADD ' + @col
--execute to apply the change to #TempCacheTable
EXEC(@sql);    


SET @sql = 'INSERT INTO #TempCacheTable (' + @columns + ') VALUES (' + @valStr + '); 
SELECT * FROM #TempCacheTable;';
EXEC(@sql);

--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
如果希望列行在TotalPH之后停止。然后在到达TotalPH列后停止此光标。 应用这些列,并创建第二个游标,用它收集值数据,并在每行结束于TotalPH之后将其插入TempCacheTable。然后它会按照你想要的那样列出它

以下是新更新的工作代码示例:

DECLARE @temp TABLE (
    AttImportID int,
    FieldName nvarchar(20),
    FieldValue nvarchar(20)
)

INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'EmbCode', 'FA160620');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '1', 'PH');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '2', 'K');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '3', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '4', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '5', 'WO');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '6', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '7', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '8', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '9', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '10', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalP', '18');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalPH', '0,5');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'EmbCode', 'FA160621');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '1', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '2', 'H');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '3', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '4', 'WO');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '5', 'WO');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '6', 'K');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '7', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '8', 'PH');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '9', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, '10', 'P');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalP', '21');
INSERT INTO @temp (AttImportID, FieldName, FieldValue) VALUES (1, 'TotalPH', '26');  


--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
CREATE TABLE [#TempCacheTable] ( [Index] [int] IDENTITY(1,1) NOT NULL ) 

DECLARE @fName nvarchar(30), @val nvarchar(30);
DECLARE @columns nvarchar(max) = '', @col nvarchar(max) = '', @sql varchar(max) = '', @valStr nvarchar(max) = '';
DECLARE @first bit = 1, @counter int = 0;

--create cursor to loop through @TempTable
        DECLARE Column_Cur CURSOR
            FOR SELECT FieldName, FieldValue FROM @temp WHERE AttImportID = 1;

            OPEN Column_Cur;
                FETCH NEXT FROM Column_Cur INTO @fName, @val;
                    WHILE @@FETCH_STATUS = 0
                    BEGIN

                        --set the dynamic column
                        IF @first = 1 BEGIN                         
                            SET @col = '[' + @fName + '] nvarchar(20)';
                            SET @columns = '[' + @fName + ']';
                            SET @valStr = '''' + @val + '''';
                            SET @first = 0;
                        END ELSE BEGIN                          
                            SET @col = @col + ', [' + @fName + '] nvarchar(20)';
                            SET @columns = @columns + ', ' + '[' + @fName + ']';
                            SET @valStr = @valStr + ', ''' + @val + '''';
                        END                                     

                      -- break cursor after all 12 columns
                       IF @counter = 12 BEGIN
                          BREAK;
                       END
                        SET @counter = @counter + 1;                    

                        FETCH NEXT FROM Column_Cur INTO @fName, @val;
                    END

            CLOSE Column_Cur;
        DEALLOCATE Column_Cur;

SELECT @sql = 'ALTER TABLE #TempCacheTable ADD ' + @col
--execute to apply the change to #TempCacheTable
EXEC(@sql);    

SET @sql = 'INSERT INTO #TempCacheTable (' + @columns + ') VALUES (' + @valStr + '); 
SELECT * FROM #TempCacheTable;';
EXEC(@sql);

--drop cached TempCacheTable if exists and create new
IF OBJECT_ID('tempdb..#TempCacheTable') IS NOT NULL DROP TABLE #TempCacheTable;
因此,您只需创建第二个游标,在其中根据第一个游标为每一行进行插入,它将为您提供所需的内容。

我是通过C代码完成的

// select FieldName,FieldValue from AttImportDetail where AttImportID =1
    private DataTable GenerateTransposedTable(DataTable inputTable)
    {
        DataTable outputTable = new DataTable();

        DataTable distinct = inputTable.DefaultView.ToTable(true, "FieldName"); // get unique column name

        int Columns = distinct.Rows.Count; // get unique column count 
        int rows = inputTable.Rows.Count / distinct.Rows.Count; // count no of rows

        //  create datatable with unique column name 
        foreach (DataRow inRow in distinct.Rows)
        {
            string newColName = inRow[0].ToString();
            outputTable.Columns.Add(newColName);
        }

        for (int i = 0; i < rows; i++)
        {
            DataRow newRow = outputTable.NewRow();
            for (int c = 0; c < outputTable.Columns.Count; c++)
            {
                int rowsCount = i*outputTable.Columns.Count + c;
                string colValue = inputTable.Rows[rowsCount]["FieldValue"].ToString();
                string FieldName = inputTable.Rows[rowsCount]["FieldName"].ToString();
                newRow[FieldName] = colValue;
            }
            outputTable.Rows.Add(newRow);
        }
        return outputTable;
    }

你真的只有两条select语句吗?还是你想把他们联系起来?看看sql,你得到了你想要的。从上面显示的数据,例如Attimportid=1,你有两行FieldName=2,一行是FieldValue K,另一行是H,你如何识别哪个属于哪个empcode?你自己尝试过什么?这不是一个代码编写服务。我在这里遇到问题,每32行在一行上,如何引入每个组行的列这里有一些帮助我得到错误消息2705,级别16,状态3,每个表中的第1行列名必须是唯一的。表“TempCacheTable”中的列名“TotalP”被指定了多次。我们不能硬编码totalPh,此字段可以是任何内容,但我们可以从AttImportDetail中使用select distinct GroupRows=FieldName,其中AttImportID=1。由于列名重复出现,因此会出现此错误。只需在光标指向该列后停止。如果不能按列名停止,但coulmn的数量始终保持不变,则可以使用计数器作为停止。数到所有列,然后停止。并应用列。然后创建另一个游标,收集变量中每一行的数据,并将其插入每个圆之后。插入所有数据后,您只需从TempCacheTable中选择所有数据。我在cursor中工作了一周,我已经编写了上面相同的代码,您能检查一下吗。只是我在为i=0分配数据时遇到了问题。。。。。。。。循环中
// select FieldName,FieldValue from AttImportDetail where AttImportID =1
    private DataTable GenerateTransposedTable(DataTable inputTable)
    {
        DataTable outputTable = new DataTable();

        DataTable distinct = inputTable.DefaultView.ToTable(true, "FieldName"); // get unique column name

        int Columns = distinct.Rows.Count; // get unique column count 
        int rows = inputTable.Rows.Count / distinct.Rows.Count; // count no of rows

        //  create datatable with unique column name 
        foreach (DataRow inRow in distinct.Rows)
        {
            string newColName = inRow[0].ToString();
            outputTable.Columns.Add(newColName);
        }

        for (int i = 0; i < rows; i++)
        {
            DataRow newRow = outputTable.NewRow();
            for (int c = 0; c < outputTable.Columns.Count; c++)
            {
                int rowsCount = i*outputTable.Columns.Count + c;
                string colValue = inputTable.Rows[rowsCount]["FieldValue"].ToString();
                string FieldName = inputTable.Rows[rowsCount]["FieldName"].ToString();
                newRow[FieldName] = colValue;
            }
            outputTable.Rows.Add(newRow);
        }
        return outputTable;
    }