0

OleDb を使用して datagridview から SQL Server データベースに Excel シートを挿入しようとしています。

私が使用するコード:

namespace importfromexcel
{
  public partial class Form1 : Form
  {
     SqlConnection conn = new SqlConnection("Data Source=HAMNDOSH-PC\\SQLEXPRESS;Initial    Catalog=mohammed;Integrated Security=True");
  //  SqlCommand cmd;

     public Form1()
     {
        InitializeComponent();
     }

     OpenFileDialog ofd = new OpenFileDialog();

     private void button2_Click(object sender, EventArgs e)
     {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = ofd.FileName;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string excelConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;data source=" + ofd.FileName + @";Extended Properties=Excel 8.0;";
        // Create Connection to Excel Workbook

        //We can Import excel to sql server like this
        using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
        {
            OleDbCommand command = new OleDbCommand("Select fname,lname FROM [sheet1$]", connection);

            connection.Open();

            // Create DbDataReader to Data Worksheet 
            using (DbDataReader dr = command.ExecuteReader())
            {
                // SQL Server Connection String 
                string sqlConnectionString = "Data Source=HAMNDOSH-PC\\SQLEXPRESS;Initial Catalog=mohammed;Integrated Security=True";
                //  SqlCommand cmd;

                // Bulk Copy to SQL Server 
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
                {
                    bulkCopy.DestinationTableName = "test";
                    bulkCopy.WriteToServer(dr);
                }
            }
        }
    }
  }
}

私のデータベース名は :mohammedで、テーブル名はtest2 つの列firstnamelastname、Excel シートの列はfnameand lname..

問題は、コードを実行し、button1 をクリックしたときに button2 から Excel シートを挿入した後、ウィンドウ エラーが発生したことです。

vshot32-clr2.exe が動作を停止しました

何か助けてください??

4

3 に答える 3

0

それが根本的な原因であるかどうかはわかりませんが、ダイアログで有効なファイルが選択されているという保証がない場合は、イベントで参照ofd.FileNameしています。Clickその値をテキストボックスに保存しているので、次のように変更します。

string excelConnectionString = 
    @"Provider=Microsoft.Jet.OLEDB.4.0;data source=" 
          + textBox1.Text 
          + @";Extended Properties=Excel 8.0;";

また、一括コピーを実装する前に、テストとしてデータをクエリできることを確認します(たとえば、テキストファイルに書き込むことによって)。また、を指定しない限り、ソースデータはまったく同じ構造(列の順序を含む)である必要があることに注意してくださいColumnMapping

于 2012-12-05T15:46:38.960 に答える
0

SqlサーバーにはSql Server Data Toolsと呼ばれるインポートツールがあります...そこには、Excelファイルからインポートするアクティビティがあります...非常に「エンドユーザー」の取引です。つまり、ドラッグアンドドロップですべてを構成できます基本...

于 2012-12-05T15:54:25.117 に答える
0

Excel 接続文字列の拡張プロパティで、HDR=YES および IMEX=1 を設定することができます。HDR=YES は、Excel シートの最初の行を読み取り、各セルに格納されているデータを列名として読み取ります。IMEX=1 は、各セルのデータ型に関係なくデータを挿入するように JET に指示します。

私が自分で書いたこのコードを見てください、それはあなたを助けるかもしれません.

        //ExcelDA Class
        public ExcelDA()
    {
        connString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + ofd.FileName + "; Extended Properties=" + '"' + "Excel 8.0; HDR=Yes; IMEX=1" + '"';
    }

    /// <summary>
    /// Method used to retrieve a datatable from excel sheet
    /// </summary>
    public DataTable GetProductsExcel()
    {
        StringBuilder excBuilder = new StringBuilder();
        excBuilder.Append("SELECT * FROM [Sheet1$];");
        //
        try
        {
            return ExecuteSqlStatement(excBuilder.ToString());
        }
        catch (Exception) 
        { 
            MessageBox.Show("Error retreiving data");
            return null;
        }
    }
    private DataTable ExecuteSqlStatement(string command)
    {
        using (OleDbConnection conn = new OleDbConnection(connString))
        {
            try
            {
                conn.Open();
                using (OleDbDataAdapter adaptor = new OleDbDataAdapter(command, conn))
                {
                    DataTable table = new DataTable();
                    adaptor.Fill(table);
                    return table;
                }
            }
            catch (SqlException e)
            {
                throw e;
            }
        }
    }
    //SqlDA class
    public void ExecuteSQLCommand(string comm)
    {
        try
        {
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                conn.Open();

                using (SqlCommand command = new SqlCommand(comm, conn))
                {
                    command.ExecuteNonQuery();
                }
            }
        }
        catch (ArgumentOutOfRangeException ex)
        {
            throw ex;
        }

        catch (ArgumentException ex)
        {
            throw ex;
        }
        catch (SqlException ex) { throw ex; }
    }
    public void AddNames(string fName, string sName)
    {
          StringBuilder sqlQuery = new StringBuilder();
          //build sql insert statement here
          ExecuteSQLCommand(sqlBuilder.ToString());
    }

    //Program class
    ExcelDA reader = new ExcelDA();
    DataTable names = reader.GetSuppliersExcel();
    //string array to store excel row data for names
    string[] arr2 = new string[2] { "", ""};
        //recursive loop to retrieve each row and values from each rows columns
        foreach (DataRow row in suppliers.Rows)
        {
            for (int i = 0; i < names.Columns.Count; i++)
            {
                if (i == (names.Columns.Count - 1))
                {
                    arr2[i] = (row[i].ToString());
                }
                else
                {
                    arr2[i] = (row[i].ToString());
                }
            }
        }

            try
            {
                sql.AddNames(arr2[0], arr2[1]);
                Console.WriteLine("Added Data to SQL");
            }
            catch (Exception) { }
于 2012-12-05T16:09:53.993 に答える