代码之家  ›  专栏  ›  技术社区  ›  Javy26

在c#按钮上单击Excel到SQL Server Express

  •  -1
  • Javy26  · 技术社区  · 8 年前

    单击按钮,我试图将excel文件导出到SQL Server表。首先,我创建了我的第一个按钮,它将在单击时创建表:

    private void button1_Click(object sender, EventArgs e)
    {
        string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
        string query = "CREATE TABLE [dbo].[" + textBox1.Text + "](" + "[Code] [varchar] (7) NOT NULL," +
           "[Description] [varchar] (38) NOT NULL," + "[NDC] [varchar] (12) NULL, " +
           "[Supplier Code] [varchar] (38) NOT NULL," + "[UOM] [varchar] (8) NULL," + "[Size] [varchar] (8) NULL,)";
    
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(query, connection);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
    }
    

    我的下一个函数应该是抓取excel文件的函数 OpenFileDialog ,选择它,然后将相关内容上传到从上面的“我的”按钮创建的表中。这是功能的重要部分:

    private void button2_Click(object sender, EventArgs e)
    {
        OpenFileDialog ope = new OpenFileDialog();
        ope.Filter = "Excel Files |*.xlsx;*.xlsm";
    
        if (ope.ShowDialog() == DialogResult.Cancel)
            return;
    
        FileStream stream = new FileStream(ope.FileName, FileMode.Open);
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
        DataSet result = excelReader.AsDataSet();
    
        DataClasses1DataContext conn = new DataClasses1DataContext();
    
        foreach (DataTable table in result.Tables)
        {
            foreach (DataRow dr in table.Rows)
            {
                test addtable = new test()
                    {
                        test_id = Convert.ToString(result[0]);
                        test_name = Convert.ToString(dr[1]);
                    };
                conn.tests.inInsertOnSubmit(addtable);
            }
        }
    }
    

    我的问题是它可以工作,但目前只有在我用c#代码单击第一个按钮创建的表创建关系时,它才能工作。例如,假设我的SQL Server表中有标题为“test_id”和“test-name”的列名。然后我必须抓取该表,将其放入我的C#代码中,并匹配列名。这将非常不方便,因为我的目标是用户单击按钮创建一个表,然后每次想要从某些记录中读取数据时导出到该表。我想消除数据库管理员的交互。我想做的是创建一个表,并将excel文件导出到同一个表中,而无需在代码中创建某种关系。附加信息:所有单独的excel工作表每次都具有相同的列集。保持不变。不知道这是否有帮助

    1 回复  |  直到 8 年前
        1
  •  1
  •   Javy26    8 年前

    我终于让它起作用了,对任何可能遇到它的人来说。我所做的只是将文件类型更改为.csv文件,而不是excel扩展名。Excel提供了太多问题。下面是通过单击按钮导出MSSQL表的函数:

     private void button2_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True");
            string filepath = textBox2.Text; //"C:\\Users\\jdavis\\Desktop\\CRF_105402_New Port Maria Rx.csv";
            StreamReader sr = new StreamReader(filepath);
            string line = sr.ReadLine();
            string[] value = line.Split(',');
            DataTable dt = new DataTable();
            DataRow row;
            foreach (string dc in value)
            {
                dt.Columns.Add(new DataColumn(dc));
            }
    
            while (!sr.EndOfStream)
            {
                value = sr.ReadLine().Split(',');
                if (value.Length == dt.Columns.Count)
                {
                    row = dt.NewRow();
                    row.ItemArray = value;
                    dt.Rows.Add(row);
                }
            }
            SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
            bc.DestinationTableName = textBox1.Text;
            bc.BatchSize = dt.Rows.Count;
            con.Open();
            bc.WriteToServer(dt);
            bc.Close();
            con.Close();
        }