【问题标题】:Excel to SQL Server - C#Excel 到 SQL Server - C#
【发布时间】:2017-06-16 21:27:03
【问题描述】:

想法:

  • 读取 XLS 并在 Microsoft SQL 上上传数据

问题:

  • 只有第一列被上传到数据库

我的代码:

  private void button1_Click(object sender, EventArgs e) {
   // string path = @"XXXX\xls_test\Book1.xlsx";
   string path = @ "XXXX\xls_test\Book1.xlsx";
   ImportDataFromExcel(path);
  }


  public void ImportDataFromExcel(string excelFilePath) {
   //declare variables - edit these based on your particular situation 
   string ssqltable = "Table1";
   // make sure your sheet name is correct, here sheet name is sheet1, so you can change your sheet name if have    different 
   string myexceldataquery = "select student from [Sheet1$]";
   try {


    //create our connection strings 
    //string sexcelconnectionstring = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFilePath +  ";" + "Extended Properties=" + "\"Excel 8.0; HDR=Yes; IMEX=1;\"";
    string sexcelconnectionstring = @ "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= XXXX\xls_test\Book1.xlsx" + ";" + "Extended Properties=Excel 12.0";

    string ssqlconnectionstring = "XXXX";
    //execute a query to erase any previous data from our destination table 
    string sclearsql = "delete from " + ssqltable;
    SqlConnection sqlconn = new SqlConnection(ssqlconnectionstring);
    SqlCommand sqlcmd = new SqlCommand(sclearsql, sqlconn);
    sqlconn.Open();
    sqlcmd.ExecuteNonQuery();
    sqlconn.Close();
    //series of commands to bulk copy data from the excel file into our sql table 
    OleDbConnection oledbconn = new OleDbConnection(sexcelconnectionstring);
    OleDbCommand oledbcmd = new OleDbCommand(myexceldataquery, oledbconn);

    oledbconn.Open();
    OleDbDataReader dr = oledbcmd.ExecuteReader();
    SqlBulkCopy bulkcopy = new SqlBulkCopy(ssqlconnectionstring);
    bulkcopy.DestinationTableName = ssqltable;
    while (dr.Read()) {
     bulkcopy.WriteToServer(dr);
    }
    dr.Close();
    oledbconn.Close();
    MessageBox.Show("File imported into sql server.");
   } catch (Exception ex) {
    //handle exception
    MessageBox.Show(ex.ToString());
    MessageBox.Show("Enter exception");
   }
  }

数据库上的表:

CREATE TABLE [dbo].[Table1](
    [student] [varchar](50) NULL,
    [rollno] [int] NULL,
    [course] [varchar](50) NULL
) ON [PRIMARY]
GO

如果您想访问 XLS 和 DB 示例中的 2 张图片: https://drive.google.com/drive/folders/0B98UpTa2n4XbeHZtOHU2cVotUms?usp=sharing

最后,这段代码的大部分内容来自: https://code.msdn.microsoft.com/office/Import-Excel-Spreadsheet-2b7ca7cf#content 我做了一点改动,但大多数想法都来自这些链接。

欢迎任何帮助!谢谢你。

【问题讨论】:

    标签: c#


    【解决方案1】:

    有点猜测,但你有:

    string myexceldataquery = "select student from [Sheet1$]";
    

    然后你说

    只有第一列被上传到数据库

    如果您只在列上进行选择,这似乎是完全可以预料的。

    也许也可以选择您想要的其他字段(我猜他们!):

    string myexceldataquery = "select student, rollno, course from [Sheet1$]";
    

    【讨论】:

    • 哇,这对我来说太幼稚了!是的,你的猜测是问题所在。谢谢!
    【解决方案2】:

    如果您对您的 excel 文件执行另存为并将其转换为 .csv 文件,这对您来说会容易得多。然后您可以使用 TextFieldParser 并将分隔符设置为逗号。

    using (TextFieldParser parser = new TextFieldParser(csvFilePath))
    {
        Dictionary<string, CustomRecord> csvDictionary = new Dictionary<string, CustomRecord>();
    
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        while (!parser.EndOfData)
        {
            //write to custom record
        }
    

    稍后只需将 CustomRecord 写入数据库。

    foreach (KeyValuePair<string, CustomRecord> kvp in CustomRecord)
    {
        //sql insert statement here using the key values from the dictionary as your sql values)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多