2015-12-12 38 views
5

我想通過c#中的Windows窗體應用程序上傳excel文件,並且想要將數據導入數據庫(Mysql服務器)。我怎樣才能做到這一點???我創建了一個表單,它要求我將一個excel文件上傳到mysql數據庫中。它向數據庫表格批量插入數據。如何使用c#窗體窗體應用程序將excel文件上傳到sql數據庫表

我的Excel文件中包含類似的用戶ID,密碼,名字,姓氏,USER_GROUP和 MySQL數據庫表(aster_users)包含許多列像用戶ID,密碼,名字,姓氏,USER_GROUP,隊列,活躍,CREATED_DATE,CREATED_BY,角色列..

我需要將該excel文件上傳到我的數據庫,其他列將變爲空或空這不是問題。

我的外形設計 enter image description here

這裏是我的C#代碼:

using MySql.Data.MySqlClient; 
using System; 
using System.Data.SqlClient; 
using System.Windows.Forms; 

namespace UploadFileToDatabase 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent();  
    } 

    String MyConString = "SERVER=******;" + 
      "DATABASE=dbs;" + 
      "UID=root;" + 
      "PASSWORD=pwsd;" + "Convert Zero Datetime = True"; 
private void BtnSelectFile_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog dlg = new OpenFileDialog(); 
     dlg.Filter = "Text files | *.csv"; 
     if (dlg.ShowDialog() == DialogResult.OK) 
     { 
      string fileName; 
      fileName = dlg.FileName; 
      txtfilepath.Text = fileName; 
     } 
     } 

private void btnUpload_Click(object sender, EventArgs e)   
{     
    string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtfileparth.Text + ";Extended Properties=\"Excel 12.0;HDR=YES;\""; 

     using (OleDbConnection connection = 
       new OleDbConnection(connectionString)) 
     { 
      OleDbCommand command = new OleDbCommand 
        ("Select * FROM [Sheet1$]", connection); 

      connection.Open(); 

      using (DbDataReader dr = command.ExecuteReader()) 
      { 
       string sqlConnectionString = MyConString; 

       using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString)) 
       { 
        bulkCopy.ColumnMappings.Add("[userid]", "userid"); 
        bulkCopy.ColumnMappings.Add("password", "password"); 
        bulkCopy.ColumnMappings.Add("first_name", "first_name"); 
        bulkCopy.ColumnMappings.Add("last_name", "last_name"); 
        bulkCopy.ColumnMappings.Add("user_group", "user_group"); 
        bulkCopy.DestinationTableName = "aster_users"; 
        bulkCopy.WriteToServer(dr); 
        MessageBox.Show("Upload Successfull!"); 
       } 
      } 

     } 
} 

這裏是我tried.i是如何得到這樣的

信息的錯誤信息:外部表格不是預期的格式。

在這一行connection.Open();。如何才能做到這一點?

回答

5
enter image description here

using System; 
using System.Data; 
using System.Data.OleDb; 
using System.Data.SqlClient; 
using System.Windows.Forms; 

namespace IMPORT 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    String MyConString = "SERVER=******;" + 
      "DATABASE=db;" + 
      "UID=root;" + 
      "PASSWORD=pws;"; 

private void btnSelectFile_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog openfiledialog1 = new OpenFileDialog(); 
     openfiledialog1.ShowDialog(); 
     openfiledialog1.Filter = "allfiles|*.xls"; 
     txtfilepath.Text = openfiledialog1.FileName; 
    } 
private void btnUpload_Click(object sender, EventArgs e) 
{ 
string path = txtfilepath.Text; 

     string ConnString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties = Excel 8.0"; 

     DataTable Data = new DataTable(); 

     using (OleDbConnection conn =new OleDbConnection(ConnString)) 
     { 
      conn.Open(); 

      OleDbCommand cmd = new OleDbCommand(@"SELECT * FROM [dataGridView1_Data$]", conn); 
      OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 
      adapter.Fill(Data); 

      conn.Close(); 
     } 
     string ConnStr = MyConString; 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnStr)) 
     { 
      bulkCopy.DestinationTableName = "TABLE NAME"; 
      bulkCopy.ColumnMappings.Add("userid", "userid"); 
      bulkCopy.ColumnMappings.Add("password", "password"); 
      bulkCopy.ColumnMappings.Add("first_name", "first_name"); 
      bulkCopy.ColumnMappings.Add("last_name", "last_name"); 
      bulkCopy.ColumnMappings.Add("user_group", "user_group"); 
      bulkCopy.WriteToServer(Data); 
      MessageBox.Show("UPLOAD SUCCESSFULLY"); 
     } 
    } 
} 

一個例子發現http://technico.qnownow.com/bulk-copy-data-from-excel-to-destination-db-using-sql-bulk-copy/ ERROR: Additional information: External table is not in the expected format

+0

這是您的解決方案還是您再次發佈錯誤? –

1

有一個awesome link展示瞭如何上傳從Excel C#的DataTable ...在情況下,鏈接死我分享....程序

的差異版本Excel的連接字符串:

private string Excel03ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"; 
private string Excel07ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=YES'"; 

文件選擇事件:

private void BtnSelectFile_Click(object sender, EventArgs e) 
    { 
     DataTable dt; 
     OpenFileDialog dlg = new OpenFileDialog(); 
     dlg.Filter = "Excel files | *.xls"; 
     if (dlg.ShowDialog() == DialogResult.OK) 
     { 
      string filePath = dlg.FileName; 
      string extension = Path.GetExtension(filePath); 
      string conStr, sheetName; 

      conStr = string.Empty; 
      switch (extension) 
      { 

       case ".xls": //Excel 97-03 
        conStr = string.Format(Excel03ConString, filePath); 
        break; 

       case ".xlsx": //Excel 07 to later 
        conStr = string.Format(Excel07ConString, filePath); 
        break; 
      } 

      //Read Data from the Sheet. 
      using (OleDbConnection con = new OleDbConnection(conStr)) 
      { 
       using (OleDbCommand cmd = new OleDbCommand()) 
       { 
        using (OleDbDataAdapter oda = new OleDbDataAdapter()) 
        { 
         dt = new DataTable(); 
         cmd.CommandText = "SELECT * From [Sheet1$]"; 
         cmd.Connection = con; 
         con.Open(); 
         oda.SelectCommand = cmd; 
         oda.Fill(dt); 
         con.Close(); 
        } 
       } 
      } 
      //Save the datatable to Database 
      string sqlConnectionString = MyConString; 
      if(dt != null) 
      {     
      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString)) 
      { 
       bulkCopy.ColumnMappings.Add("[userid]", "userid"); 
       bulkCopy.ColumnMappings.Add("password", "password"); 
       bulkCopy.ColumnMappings.Add("first_name", "first_name"); 
       bulkCopy.ColumnMappings.Add("last_name", "last_name"); 
       bulkCopy.ColumnMappings.Add("user_group", "user_group"); 
       bulkCopy.DestinationTableName = "aster_users"; 
       bulkCopy.WriteToServer(dt); 
       MessageBox.Show("Upload Successfull!"); 
      } 
      } 
     } 
} 

然後,你可以將數據表保存到MySQL數據庫,我希望你知道該怎麼做......如果你不能再合作我會盡我所能來幫助你。謝謝

希望這有助於....

+1

如果該鏈接不會消亡,那麼這個答案就那麼有用。你能在你的答案中包含該鏈接的相關內容嗎? (儘管如此,仍然引用來源,如你所做的) –

+0

謝謝格蘭特....我會發布鏈接的內容.... – khaled4vokalz

+0

謝謝,那會更好。我甚至看到MSDN上的內容鏈接消失或者連續好幾天都沒有了。 –

2

ஆர்த்தி,

使用下面的連接字符串的格式

string File = sResponsedExcelFilePath; 

string result = Path.GetFileName(sFilePath);  

ExcelReaderConnString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + File +"\\"+ result + ";Extended Properties=Excel 12.0;"); 

希望這對你的作品。

+2

抱歉不方便。在運行程序時出現錯誤(附加信息:Microsoft Office Access數據庫引擎無法打開或寫入文件'C:\'。它已由另一用戶獨佔打開,或者您需要查看和編寫它的權限數據)。爲麻煩抱歉。 – Arthi

+1

請將文件放置在除C:之外的其他驅動器中。如果打開它,關閉Excel文件。 –

1
using System; 
using System.Data; 
using System.Data.OleDb; 
using System.Data.SqlClient; 
using System.Windows.Forms; 

namespace IMPORT 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    String MyConString = "SERVER=******;" + 
      "DATABASE=db;" + 
      "UID=root;" + 
      "PASSWORD=pws;"; 

private void btnSelectFile_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog openfiledialog1 = new OpenFileDialog(); 
     openfiledialog1.ShowDialog(); 
     openfiledialog1.Filter = "allfiles|*.xls"; 
     txtfilepath.Text = openfiledialog1.FileName; 
    } 
private void btnUpload_Click(object sender, EventArgs e) 
{ 
string path = txtfilepath.Text; 

     string ConnString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties = Excel 8.0"; 

     DataTable Data = new DataTable(); 

     using (OleDbConnection conn =new OleDbConnection(ConnString)) 
     { 
      conn.Open(); 

      OleDbCommand cmd = new OleDbCommand(@"SELECT * FROM [dataGridView1_Data$]", conn); 
      OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 
      adapter.Fill(Data); 

      conn.Close(); 
     } 
     string ConnStr = MyConString; 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnStr)) 
     { 
      bulkCopy.DestinationTableName = "TABLE NAME"; 
      bulkCopy.ColumnMappings.Add("userid", "userid"); 
      bulkCopy.ColumnMappings.Add("password", "password"); 
      bulkCopy.ColumnMappings.Add("first_name", "first_name"); 
      bulkCopy.ColumnMappings.Add("last_name", "last_name"); 
      bulkCopy.ColumnMappings.Add("user_group", "user_group"); 
      bulkCopy.WriteToServer(Data); 
      MessageBox.Show("UPLOAD SUCCESSFULLY"); 
     } 
    } 
} 
相關問題