我在尝试向现有的表对象中插入行时遇到了困难。下面是我的代码片段:
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\myExcelFile.xlsx" + ";Extended Properties=\"Excel 12.0;ReadOnly=False;HDR=Yes;\"";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
string insertQuery = String.Format("Insert into [{0}$] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);
cmd.CommandText = insertQuery;
cmd.ExecuteNonQuery();
cmd = null;
conn.Close();
}
结果,我在一个现成的表对象下面插入了行:
我还尝试过在表对象中插入数据,如下所示:
string insertQuery = String.Format("Insert into [{0}$].[MyTable] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);
但我得到一个错误:
Microsoft Access数据库引擎找不到对象'MyTable‘。请确保该对象存在,并且正确拼写其名称和路径名称。如果'MyTable‘不是本地对象,请检查您的网络连接或与服务器管理员联系。
如您所见,名为MyTable
的表确实存在。如果有人能解开这个谜团,我将不胜感激。
发布于 2016-07-27 01:59:35
如果您使用的是Microsoft.ACE.OLEDB
提供程序,请注意它不支持命名范围。您需要提供工作表[Sheet1$]
的名称或工作表的名称,后跟范围[Sheet1$A1:P7928]
。如果未提供范围,则会将表定义为已使用的范围,其中可能包含空行。
处理空行的一种方法是删除它们,但是驱动程序不支持DELETE
操作。
另一种方法是首先计算具有非空Id
的行数,然后使用结果为INSERT
语句定义表的范围:
using (OleDbConnection conn = new OleDbConnection(connectionString)) {
conn.Open();
string SheetName = "Sheet1";
string TableRange = "A1:P{0}";
// count the number of non empty rows
using (var cmd1 = new OleDbCommand(null, conn)) {
cmd1.CommandText = String.Format(
"SELECT COUNT(*) FROM [{0}$] WHERE ID IS NOT NULL;"
, SheetName);
TableRange = string.Format(TableRange, (int)cmd1.ExecuteScalar() + 1);
}
// insert a new record
using (var cmd2 = new OleDbCommand(null, conn)) {
cmd2.CommandText = String.Format(
"INSERT INTO [{0}${1}] (ID, Title, NTV_DB, Type) VALUES(7959, 8,'e','Type1');"
, SheetName, TableRange);
cmd2.ExecuteNonQuery();
}
}
发布于 2016-07-24 23:48:21
如果执行以下代码:
var contents = new DataTable();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(string.Format("Select * From [{0}$]", TabDisplayName), conn))
{
adapter.Fill(contents);
}
Console.WriteLine(contents.Rows.Count);//7938
您将看到7938 (屏幕截图上的最后一行编号)。当您插入新行时,它插入到7939位置。(7929,7930,...)中的内容为空行被忽略,因为excel知道最后一个数字是7938。
解决方案:
发布于 2016-07-30 20:39:11
尝尝这个
private void GetExcelSheets(string FilePath, string Extension, string isHDR)
{
string conStr="";
switch (Extension)
{
case ".xls": //Excel 97-03
conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"]
.ConnectionString;
break;
case ".xlsx": //Excel 07
conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"]
.ConnectionString;
break;
}
//Get the Sheets in Excel WorkBoo
conStr = String.Format(conStr, FilePath, isHDR);
OleDbConnection connExcel = new OleDbConnection(conStr);
OleDbCommand cmdExcel = new OleDbCommand();
OleDbDataAdapter oda = new OleDbDataAdapter();
cmdExcel.Connection = connExcel;
connExcel.Open();
//Bind the Sheets to DropDownList
ddlSheets.Items.Clear();
ddlSheets.Items.Add(new ListItem("--Select Sheet--", ""));
ddlSheets.DataSource=connExcel
.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
ddlSheets.DataTextField = "TABLE_NAME";
ddlSheets.DataValueField = "TABLE_NAME";
ddlSheets.DataBind();
connExcel.Close();
txtTable.Text = "";
lblFileName.Text = Path.GetFileName(FilePath);
Panel2.Visible = true;
Panel1.Visible = false;
}
https://stackoverflow.com/questions/27554279
复制相似问题