0

sqlbulkcopy を使用して sqlserver テーブルにアップロードしている Excel シートがあります。重複したエントリが無視されるようにデータベース テーブルにインデックスを適用しましたが、グリッド ビューで無視された重複したエントリも表示したいと考えています。

  protected void Button1_Click(object sender, EventArgs e)
{
    string strFileType = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();
    string strFileName = FileUpload1.PostedFile.FileName.ToString();

    FileUpload1.SaveAs(Server.MapPath("~/Import/" + strFileName + strFileType));
    string strNewPath = Server.MapPath("~/Import/" + strFileName + strFileType);






        string excelConnectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source="+strNewPath +"; Extended Properties=Excel 8.0;");

    //string excelConnectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\myFolder\\Book1.xls;" + "Extended Properties=Excel 8.0;"); 


        // Create Connection to Excel Workbook
        using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
        {
            connection.Open();
            OleDbCommand command = new OleDbCommand("Select ID,Data FROM [Sheet1$]", connection);
            OleDbCommand command1 = new OleDbCommand("select count(*) from [Sheet1$]",connection);

            //Sql Server Table DataTable
            DataTable dt4=new DataTable();
            SqlCommand cmd4 = new SqlCommand("select id,data from ExcelTable", con);
            try 
                { 
                    SqlDataAdapter da4 = new SqlDataAdapter(cmd4); 
                    da4.Fill(dt4);//sql table datatable
                 }
                catch { }


            //excelsheet datatable
            DataTable oltlb = new DataTable();
          OleDbCommand olcmd = new OleDbCommand("select id,data from [Sheet1$]", connection);
          try
          {
              OleDbDataAdapter olda = new OleDbDataAdapter(olcmd);
              olda.Fill(oltlb); //excel table datatable
          }
          catch { }

    var matched = (from table1 in dt4.AsEnumerable()
                         join table2 in oltlb.AsEnumerable() on
                       table1.Field<int>("ID") equals table2.Field<int>("ID")
                         where table1.Field<string>("Data") == table2.Field<string>("Data")
                         select table1);
          DataTable dthi5 = new DataTable();
          dthi5 = matched.CopyToDataTable();

          GridView1.DataSource = dthi5;
          GridView1.DataBind();
            GridView1.DataSource = matched.ToList();

エラー: 指定されたキャストは無効です。table1.Field("ID") は table2.Field("ID") に等しい

4

1 に答える 1

0

いずれかのテーブルの ID フィールドが int ではないようです。

どちらかまたは両方が推測するのではなく、両方のテーブル (oltlb と dt4) の最初の列のデータ型を調べて、どちらが整数以外のデータ型であるかを確認してください。実は両方かもしれません。

ここに問題があります: 文字列の値が数値リテラルであっても、文字列を int にキャストすることはできません。使用するInt32.ParseConvert.ToInt32、変換する必要があります。したがって、テーブルの 1 つに ID 列の文字列型がある場合、次のように表現します。

table1.Field<int>("ID") equals Convert.ToInt32(table2.Field<string>("ID"))

両方のテーブルに文字列 ID フィールドがある場合は、次のように表現できます。

table1.Field<string>("ID") equals table2.Field<string>("ID")
于 2012-10-25T17:16:29.727 に答える