2

これは私の2番目の投稿です。最初の投稿から、Linq to SQL を使用することの素晴らしさを学んだ後、Excel シートから SQL データベースにデータをインポートしてみようと思いました。

最初のマイ Excel シート:

つまり、4つの列が含まれています

  • 商品番号
  • アイテムサイズ
  • 商品価格
  • 販売台数

次のフィールドを持つデータベーステーブルを作成しました

table name ProductsSold
  Id int not null identity --with auto increment set to true
  ItemNo VarChar(10) not null
  ItemSize VarChar(4) not null
  ItemPrice Decimal(18,2) not null
  UnitsSold int not null

データベースに基づいて dal.dbml ファイルを作成しました。以下のコードを使用して、Excel シートから db テーブルにデータをインポートしようとしています。

ボタンをクリックするだけですべてが行われます。

   private const string forecast_query = "SELECT ItemNo, ItemSize, ItemPrice, UnitsSold FROM [Sheet1$]";

    protected void btnUpload_Click(object sender, EventArgs e)
    {
        var importer = new LinqSqlModelImporter();

        if (fileUpload.HasFile)
        {
            var uploadFile = new UploadFile(fileUpload.FileName);

            try
            {
                fileUpload.SaveAs(uploadFile.SavePath);
                if(File.Exists(uploadFile.SavePath))
                {
                    importer.SourceConnectionString = uploadFile.GetOleDbConnectionString();
                    importer.Import(forecast_query);
                    gvDisplay.DataBind();
                    pnDisplay.Visible = true;
                }
            }
            catch (Exception ex)
            {
                 Response.Write(ex.Source.ToString());
                lblInfo.Text = ex.Message;

            }
           finally
            {
                uploadFile.DeleteFileNoException();
            }


        }
    }

    // Now here is the code for LinqSqlModelImporter

     public class LinqSqlModelImporter : SqlImporter
{
    public override void Import(string query)
    {
        // importing data using oledb command and inserting into db using LINQ to SQL
        using (var context = new WSDALDataContext())
        {
            using (var myConnection = new OleDbConnection(base.SourceConnectionString))
            using (var myCommand = new OleDbCommand(query, myConnection))
            {
                myConnection.Open();
                var myReader = myCommand.ExecuteReader();
                while (myReader.Read())
                {
                    context.ProductsSolds.InsertOnSubmit(new ProductsSold()
                    {
                        ItemNo = myReader.GetString(0),
                        ItemSize = myReader.GetString(1),
                        ItemPrice = myReader.GetDecimal(2),
                        UnitsSold = myReader.GetInt32(3)

                    });

                }
            }

            context.SubmitChanges();
        }
    }

}

どこでエラーを起こしているのか、何かが欠けているのか誰か教えてください。

デバッグすると、このエラーが発生します

数値からキャストする場合、値は無限大よりも小さい数値でなければなりません

ほんとうにありがとう

4

1 に答える 1

2

いくつかのオプション:

  • myReader.GetValue(0)、などに監視を追加しmyReader.GetValue(1)て、ソース値が何であるかを確認します。エラーをスローしている行にブレークポイントを追加し、問題の原因となっている値を確認します。

  • オブジェクト初期化子を個別の呼び出しに変更して、どの列がエラーをスローしているかを確認します。

ProductSold product = new ProductsSold();
product.ItemNo = myReader.GetString(0);
product.ItemSize = myReader.GetString(1);
product.ItemPrice = myReader.GetDecimal(2);
product.UnitsSold = myReader.GetInt32(3);
context.ProductsSolds.InsertOnSubmit(product);
于 2012-07-10T21:13:02.013 に答える