excel是2013的,C#是VS2012的;excel 文件是在本機的D盤;

代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
namespace _20
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//IMEX:只有是0才能成功更新,1或2都有錯誤提示,操作必須使用一個可更新的查詢,2也有奇怪?
string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"d:/成績表2013.xlsx" + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=0'";
//string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:/成績表2013.xlsx;Extended Properties='Excel 12.0;HDR=YES;IMEX=0'";
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = "SELECT * FROM [Sheet1$]";
myConn.Open();
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(strCom, myConn);
DataSet myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet, "[Sheet1$]");
myConn.Close();
DataTable dt = myDataSet.Tables[0]; //初始化DataTable實例
dt.PrimaryKey = new DataColumn[] { dt.Columns["學生"] };//創建索引列
DataRow myRow = dt.NewRow();
myRow["學生"] = "小蟹";
myRow["英語"] = 82;
myRow["數學"] = 93;
myRow["自然"] = 39;
myRow["美術"] = 39;
dt.Rows.Add(myRow);
OleDbCommandBuilder odcb = new OleDbCommandBuilder(myDataAdapter);
odcb.QuotePrefix = "["; //用於搞定INSERT INTO 語句的語法錯誤
odcb.QuoteSuffix = "]";
myDataAdapter.Update(myDataSet, "[Sheet1$]"); //更新數據集對應的表
dataGridView1.DataSource = myDataSet.Tables[0].DefaultView; //顯示到datagridview
}
}
}
成功了,但有兩個問題:
1. 奇怪的是IMEX=0才能更新成功? IMEX=2卻不能,與如下原則違背:
當 IMEX=0 時為“寫出模式”,這個模式開啟的 Excel 檔案只能用來做“寫入”用途。
當 IMEX=1 時為“寫入模式”,這個模式開啟的 Excel 檔案只能用來做“讀取”用途。
當 IMEX=2 時為“混合模式”,這個模式開啟的 Excel 檔案可同時支援“讀取”與“寫入”用途。
照例說IMEX=2應該可以啊? 不知為什么上面語句我用IMEX=2就會發生“操作必須使用一個可更新的查詢”問題;
2.為什么一定要
odcb.QuotePrefix = "["; //用於搞定INSERT INTO 語句的語法錯誤
odcb.QuoteSuffix = "]";
我不知道加前綴和后綴的[,],對我的哪個代碼有用處,
需要路過的朋友指點一下
