OleDb读取Excel时, 如何使用sql条件查询

骄傲青蛙 2013-05-06 04:17:45
代码如下

//using System.Data;
//using System.Data.OleDb;



String file_name = "P:/test.xls";
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + file_name + ";Extended Properties=Excel 8.0;";

OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM [Sheet1$]", objConn);

OleDbDataAdapter obad = new OleDbDataAdapter();
obad.SelectCommand = objCmdSelect;
DataSet ds1 = new DataSet();
obad.Fill(ds1, "table1");
objConn.Close();

// 这里, 如何查询 第一列, 等于 tester 的数据
ds1.Tables[0].Select("A='tester'");

GridView1.DataSource = ds1;
GridView1.DataBind();





//test.xls 表格数据如下
//注明, 工号, 那列是第一行 , tester 第二行

工号 名称 基本工资 实发工资 合计
tester test 11 222 333
tester2 test2 22 333 555

...全文
337 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
尐凌 2013-07-17
  • 打赏
  • 举报
回复
[工号]=tester ,tester不要加单引号,不知道为什么,现在我也在用条件查询,加了单引号就不行,条件中间有空格好像也不行 tes ter ,可是我的条件中就是有空格的,唉,真不知道怎么办。
骄傲青蛙 2013-05-07
  • 打赏
  • 举报
回复
结帖 , 发个综合点的答案。


String file_name = "P:/test.xls";
String select_exp = "[工号]='tester'";
String query_string = "SELECT * FROM [Sheet1$]";
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + file_name + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";

OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
OleDbCommand objCmdSelect = new OleDbCommand(query_string, objConn);
OleDbDataAdapter obad = new OleDbDataAdapter();
obad.SelectCommand = objCmdSelect;
DataSet ds1 = new DataSet();
obad.Fill(ds1, "table1");
objConn.Close();

DataTable dt = ds1.Tables[0].Clone();
dt.Clear();
DataRow[] _data = ds1.Tables[0].Select(select_exp);
foreach (DataRow row in _data)
{
     dt.Rows.Add(row.ItemArray);
}
GridView1.DataSource = dt;
GridView1.DataBind();
EnForGrass 2013-05-07
  • 打赏
  • 举报
回复
引用 8 楼 coolesting 的回复:
[quote=引用 7 楼 Chinajiyong 的回复:] 不会哦 ds1.Tables[0].Select("[工号]='tester'") int count = ds1.Tables[0].Select("[工号]='tester'").CopyToDataTable().Rows.Count; 看看Count的值
没有 CopyToDataTable().Rows.Count; 这个方法 但我这样, 发现记录数相符, ds1.Tables[0].Select("[工号]='tester'").Length; 但怎么将这个查询结果, 赋值给GridView呢 ?[/quote] ds1.Tables[0].Select("[工号]='tester'")获取的是DataRow数组,Net3.5以上(包括Net3.5)就应该有 CopyToDataTable()这个方法,你也可以向楼上那样转换成DataTable
md5e 2013-05-07
  • 打赏
  • 举报
回复
引用 10 楼 coolesting 的回复:
[quote=引用 9 楼 liuchaolin 的回复:] 要再转成DataTable private DataTable getDataTable(DataTable sdata, string cond) { DataTable dt = sdata.Clone(); DataRow[] _data = sdata.Select(cond); foreach (DataRow row in _data) { dt.Rows.Add(row.ItemArray); } return dt; }
cond 这个参数是什么意思 ?[/quote] cond ="[工号]='tester'"
骄傲青蛙 2013-05-07
  • 打赏
  • 举报
回复
引用 9 楼 liuchaolin 的回复:
要再转成DataTable private DataTable getDataTable(DataTable sdata, string cond) { DataTable dt = sdata.Clone(); DataRow[] _data = sdata.Select(cond); foreach (DataRow row in _data) { dt.Rows.Add(row.ItemArray); } return dt; }
cond 这个参数是什么意思 ?
md5e 2013-05-07
  • 打赏
  • 举报
回复
要再转成DataTable private DataTable getDataTable(DataTable sdata, string cond) { DataTable dt = sdata.Clone(); DataRow[] _data = sdata.Select(cond); foreach (DataRow row in _data) { dt.Rows.Add(row.ItemArray); } return dt; }
骄傲青蛙 2013-05-07
  • 打赏
  • 举报
回复
引用 7 楼 Chinajiyong 的回复:
不会哦 ds1.Tables[0].Select("[工号]='tester'") int count = ds1.Tables[0].Select("[工号]='tester'").CopyToDataTable().Rows.Count; 看看Count的值
没有 CopyToDataTable().Rows.Count; 这个方法 但我这样, 发现记录数相符, ds1.Tables[0].Select("[工号]='tester'").Length; 但怎么将这个查询结果, 赋值给GridView呢 ?
EnForGrass 2013-05-06
  • 打赏
  • 举报
回复
不会哦 ds1.Tables[0].Select("[工号]='tester'") int count = ds1.Tables[0].Select("[工号]='tester'").CopyToDataTable().Rows.Count; 看看Count的值
骄傲青蛙 2013-05-06
  • 打赏
  • 举报
回复
表格, 如图, 我只想要工号等于tester的数据记录行

骄傲青蛙 2013-05-06
  • 打赏
  • 举报
回复
引用 4 楼 Chinajiyong 的回复:
[quote=引用 2 楼 coolesting 的回复:] 我想查询, excel里, A列(即工号) 等于 tester 的数据记录。。。
ds1.Tables[0].Select("[工号]='tester'");[/quote] 感谢大神的帮助, 这样不会报错, 但这样查询出所有记录, 我只想要 tester 的
EnForGrass 2013-05-06
  • 打赏
  • 举报
回复
引用 2 楼 coolesting 的回复:
我想查询, excel里, A列(即工号) 等于 tester 的数据记录。。。
ds1.Tables[0].Select("[工号]='tester'");
EnForGrass 2013-05-06
  • 打赏
  • 举报
回复
ds1.Tables[0].Select("[工号] like '%tester%'");
骄傲青蛙 2013-05-06
  • 打赏
  • 举报
回复
我想查询, excel里, A列(即工号) 等于 tester 的数据记录。。。
骄傲青蛙 2013-05-06
  • 打赏
  • 举报
回复
错误提示, 没有 A 列
[SQL]将Excel表数据导入SQL Server2005的几种方法归纳 数据库 2010-07-27 11:14:26 阅读201 评论0 字号:大中小 订阅 近日在巨轮着手车间负荷数据处理,反馈回来的数据是保存在Excel文件中的,我必须将其导入SQL Server2005中,供存储过程计算。 由于之前没有将Excel数据导入SQL Server2005的经验,因此摸索着花了一天间才搞定。下面将网上收集到的几种导入方法做个归纳。 方法一、利用SQL Server2005自带的DTS工具,手工导入: 第一步是点击开始并选择运行并输入CMD然后在命令提示符里输入DTSWIZARD。SQL Server 导入和导出向导的欢迎界面将显示出来,如下图所示:(也可以这样打开该界面:1、登录到 SQL Server Management Studio。2、在 “对象资源管理器 ”中右键单击 “管理 ”,在弹出列表中单击 “导入数据 ”。)   当你点击下一步按钮,它将进入选择数据源向导界面。用户应该选择数据源为Microsoft Office 12.0 Access Database Engine OLE DB Provider 然后在向导界面中点击属性…按钮,它将弹出数据链接属性界面。在所有标签页中,双击数据源属性值并输入电子数据表的位置,例如“C:\Excel2007\Import\SampleData.xlsx”作为导入数据的数据源的Microsoft Office Excel 2007文件名称和路径。然后双击扩展属性并选择Excel 12.0作为属性值。   到Microsoft Office Excel 2007的连接可以通过点击测试连接按钮来进行测试,如下图所示:   在下一个页面中,数据源需要选为SQL Native Client,因为数据将导入到SQL Server 2005。然后你需要选择数据所要导入的服务器名称,并需要配置合适的验证模式,它之后跟着数据库名称。  在这个例子中,我们将使用windows验证连接到本地SQL Server实例,所使用的数据库将是ImportExcel。   在Specify Table Copy or Query(指定表复制或查询)向导界面中,选择copy data from one or more tables or views(从一个或多个表或视图复制数据)选项,并继续这个向导到下一个界面。   在Select Source Table and Views(选择源表和视图)向导界面中,用户需要在源中选择雇员电子数据表,然后在目标中就可以看到ImportExcel.dbo.Employee了。之后点击Edit Mappings…(编辑匹配…),扫描电子数据表中的可用数据,如果数据类型与SQL Server所建议的不同的话那么指定数据类型。   在Save and Execute Package(保存和执行包)向导界面中,有两个选项叫做Execute Immediately(立即执行)和Save SSIS Package as file system(保存SSIS包为文件系统)。你可以选择任何一个选项然后点击Finish(完成)按钮来运行和结束这个包配置。 方法二、在查询分析器里,直接写 SQL语句: 1、如果是导入数据到现有表,则采用 INSERT INTO 表 SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$) 的形式 2、如果是导入数据并新增表,则采用 SELECT * INTO 表 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$) 的形式。 以上语句是将 EXCEL文件里 SHEET1工作表中所有的列都读进来,如果只想导部分列,可以 INSERT INTO 表 (a1,a2,a3) SELECT a1,a2,a3 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$) 其实可以将 OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)当成一个表,例如我就写过这样一个句子: INSERT INTO eval_channel_employee(channel,employee_id) SELECT CASE a.渠道 WHEN 'DIY' THEN 1 WHEN 'RDC' THEN 0 WHEN 'KCM' THEN 2 ELSE 3 END ,b.id FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:\temp\name.xls',sheet1$) AS a,pers_employee b WHERE a.员工编码 =b.code 不管是哪种方式,哪种途径,系统都会默认将第一行上的内容作为字段名。 3、利用C#自己开发数据导入小工具 //连接串 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + [EXCEL文件,含路径] + ";"; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, "TABLE"}); DataSet ds = new DataSet(); //一个EXCEL文件可能有多个工作表,遍历之 foreach( DataRow dr in dtSchema.Rows ) { string table = dr["TABLE_NAME"].ToString(); string strExcel = "SELECT * FROM [" + table + "]"; ds.Tables.Add(table); OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel,conn); myCommand.Fill(ds,table); } conn.Close(); 这样,读取出来的数据就藏在 DataSet里了。 采用这种方式,数据库所在机器不必装有 EXCEL。 总结: 当Excel表中数据完整,利用SQL自带的导入工具手工导入比较方便。当数据不完整或数据格式对应不上使用导入工具会出错,利用SQL查询语句就更便捷。当结合以上两种方法的优点,利用C#自己开发出数据导入工具是最佳选择。

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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