10

Excel シートをデータグリッドに読み込みました。そこから、グリッドの行を DataTable オブジェクトに読み込むことができました。DataTable オブジェクトにはデータがあります。これは、グリッドのデータソースをそのテーブル オブジェクトに等しくすると、グリッドにデータが入力されるためです。

私の問題:テーブルオブジェクトを使用し、SQLサーバーを使用してその値を操作したい(つまり、一時テーブルとして保存し、C#コード内からSQLクエリを使用して操作したい、別の結果整数を返したいグリッド。 (C# で一時テーブルを操作する方法がわかりません)

ボタンをクリックしたときに実行するコードは次のとおりです....

 SqlConnection conn = new SqlConnection("server = localhost;integrated security = SSPI");
//is connection string incorrect?

SqlCommand cmd = new SqlCommand();

//!!The method ConvertFPSheetDataTable Returns a DataTable object//
cmd.Parameters.AddWithValue("#table",ConvertFPSheetDataTable(12,false,fpSpread2_Sheet1));
//I am trying to create temporary table     

//Here , I do a query               
cmd.CommandText = "Select col1,col2,SUM(col7) From #table group by col1,col2 Drop #table";

SqlDataAdapter da = new SqlDataAdapter(cmd.CommandText,conn);
 DataTable dt = new DataTable();
da.Fill(dt); ***// I get an error here 'Invalid object name '#table'.'***

fpDataSet_Sheet1.DataSource = dt;

//**NOTE:** fpDataSet_Sheet1 is the grid control  
4

6 に答える 6

8

両方の場所で一時テーブルを#tableから##tableに変更します。

##を使用するということは、グローバルな一時テーブルが存在することを意味します。タスクが完了したら、ドロップする必要があります。

Command = "Drop Table ## table"

于 2008-10-31T00:51:15.150 に答える
4

データをデータベースに入れるには時間がかかります。データは既にメモリにあるので、おそらく LINQ-to-Objects (DataSetExtensions を使用) があなたの友達ですか? <int> などを正しい型に置き換えます...

        var query = from row in table.Rows.Cast<DataRow>()
                  group row by new
                  {
                      Col1 = row.Field<int>(1),
                      Col2 = row.Field<int>(2)
                  } into grp
                  select new
                  {
                      Col1 = grp.Key.Col1,
                      Col2 = grp.Key.Col2,
                      SumCol7 = grp.Sum(x => x.Field<int>(7))
                  };
        foreach (var item in query)
        {
            Console.WriteLine("{0},{1}: {2}",
                item.Col1, item.Col2, item.SumCol7);
        }
于 2008-10-15T14:37:33.810 に答える
3

それを作成するクエリ/ストアドプロシージャの範囲内にのみ存在するため、SQLで一時テーブルを作成できるとは思いません。

スプレッドシートが標準形式の場合、つまり、列がわかっていて常に同じである場合は、SQL でテーブルを作成してこのファイルを配置する必要があります。SqlBulkCopy と呼ばれる非常に高速な方法があります。

// Load the reports in bulk
SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString);
// Map the columns
foreach(DataColumn col in dataTable.Columns)
   bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
bulkCopy.DestinationTableName = "SQLTempTable";
bulkCopy.WriteToServer(dataTable);

ただし、問題を正しく理解している場合は、SQL サーバーを使用して DataTable のデータを変更する必要はありません。JET エンジンを使用してデータを取得できます。

    // For CSV
    connStr = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source={0};Extended Properties='Text;HDR=Yes;FMT=Delimited;IMEX=1'", Folder);
    cmdStr = string.Format("SELECT * FROM [{0}]", FileName);
    // For XLS
    connStr = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source={0}{1};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", Folder, FileName);
    cmdStr = "select * from [Sheet1$]";
OleDbConnection oConn = new OleDbConnection(connStr);
            OleDbCommand cmd = new OleDbCommand(cmdStr, oConn);
            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
            oConn.Open();
            da.Fill(dataTable);
            oConn.Close();

また、コードでは、接続文字列が正しいかどうかを尋ねます。私はそうではないと思います(しかし、私は間違っている可能性があります)。あなたがうまくいかない場合は、これを試してください。

connectionString="Data Source=localhost\<instance>;database=<yourDataBase>;Integrated Security=SSPI" providerName="System.Data.SqlClient"
于 2008-10-15T16:20:33.773 に答える
0

あなたが正確に何を望んでいるのか理解できていない場合は、ご容赦ください。
Excel シートで SQL クエリを実行する場合は、直接実行できます。

または、SQL Server を使用して Excel にクエリを実行することもできます (OPENROWSET またはすぐには覚えていない関数)。これを使用すると、SQL Server テーブルを Excel シートに結合できます。

マークの提案は、それを見るもう 1 つの方法です。

于 2008-10-15T14:46:00.207 に答える
0

おそらく、DataView を使用できます。既に持っている DataTable から作成します。

dv = new DataView(dataTableName);

次に、DataView のメソッドを使用して、データをフィルター処理 (SQL WHERE 句を適用) または並べ替えできます。Find を使用して一致する行を検索したり、FindRows を使用して一致するすべての行を検索したりすることもできます。

いくつかのフィルター:

dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
dv.RowFilter = "Description LIKE '*product*'"
dv.RowFilter = "employeeID IN (2,4,5)"

並べ替え:

dv.Sort = "City"

行の検索: 「John Smith」という名前の顧客を検索します。

   vals(0)= "John"
   vals(1) = "Smith"
   i = dv.Find(vals)

ここで、i は顧客を含む行のインデックスです。

これらを DataView に適用したら、グリッドを DataView にバインドできます。

于 2008-10-15T16:04:52.153 に答える
0

コマンド テキストを次のように変更します。

Select col1,col2,SUM(col7) From #table group by col1,col2

Select col1,col2,SUM(col7) From @#table group by col1,col2
于 2013-08-07T16:43:22.160 に答える