0

Excel シートを SQL Server データベースにインポートしています。Excel シートには id|data|passport という 3 つの列が含まれています。SqlBulkCopy を使用しています。

{
    SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString);

string[] filePaths = null;
string strFileType = null;
string strFileName = null;
string strNewPath = null;
int fileSize;
int flag=0;

protected void Page_Load(object sender, EventArgs e)
{

}



protected void Button1_Click1(object sender, EventArgs e)
{
    strFileType = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();
    strFileName = FileUpload1.PostedFile.FileName.ToString();
    FileUpload1.SaveAs(Server.MapPath("~/Import/" + strFileName + strFileType));
    strNewPath = Server.MapPath("~/Import/" + strFileName + strFileType);
    fileSize = FileUpload1.PostedFile.ContentLength / 1024;

    //EXCEL DETAILS TABLE
    con.Open();
    //=========================================
    DataTable dt8 = new DataTable();
    SqlCommand cmd8 = new SqlCommand("insert into exceldetails (name,type,details,size)" + "values(@name,@type,@details,@size)", con);
    cmd8.Parameters.Add("@name", SqlDbType.VarChar).Value = strFileName;
    cmd8.Parameters.Add("@type", SqlDbType.VarChar).Value = strFileType;
    cmd8.Parameters.Add("@details", SqlDbType.VarChar).Value = DateTime.Now;
    cmd8.Parameters.Add("@size", SqlDbType.Int).Value = fileSize;
    cmd8.ExecuteNonQuery();
    con.Close();
    try
    {
        SqlDataAdapter da8 = new SqlDataAdapter(cmd8);
        da8.Fill(dt8);
    }
    catch { }
    //=========================================

    //CHOOSING EXCEL CONNECTIONSTRING

    string excelConnectionString = "";
    switch (strFileType)
    {
        case ".xls":

            excelConnectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strNewPath + "; Extended Properties=Excel 8.0;");
            break;
        case ".xlsx":
            {
                excelConnectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strNewPath + "; Extended Properties=Excel 12.0 Xml;");

                break;
            }
    }

    //===================================
    //PRE EXCEL COUNT

    // Create Connection to Excel Workbook
    using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
    {
        connection.Open();
        OleDbCommand command = new OleDbCommand("Select ID,Data,passport 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 * from excelsheet", 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 * from [Sheet1$]", connection);
        try
        {
            OleDbDataAdapter olda = new OleDbDataAdapter(olcmd);
            olda.Fill(oltlb); //excel table datatable
        }
        catch { }

        //==============================


        using (DbDataReader dr = command.ExecuteReader())
        {
            // SQL Server Connection String
            string sqlConnectionString = "Data Source=DITSEC3;Initial Catalog=test;Integrated Security=True";

            con.Open();
            DataTable dt7 = new DataTable();
            dt7.Load(dr);
            DataRow[] ExcelRows = new DataRow[dt7.Rows.Count];
            DataColumn[] ExcelColumn = new DataColumn[dt7.Columns.Count];

            //=================================================
            for (int i1 = 0; i1 < ExcelRows.Length; i1++)
            {

                if(string.IsNullOrEmpty(ExcelRows[i1]["passport"].ToString()))
                {
                    ExcelRows[i1]["passport"]="0";

                }

                string a = Convert.ToString(ExcelRows[i1]["passport"]);
                char a1 = a[0];

                if (a1 >= 'A' || a1 <= 'Z')
                {
                    Label12.Text = "CAPITAL";
                    break;
                }
                else
                {
                    Label12.Text = "notgood";


                    flag = flag + 1;

                }

            }
            //=========================================================

            if (flag == 0)
            {
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
                {
                    bulkCopy.DestinationTableName = "ExcelTable";
                    dt7.Rows.CopyTo(ExcelRows, 0);

                    //==========================================================================================
                    for (int i = 0; i < ExcelRows.Length; i++)
                    {
                        if (ExcelRows[i]["passport"] == DBNull.Value)
                        {
                            ExcelRows[i]["passport"] = 0;
                        }

                    }
                    bulkCopy.WriteToServer(ExcelRows);
                    //==========================================================================================
                    for (int i = 0; i < ExcelRows.Length; i++)
                    {
                        if (ExcelRows[i]["data"] == DBNull.Value)
                        {
                            // Include any actions to perform if there is no date
                            //ExcelRows[i]["data"] = Convert.ToDateTime("0");
                        }
                        else
                        {
                            DateTime oldDate = Convert.ToDateTime(ExcelRows[i]["data"]).Date;
                            DateTime newDate = Convert.ToDateTime(oldDate).Date;
                            ExcelRows[i]["data"] = newDate.ToString("yyyy/MM/dd");
                        }

                    }

                    //==========================================================================================
                }
                //======

            }
            else
            {
                Label13.Text = "Wrong Format";
            }
        }

    }
}
}

エラー AT : string a = ExcelRows[i1]["passport"].ToString(); エラー: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

また、パスポートの比較を削除した後にこれを実行すると、データベースの最初の行が null になることにも注意してください。

4

1 に答える 1

4

このコードを見てください:

    DataRow[] ExcelRows = new DataRow[dt7.Rows.Count];
    DataColumn[] ExcelColumn = new DataColumn[dt7.Columns.Count];

    for (int i1 = 0; i1 < ExcelRows.Length; i1++)
    {
        if(string.IsNullOrEmpty(ExcelRows[i1]["passport"].ToString()))

まったく入力 していませんExcelRows。すべての要素が null である配列を作成しました。したがって、もちろん ExcelRows[0]["passport"]例外がスローされます。

dt7.Rowsデータの取得に使用しないのはなぜですか?

さらに:

  • このコードは、最初からプレゼンテーション層にあるべきではありません
  • 空の catch ブロックを避ける
  • コードをより小さなメソッドにリファクタリングしてみてください
  • 一貫した命名スタイルを使用し、理想的camelCaseには変数名に使用します
  • 変数にもっと意味のある名前を付けてください -あなたにとってdt7本当の意味は何ですか?
  • using接続、コマンドなどにステートメントを使用する
于 2012-11-01T07:42:01.400 に答える