我尝试通过OleDB从Access数据库中获取一些数据DataSet.但是DataSet在Fill()方法之后是空的.当我在D*中手动触发它们时,相同的语句可以工作并返回1行.
OleDbConnection connection =
new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Inventar.accdb");
DataSet1 DS = new DataSet1();
connection.Open();
OleDbDataAdapter DBAdapter = new OleDbDataAdapter(
@"SELECT tbl_Computer.*, tbl_Besitzer.*
FROM tbl_Computer
INNER JOIN tbl_Besitzer ON tbl_Computer.FK_Benutzer = tbl_Besitzer.ID
WHERE (((tbl_Besitzer.Vorname)='ma'));",
connection);
DBAdapter.Fill(DS);
Run Code Online (Sandbox Code Playgroud)
提前致谢.
新工作代码:
DataSet ds = new DataSet();
OleDbDataAdapter DBAdapter = new OleDbDataAdapter();
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Inventar.accdb");
string query = @"
SELECT tbl_Computer.*, tbl_Besitzer.*
FROM tbl_Computer
INNER JOIN tbl_Besitzer ON tbl_Computer.FK_Benutzer = tbl_Besitzer.ID
WHERE (((tbl_Besitzer.Vorname)='ma'));";
connection.Open();
using (OleDbCommand command …Run Code Online (Sandbox Code Playgroud) 我正在使用从excel文件中OleDbDataAdapter提取DataSet,但我的SELECT语句里面有问题
DataSet excelDataSet = new DataSet();
using (OleDbConnection con = new System.Data.OleDb.OleDbConnection(connectionString))
{
con.Open();
OleDbDataAdapter cmd = new System.Data.OleDb.OleDbDataAdapter("select * from [Name of spreadsheet]", con);
cmd.Fill(excelDataSet);
con.Close();
}
Run Code Online (Sandbox Code Playgroud)
如果您看到我有"select * from [Name of spreadsheet]",但我需要获取任何电子表格,例如第一个电子表格,但此电子表格的名称可以是任何内容.
怎么指定呢?是否有任何特殊字符"select * from [%]"
我遇到了将数据从数据集写入Excel电子表格的超时问题.这是我目前的连接字符串:
<add key="ExcelConnectionStringHeader" value="Provider=Microsoft.ACE.OLEDB.12.0;Connect Timeout=30;Extended Properties="Excel 12.0;HDR=YES";Data Source="/>
Run Code Online (Sandbox Code Playgroud)
提供程序似乎不支持"连接超时"属性.连接超时,超时,ConnectionTimeout,ConnectTimeout等都没有.我的代码创建了数据适配器和插入命令,以及数据集的更新.除非Update命令本身花费超过15秒,这是默认的OleDb超时,否则这很有效.这就是为什么我试图在连接字符串中设置它.我已将CommandTimeout从默认值30增加,但这确实无关紧要.以下是我的代码:
OleDbDataAdapter da = new OleDbDataAdapter(szHeaderSelect, oCnn); // Ratings_Test -- Loan_Test$A1:F1]",
DataSet dsTest = new DataSet();
da.InsertCommand = new OleDbCommand(szNewSQL + "(" + szColumns + ") " + "VALUES ( " + szParams + ")", oCnn);
da.InsertCommand.CommandTimeout = 300;
foreach (DataRow oDr in dtTable.Rows)
{
drNew = dsTest.Tables[0].NewRow();
dsTest.Tables[0].Rows.Add(drNew);
}
var timer = new System.Diagnostics.Stopwatch();
timer.Start();
var recs = da.Update(dsTest, szExcelTab); // Ratings_Test }
timer.Stop();
Run Code Online (Sandbox Code Playgroud)
我省略了循环,实际上构建了insert命令的内容和参数.相信我,一切正常.2200+记录工作正常.
在我添加计时器之后,我发现问题是超时.处理2221记录时,需要14.95秒,并在电子表格中显示正常.处理2260条记录时,需要15.21秒才会显示任何内容.没有任何错误.我检查了所有行更新后的行状态,它们都没有显示失败.
最重要的是,由于ConnectionTimeout属性是ReadOnly,并且提供程序似乎不支持连接字符串中的Timeout,该怎么做....
谢谢.
我一直在使用excel电子表格,到目前为止我从来没有遇到任何问题..但是这个错误,"不是合法的OleAut日期.",当我试图读取excel文件时,突然出现了.有谁知道如何解决这个问题.这是我用来读取excel并将数据放入数据集的代码.它之前运行良好但在我对数据源进行了一些更改(不涉及日期)之后出现了这个错误.
var fileName = string.Format("C:\\Drafts\\Excel 97-2003 formats\\All Data 09 26 2012_Edited.xls");
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);
var adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connectionString);
DataSet Originalds = new DataSet();
adapter.Fill(Originalds, "Employees"); // this is where the error shows up
Run Code Online (Sandbox Code Playgroud) 我在使用VB.NET执行复杂的SQL查询时遇到问题OledbDataAdapter.这个Sql查询在W3school的SQL Tryit编辑器中工作正常.以下是我现有的VB.NET代码,有没有办法直接在VB.NET中执行那种SQL查询,或者任何人都可以更改此查询以使用VB.NET同样的结果?
Dim con As New OleDb.OleDbConnection
Dim dbProvider As String
Dim dbSource As String
Dim ds As New DataSet
Dim da As OleDb.OleDbDataAdapter
Dim sql As String
dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
dbSource = "Data Source = C:\database.mdb"
con.ConnectionString = dbProvider & dbSource
con.Open()
sql = "With query1 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='0') " _
",Query2 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='1') " _
"select query1.val as 'TT348',Query2.val as 'TT358',Query2.DateAndTime as 'DateAndTime' " _
"From query1,Query2 …Run Code Online (Sandbox Code Playgroud) 我有一个这种形式的Excel文件:
Column 1 Column 2 Column 3
data1 data2
data1 data2
data1 data2
data1 data2
data1 data2 data3
Run Code Online (Sandbox Code Playgroud)
也就是说,除了最后一行之外,整个第3列都是空的.我通过OleDbDataAdapter访问Excel文件,返回一个DataTable:这是代码.
query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;
Run Code Online (Sandbox Code Playgroud)
关键是,在这种情况下,我的代码返回一个只有第1列和第2列的DataTable.
我的猜测是JET引擎试图通过每列中第一个单元格的类型来推断列类型; 作为第一个值null,整个列被忽略.
我试图填写零,这段代码实际上是返回所有三列; 这显然是最不可取的解决方案,因为我必须处理大量的小文件.
反转选择范围(从"A1:C5"到"C5:A1")也不起作用.我正在寻找更优雅的东西.
我已经发现了一些讨论类型不匹配的帖子(int列中的varchar单元格,反之亦然),但实际上还没有发现与此相关的任何内容.
谢谢阅读!
编辑
奇怪的行为再次.我必须处理大多数Excel 2003 .xls文件,但由于这个问题已得到解答,我认为我可以针对Excel 2007 .xslx文件测试我的代码.连接字符串如下:
string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
Run Code Online (Sandbox Code Playgroud)
我得到"外部表不是预期的格式"异常,当ACE/JET和正在打开的文件之间存在版本不匹配时,我认为这是标准异常.
字符串
Provider=Microsoft.ACE.OLEDB.12.0
Run Code Online (Sandbox Code Playgroud)
意味着我正在使用最新版本的OLEDB,我快速浏览了一下,这个版本用于需要连接到.xlsx文件的任何地方.
我尝试过只有一个香草提供商(只有Excel 12.0,没有IMEX和HDR),但我得到了同样的例外.
我在.NET 2.0.50727 …
执行参数时,DbDataAdapter.Fill()极其缓慢!
我有一个内部有2个参数的查询,当我在查询中硬编码这些参数时,需要1秒才能执行(在470k表行中,只返回20行).
我在这里发现了许多类似的帖子,我尝试了所有这些解决方案(设置arithabort,选项重新编译,选项优化,......)没有运气.
我只是执行查询(sql server 2008)而不是存储过程,因此使用arithabort的查询是这样的:
Run Code Online (Sandbox Code Playgroud)string strSql = @"set ARITHABORT ON; select TOP 20 ....
此外,我尝试在同一个事务中调用set arithabort,但首先执行该查询.
我不知道我做错了什么,但感觉是当我在ado.net上定义了参数时,ado.net正在执行一个非常糟糕的执行计划.
由于这个糟糕的选择,SSMS中的执行时间是1秒(缓存后),但在asp中是9秒!
查询是这样的:
strSQL @ ="select*
from Table1 where Name like @name";
然后:
Run Code Online (Sandbox Code Playgroud)DbProviderFactory factory = DbProviderFactories.GetFactory(mProvider); DbCommand dbcmd = factory.CreateCommand(); if (CommandTimeout != null) dbcmd.CommandTimeout = CommandTimeout.Value; if(this.transaccion != null) dbcmd.Transaction = this.transaccion; dbcmd.Connection = dbc; dbcmd.CommandText = strSQL; if (parametros != null) dbcmd.Parameters.AddRange(parametros); DbDataAdapter dbda = factory.CreateDataAdapter(); dbda.SelectCommand = dbcmd; DataTable dt = new DataTable(); dbda.Fill(dt); return dt;
编辑14/01/2013(18:44)
我不再从DbProviderFactory检索连接,我直接使用SqlConnection和SqlCommand.我知道DbCommand和DbProvider是一个基础...但我觉得还有更多东西......因为性能急剧增加300%! …
c# ×5
excel ×4
ado.net ×2
oledb ×2
asp.net ×1
database ×1
dataset ×1
linq ×1
ms-access ×1
ms-jet-ace ×1
null ×1
oledbcommand ×1
performance ×1
sql ×1
sql-server ×1
vb.net ×1