【问题标题】:Excel to SQL Server Express on c# button click在 c# 按钮上单击 Excel 到 SQL Server Express
【发布时间】:2016-11-15 20:12:34
【问题描述】:

单击按钮时,我正在尝试将 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();
    }
}

我的下一个功能应该是通过OpenFileDialog获取excel文件的功能,选择它,然后将相关内容上传到我点击上面的按钮创建的表格中。这是该功能的重要部分:

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 工作表每次都将具有相同的列集。保持不变。不知道有没有帮助

【问题讨论】:

  • 你的意思是excel表头总是不匹配列名吗?
  • 不,我的意思是接收到的任何 excel 文件都将始终相同,但在这个程序的情况下,我正在研究如何将 excel 文件导出到数据库,而无需在其中创建任何先前的关系我的 C# 代码。所以本质上我正在寻找如何将 excel 文件导出到 MSSQL 表
  • 每个excel文件需要一个表还是所有文件共享同一个表?
  • 每人一个。这将是一个过程,例如客户端 A 想要上传文件。他们只需输入文件名,然后单击第一个函数中的按钮,然后创建表,然后单击另一个按钮将 excel 文件导出到新创建的表中。然后当另一天到来并且需要上传另一个文件时,这将是相同的过程。 @mcNets
  • 对不起,您使用的是 LinQ to SQL 类吗?

标签: c# sql-server excel sql-server-express


【解决方案1】:

对于任何可能遇到此问题的人,我终于让它工作了。我所做的只是将我的文件类型更改为 .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();
    }

【讨论】:

    猜你喜欢
    • 2016-01-10
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多