sqlserver連接帶密碼的access_mssql數(shù)據(jù)庫(kù)
發(fā)表時(shí)間:2023-08-09 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]sql server 導(dǎo)入帶密碼的access數(shù)據(jù)如何實(shí)現(xiàn)將Access的數(shù)據(jù)的導(dǎo)入到SQL Server呢,相信網(wǎng)絡(luò)上有很多教程來(lái)幫助大家了。但是,大家發(fā)現(xiàn)如果access文檔使用了密碼加密的話...
sql server 導(dǎo)入帶密碼的access數(shù)據(jù)
如何實(shí)現(xiàn)將Access的數(shù)據(jù)的導(dǎo)入到SQL Server呢,相信網(wǎng)絡(luò)上有很多教程來(lái)幫助大家了。但是,大家發(fā)現(xiàn)如果access文檔使用了密碼加密的話,就會(huì)發(fā)現(xiàn)網(wǎng)上所介紹的方法失靈了。下面將舉例來(lái)說(shuō)明。
以下有數(shù)據(jù)庫(kù)abc.mdb,表結(jié)構(gòu)如下:student(id int,name char(10)),密碼為test。先要將其導(dǎo)入到sql server當(dāng)中,假如abc.mdb沒(méi)有加密,則可以采用下面幾種方法:
sql server 導(dǎo)入、更新access的數(shù)據(jù)(無(wú)密碼版)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
1.OpenRowSet方式
SELECT * FROM OpenRowSet('Microsoft.Jet.OLEDB.4.0',';database=C:abc.mdb','select * from student where id=1')
update OpenRowSet('microsoft.jet.oledb.4.0',';database=C:abc.mdb','select * from student where id=1') set name='張三'
2.OpenDataSource方式
select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source=C:abc.mdb')...student
update OpenDataSource('microsoft.jet.oledb.4.0','Data Source=C:abc.mdb')...student set name='張三' WHERE id=1
3.鏈接服務(wù)器方式
EXEC sp_addlinkedserver
@server = N'serTest',
@provider = N'Microsoft.Jet.OLEDB.4.0',
@srvproduct = N'OLE DB Provider for Jet',
@datasrc = N'C:abc.mdb';
EXEC sp_addlinkedsrvlogin 'serTest'
EXEC sp_helpserver
--EXEC sp_dropserver N'serTest'
go
UPDATE serTest...student SET name='張三' WHERE id=1
SELECT * FROM serTest...student WHERE id=1
|
很多時(shí)候我們的mdb數(shù)據(jù)庫(kù)是加密的,那么如果我們?nèi)圆捎蒙厦娴姆椒ǎ瑫?huì)發(fā)現(xiàn)sql執(zhí)行出錯(cuò),該怎么辦呢?
我們首先查看下msdn中相關(guān)函數(shù)的定義:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
OPENROWSET
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'
'provider_string' }
, { [ catalog. ] [ schema. ] object
'query'
}
BULK 'data_file' ,
{ FORMATFILE = 'format_file_path' [ <bulk_options> ]
SINGLE_BLOB SINGLE_CLOB SINGLE_NCLOB }
} )
<bulk_options> ::=
[ , CODEPAGE = { 'ACP' 'OEM' 'RAW' 'code_page' } ]
[ , ERRORFILE = 'file_name' ]
[ , FIRSTROW = first_row ]
[ , LASTROW = last_row ]
[ , MAXERRORS = maximum_errors ]
[ , ROWS_PER_BATCH = rows_per_batch ]
參數(shù)
'provider_name'
字符串,表示在注冊(cè)表中指定的 OLE DB 訪問(wèn)接口的友好名稱(或 PROGID)。provider_name 沒(méi)有默認(rèn)值。
'datasource'
與某個(gè)特定 OLE DB 數(shù)據(jù)源相對(duì)應(yīng)的字符串常量。datasource 是將傳遞給訪問(wèn)接口的 IDBProperties 接口以初始化訪問(wèn)接口的 DBPROP_INIT_DATASOURCE 屬性。通常,該字符串包含數(shù)據(jù)庫(kù)文件的名稱、數(shù)據(jù)庫(kù)服務(wù)器的名稱,或者訪問(wèn)接口能理解的用于定位數(shù)據(jù)庫(kù)的名稱。
'user_id'
字符串常量,它是傳遞給指定 OLE DB 訪問(wèn)接口的用戶名。user_id 為連接指定安全上下文,并作為 DBPROP_AUTH_USERID 屬性傳入以初始化訪問(wèn)接口。user_id 不能是 Microsoft Windows 登錄名稱。
'password'
字符串常量,它是傳遞給 OLE DB 訪問(wèn)接口的用戶密碼。在初始化訪問(wèn)接口時(shí),password 作為 DBPROP_AUTH_PASSWORD 屬性傳入。password 不能是 Microsoft Windows 密碼。
'provider_string'
訪問(wèn)接口特定的連接字符串,作為 DBPROP_INIT_PROVIDERSTRING 屬性傳入以初始化 OLE DB 訪問(wèn)接口。通常 provider_string 封裝初始化訪問(wèn)接口所需的所有連接信息。有關(guān) SQL 本機(jī)客戶端 OLE DB 訪問(wèn)接口可識(shí)別的關(guān)鍵字列表,請(qǐng)參閱Initialization and Authorization Properties。
|
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
OPENDATASOURCE ( provider_name, init_string )
provider_name
注冊(cè)為用于訪問(wèn)數(shù)據(jù)源的 OLE DB 訪問(wèn)接口的 PROGID 的名稱。provider_name 的數(shù)據(jù)類型為 char,無(wú)默認(rèn)值。
init_string
連接字符串,該字符串將要傳遞給目標(biāo)提供程序的 IDataInitialize 接口。提供程序字符串語(yǔ)法是以關(guān)鍵字值對(duì)為基礎(chǔ)的,這些關(guān)鍵字值對(duì)由分號(hào)隔開,例如:“keyword1=value; keyword2=value”。
若要了解提供程序上支持的特定關(guān)鍵字值對(duì),請(qǐng)參閱 Microsoft Data Access SDK。該文檔定義了基本語(yǔ)法。下表列出了 init_string 參數(shù)中最常用的關(guān)鍵字。
關(guān)鍵字 OLE DB 屬性 有效值和說(shuō)明
擴(kuò)展屬性
DBPROP_INIT_PROVIDERSTRING
提供程序特定的連接字符串。
|
?
1
2
3
4
5
6
7
8
9
10
11
12
|
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
[ @provstr = ] 'provider_string'
OLE DB 訪問(wèn)接口特定的連接字符串,它可標(biāo)識(shí)唯一的數(shù)據(jù)源。provider_string 的數(shù)據(jù)類型為 nvarchar(4000),默認(rèn)值為 NULL。provstr 或傳遞給 IDataInitialize 或設(shè)置為 DBPROP_INIT_PROVIDERSTRING 屬性以初始化 OLE DB 訪問(wèn)接口。
在針對(duì) SQL 本機(jī)客戶端 OLE DB 訪問(wèn)接口創(chuàng)建鏈接服務(wù)器后,可將 SERVER 關(guān)鍵字用作 SERVER=servernameinstancename 來(lái)指定實(shí)例,以指定特定的 SQL Server 實(shí)例。servername 是運(yùn)行 SQL Server 的計(jì)算機(jī)名稱,instancename 是用戶將連接到的特定 SQL Server 實(shí)例的名稱。
|
在網(wǎng)上查詢了Microsoft OLE DB Provider for Microsoft Jet的資料:發(fā)現(xiàn)對(duì)于帶有密碼的access數(shù)據(jù)庫(kù),要在相應(yīng)的連接字符串參數(shù)中進(jìn)行標(biāo)注,文章里面還說(shuō)明了:mdb數(shù)據(jù)的密碼其實(shí)是DBPROPSET_JETOLEDB_DBINIT屬性里面的DBPROP_JETOLEDB_DATABASEPASSWORD ,我們可以通過(guò)對(duì)初始化DBPROP_INIT_PROVIDERSTRING對(duì)其進(jìn)行修改,也就是我們平時(shí)所說(shuō)的連接字符串,這下問(wèn)題就剩下尋找定義數(shù)據(jù)庫(kù)密碼屬性的關(guān)鍵字了。我們發(fā)現(xiàn),其關(guān)鍵字為Jet OLEDB:Database Password,然而在OpenRowSet函數(shù)中,由于微軟為了兼容性的考慮吧,其關(guān)鍵字為pwd,貌似采用的是odbc的命名模式?
DBPROP_INIT_PROVIDERSTRING
Description: Extended Properties
|
|
DBPROP_JETOLEDB_DATABASEPASSWORD |
Type: VT_BSTR
Typical R/W: R/W
Description: Jet OLEDB:Database Password
Password used to open the database. This differs from the user password in that the database password is per file, while a user password is per user.
|
Microsoft OLE DB Provider for Microsoft Jet
Appendix A: Properties
IDBDataSourceAdmin for Microsoft Jet
Initialization Properties
Provider-Defined Properties in DBPROPSET_JETOLEDB_DBINIT
OLE DB Initialization Properties: Quick Reference
Initialization Property Group
下面公布最終解決方案,紅色部分為重點(diǎn)。
從access文件中讀取、修改數(shù)據(jù)(有密碼版)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
1.OpenRowSet方式
SELECT * FROM OpenRowSet('Microsoft.Jet.OLEDB.4.0',';database=C:abc.mdb;<strong>pwd=test</strong>','select * from student where id=1')
update OpenRowSet('microsoft.jet.oledb.4.0',';database=C:abc.mdb;pwd=test','select * from student where id=1') set name='張三'
2.OpenDataSource方式
select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source=C:abc.mdb;<strong>Jet OLEDB:Database Password=test</strong>')...student
update OpenDataSource('microsoft.jet.oledb.4.0','Data Source=C:abc.mdb;Jet OLEDB:Database Password=test')...student set name='張三' WHERE id=1
3.鏈接服務(wù)器方式
EXEC sp_addlinkedserver
@server = N'serTest',
@provider = N'Microsoft.Jet.OLEDB.4.0',
@srvproduct = N'OLE DB Provider for Jet',
@datasrc = N'C:abc.mdb',
<strong>@provstr =N';pwd=test'</strong>;
EXEC sp_addlinkedsrvlogin 'serTest'
EXEC sp_helpserver
--EXEC sp_dropserver N'serTest'
go
UPDATE serTest...student SET name='張三' WHERE id=1
SELECT * FROM serTest...student WHERE id=1
|
Microsoft Access在很多地方得到廣泛使用,例如小型企業(yè),大公司的部門。