2017-09-18 22 views
0

DataTableからコピーした後の各列の合計を示すSQLテーブルのフッター行を追加しようとしていますが、ここに示す合計値とは対照的に-1の値を取得し続けます。いくつかの列を計算された合計で除算してパーセンテージを取得します。私のコードは以下の通りです。SQLテーブルの列の合計を取得する方法は?

ありがとうございます!

 using (SqlConnection dbConnection = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\evxaf4\Documents\Data.mdf;Integrated Security=True;Connect Timeout=30")) 
     { 
      dbConnection.Open(); 

      // create table if not exists 
      string createTableQuery = @"Create Table [DesignQuantitiesTable] 
        (ElementType varchar(200) , GrossVol real, NetVol real, GrossArea real, NetArea real, percgrosvol real, percnetvol real)"; 
      SqlCommand command = new SqlCommand(createTableQuery, dbConnection); 
      command.ExecuteNonQuery(); 


      // Copy the DataTable to SQL Server Table using SqlBulkCopy 

      using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) 
      { 
       s.DestinationTableName = "dbo.DesignQuantitiesTable"; 
       //foreach (var column in m_elementInformation.Columns) 
       // s.ColumnMappings.Add(column.ToString(), column.ToString()); 
       s.WriteToServer(m_elementInformation); 
      } 

      SqlCommand sumgvol = new SqlCommand("SELECT SUM(GrossVol) FROM DesignQuantitiesTable", dbConnection); 
      double sumgrosvol = sumgvol.ExecuteNonQuery(); 

      SqlCommand sumnvol = new SqlCommand("SELECT SUM(NetVol) FROM DesignQuantitiesTable", dbConnection); 
      double sumnetvol = sumnvol.ExecuteNonQuery(); 


      SqlCommand sumgarea = new SqlCommand("SELECT SUM(GrossArea) FROM DesignQuantitiesTable", dbConnection); 
      double sumgrosarea = sumgarea.ExecuteNonQuery(); 

      SqlCommand sumnarea = new SqlCommand("SELECT SUM(NetArea) FROM DesignQuantitiesTable", dbConnection); 
      double sumnetarea = sumnarea.ExecuteNonQuery(); 


      SqlCommand sumrow = new SqlCommand("Insert into DesignQuantitiesTable (ElementType, GrossVol, NetVol, GrossArea, NetArea) values ('"+ "Total" +"',"+ sumgrosvol.ToString() +","+ sumnetvol.ToString()+","+ sumgrosarea.ToString() +","+ sumnetarea.ToString() +")", dbConnection); 
      sumrow.ExecuteNonQuery(); 

      SqlCommand percentgvol = new SqlCommand("UPDATE DesignQuantitiesTable SET percgrosvol=(" + "GrossVol/sumgrosvol" + ")" , dbConnection); 
      percentgvol.ExecuteNonQuery(); 

      SqlCommand percentnvol = new SqlCommand("UPDATE DesignQuantitiesTable SET percnetvol=(" + "NetVol/sumgrosvol" + ")", dbConnection); 
      percentnvol.ExecuteNonQuery(); 


      dbConnection.Close(); 

     } 
+0

はこれを試してみてください?一括コピー後にテーブルにデータがある場合は、DBで直接確認しましたか? –

+0

バルクコピーで挿入されたデータが実際にテーブルに選択されてバックアウトされることを検証できますか?あなたのコードなしで、データベースに対してselect sum(...)sqlを直接実行するとどうなりますか? –

+0

はい、私は自分のDBをチェックしてテーブルにすべてのデータを持っていますが、適切な合計値を得ることはできませんでした(添付写真をチェックしてください)! – zizobiko25

答えて

0

あなたはExecuteNonQueryメソッドを使用して、あなたが照会される列の合計を得ることはありません - 例えば更新&挿入 - これは非クエリコマンドによって影響を受けた列数を返します。クエリはどの列にも影響しないので、-1が返される可能性があります。 (ExecuteNonQuery returns -1参照)。

単一の値を戻したい場合は、ExecuteScalarQuery(https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx)を使用する必要があります。変換が必要なオブジェクト(ここではキャストが機能します)を正しい結果の型に戻します。あなたは-1を得る

SqlCommand sumnvol = new SqlCommand("SELECT SUM(NetVol) FROM DesignQuantitiesTable", dbConnection); 
double sumnetvol = (double)sumnvol.ExecuteScalarQuery(); 

など

関連する問題