OLEDB 读取excel 时,碰到的select语句问题

zxbqqx 2013-12-13 06:03:49
1.OLEDB读取excel数据(前提)
2.使用select查询(为了方便查看,调整了下格式)
查询语句:sqlTest="select * from [sheet1&] where
[列1] like '%a1%' or
[列1] like '%a2%' or
[列1] like '%a3%' or
[列1] like '%a4%' or
[列1] like '%a5%' or
[列1] like '%a6%' or
...
[列1] like '%an%' ";
问题:
1.如果按这种方式写,当or条件过多时,就会引起“查询条件过于复杂”的错误,尝试了下,大概支持60多的样子(参考)
2.为了避免“查询过于复杂错误”,对查询条件进行了处理,使用了union连接多个查询字句(每个字句where条件限制在60左右),就目前程序运行来看,解决了问题. 但客观上分析,如果 or like 条件的数量增加到一定值,可能还会出现问题.(受sql语句长度限制吧,?)
3.再思考,希望能找到其他办法:将like后面的关键词存到内存表dataTable中, 如果dataTable能和Access表做 连接查询 ,那问题就能迎刃而解. 但是,dataTable怎么和数据表连接呢?好像行不通.
本次查询的筛选条件不止是like ,还包含(=,<>,in,not in ,exist,not exist等等)


期待各位老师的答案,纯技术交流,别来灌水,谢谢!



...全文
331 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxbqqx 2013-12-19
  • 打赏
  • 举报
回复
不能沉下去啊, 怎么优化这样的查询语句?
zxbqqx 2013-12-17
  • 打赏
  • 举报
回复
向斑竹求助!
rtdb 2013-12-16
  • 打赏
  • 举报
回复
只要有需求,都得去实现。 呵呵,这话没错,不过怎么实现就不能听用户的了。 你的这个问题,如果是数据库的话,轻松完成, 如果数据量不太大的话,就全读上来好了。 如果数据量很大的话,尽早往数据库上转移才是。 至于“微软已经明确在excel2013中回归大数据”, 后面恐怕少了“的客户端”几个字
zxbqqx 2013-12-16
  • 打赏
  • 举报
回复
谢谢各位的作答。
引用 1 楼 hdhai9451 的回复:
把a1,a2,a3,....放到一个临时表或变量表中,通过数据表与临时表关联查询,可以避免写很长的查询语句
我也希望用临时表做关联查询,所以第二条问了,dataTable能作为这个临时表吗,用于[sheet1&]作连接查询? 关于excel能处理多大数据的问题,大家不用争论了,不管是10W条,还是100W条,只要有需求,都得去实现。 而且微软已经明确在excel2013中回归大数据了吧. 期待各位的解决方案,谢谢!
zxbqqx 2013-12-16
  • 打赏
  • 举报
回复
在线等待答案
rtdb 2013-12-14
  • 打赏
  • 举报
回复
超过10万行还不进数据库?对微软太有信心了吧?
  • 打赏
  • 举报
回复
引用 2 楼 rtdb 的回复:
EXCEL最多10万行吧? 没索引吧? 那就一行行先读出来,再判断它的数据。 自己优化的话,效率应能更好。
Excel 2007就已经100多万行了。
rtdb 2013-12-14
  • 打赏
  • 举报
回复
EXCEL最多10万行吧? 没索引吧? 那就一行行先读出来,再判断它的数据。 自己优化的话,效率应能更好。
Andy__Huang 2013-12-13
  • 打赏
  • 举报
回复
把a1,a2,a3,....放到一个临时表或变量表中,通过数据表与临时表关联查询,可以避免写很长的查询语句
本文介绍C#访问操作Access数据库的基础知识,并提供一个相关的例程。 1.通过ADO.NET的OleDb相关类来操作Access 主要知识点如下: using System.Data.OleDb; using System.Data; 连接字符串:String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=product.mdb"; 建立连接:OleDbConnection connection = new OleDbConnection(connectionString); 使用OleDbCommand类来执行Sql语句OleDbCommand cmd = new OleDbCommand(sql, connection); connection.Open(); cmd.ExecuteNonQuery(); 2.取得Access自增标识字段在插入数据后的id值 cmd.CommandText = @"select @@identity"; int value = Int32.Parse(cmd.ExecuteScalar().ToString()); return value; 3.执行事务 需要用到OleDbTransaction,关键语句如下: OleDbConnection connection = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(); OleDbTransaction transaction = null; cmd.Connection = connection; connection.Open(); transaction = connection.BeginTransaction(); cmd.Transaction = transaction; cmd.CommandText=sql1; cmd.ExecuteNonQuery(); cmd.CommandText=sql2; cmd.ExecuteNonQuery(); transaction.Commit(); 4.执行查询,返回DataSet OleDbConnection connection = new OleDbConnection(connectionString); DataSet ds = new DataSet(); connection.Open(); OleDbDataAdapter da = new OleDbDataAdapter(sql, connection); da.Fill(ds,"ds"); 5.分页查询 分页查询使用OleDbDataReader来读取数据,并将结果写到一个DataSet中返回。 以上内容封装为三个可重用的类:AccessDBUtil,AccessPageUtil,Page 代码这里下载AccessDBUtilDemo.rar (191.37 KB , 下载:999次) 本例程是一个c#的winform程序,但是数据访问类可以在Web环境下使用。 本例程演示了: 1.Access数据库的插入,更新,修改,查询; 2.带参数的sql语句的使用,而不是拼SQL; 3.使用DataReader的分页查询,而不是用嵌套的SQL语句来分页; 4.用事务同执行多个SQL语句; 5.在插入数据的同返回最新的ID值; 6.整型,实型,字符串,日期型,布尔型五种数据类型的操作; 7.使用正则表达式来验证整数和实数; 8.listview用来显示数据的一些基本用法。 本示例不包括: 1.高效的分页查询,仅仅是提供了一种分页的方法,但我认为DataReader应该比嵌套的SQL语句快(未测试)。 2.完善的分页封装,只提供了分页的简单包装。 3.嵌套的事务处理,提供了同执行多个sql语句的事务处理,但不支持嵌套事务。 4.listview的使用,只是利用winform控件来演示数据访问,因此不能作为winform编程的良好示例,例如添加数据界面并没有很好地更新。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧