① Access資料庫升級到sqlserver2005- 執行之前 (錯誤)
Microsoft JET Database Engine (0x80004005)---表已經被打開(或在設計表時),不能再執行打開操作,你在導入的時候Access是不是關閉的。如果是,再導入時看看欄位對應的類型是否匹配,有可能是數據格式不對。
② 我的access資料庫裡面sql語句在伺服器上不能正常運行
系統已經安裝好SQL Server2000並且打上了SP3補丁;安裝好Office套件裡面的Access;使用一個支持純文本編輯並且帶有行號顯示的編輯器,二、准備
1、程序提供了SQL資料庫格式:有一個MDF文件,或者提供了創建SQL資料庫的SQL腳本文件(後綴名為.sql)。
2、更多的是沒有提供SQL資料庫或腳本文件的,這時,就要自己來做這一切了,這也是我們這個帖子主要解決的問題。
對照原來的access,改寫下面的部分:
(1)sql資料庫表是沒有自動欄位的,因此原來access中的自動欄位被轉換成了普通欄位,需要手工改成標識類型,增量為1。
(2)所有的時間欄位,如果定義了默認值,那麼原來肯定是now(),需要改成getdate()
(3)原來欄位的默認值一般都不會自動引入,需要對照原表的欄位手工添加。
(4)由於資料庫的不同,access和sql的欄位類型很多轉換後就變化了,比如原來的《是否》欄位會被轉換成bit或者int,備注欄位被轉換成longtext,text欄位轉換成varchar等等,一般來說不會影響程序運行,如果有問題,我們在下面的程序改寫部分再說。
(5)如果你要用一個For SQL的程序,裡面用到了存儲過程,那麼你應該有這個程序本身建立SQL資料庫的方法:有其本身的SQL資料庫文件,或者sql腳本;如果沒有的話,採用導入access資料庫的方式是無法建立存儲過程的,這樣你最好放棄這個For SQL的程序版本,使用同樣版本的For Access的程序,導入access資料庫,然後用下面的改寫方法自己改成SQL版本的程序。
三、連接字元串的改寫
可參考動網的這段,分別是針對access和SQL的
Dim ConnStr
If IsSqlDataBase = 1 Then
'sql資料庫連接參數:資料庫名、用戶密碼、用戶名、連接名(本地用local,外地用IP)
Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName
SqlDatabaseName = "dvbbs7"
SqlPassword = ""
SqlUsername = "dvbbs"
SqlLocalName = "(local)"
ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"
Els
'sql資料庫連接參數:資料庫名、用戶密碼、用戶名、連接名(本地用local,外地用IP)
Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName
SqlDatabaseName = "dvbbs7"
SqlPassword = ""
SqlUsername = "dvbbs"
SqlLocalName = "(local)"
ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"
On Error Resume Next
Set conn = Server.CreateObject("ADODB.Connection")
conn.open ConnStr也可以簡潔一些,寫成這樣:
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "Provider = Sqloledb; User ID = sa; Password = 1234567; Initial Catalog = dvbbs7; Data Source = (local);"
裡面的資料庫名稱、數據源、用戶、密碼根據自己的實際情況改寫一下。
四、程序的改寫 1、如果你幸運,拿到的是For SQL的程序,那麼如果上面的資料庫建立過程沒有遇到麻煩,程序基本上就可以運行了,出錯的話,只是程序本身的bug,如何修改不是這個帖子討論的內容,就不贅述了。
2、大多數情況,程序本身是For Access的,與For SQL的程序差別主要是程序中使用到的SQL查詢語句。注意,SQL查詢語句是資料庫應用不可缺少的部分,不管是For SQL還是For Aceess的程序使用的語法大體差不多,但是有一些微妙的差別,正是這些差別,造成了程序的不通用,也是我們需要修改的主要內容。這樣一般要修改的部分如下:
(1)時間函數的問題:SQL資料庫的時間函數與access不同,最常見的是取現在時間的函數,access是now(),SQL是getdate()。因此凡是在where子句中使用了now()的地方都要改成getdate();注意,now()函數在asp程序本身也要使用,凡是不在資料庫查詢或執行語句中使用的now()函數千萬不要改。
(2)時間比較函數:datediff('d','時間1',『時間2』)這是access查詢用的格式,SQl中這些引號都要去掉,同時時間格式的前後可能加上了#,這也要去掉。同樣這也是指在sql語句中的,在asp語句中的要保持原樣。
(3)空值的表示:在access中,判斷空值一般用是否=""來表示,但是這在SQL中往往出錯,如果遇到出錯的問題或者程序運行不正常,可以改成如這樣判斷:where (name is null)
(4)真假值判斷:access中可以用=true、=false來判斷,但是在SQL中就會出錯,因此在SQL查詢或執行語句中這類判斷要分別改成=1、=0。注意一點:有些程序雖然寫成=「true」,但是由於有引號,所以這個欄位是字元類型的,你不能改成=1,保持原樣即可.
程序的調試 前面推薦使用帶有行號的編輯器,是因為上述的改寫不大可能是直接搜索程序源碼來做,很難找全。
我採取的方式一般這樣:資料庫改寫完成,直接調試程序,出錯後,看看出錯的提示,找到相應文件的代碼行,但是根源往往不是那行,比如出錯的語句是:conn.execute(sql),但是這句本身是沒有錯的,錯誤原因是裡面的這個sql字元串,那就向上看這個sql字元串是如何生成的,按照上面所說的程序修改辦法修改。
所有的默認值都丟失了。主要是數字類型和日期類型。
所有now(),time(),date()要改成getdate()。
所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
有可能一些true/false類型不能使用,要變為1/0。
備注類型要通過cast(column as varchar)來使用。
CursorType要改成1,也就是打開資料庫時要給出第一個數字參數為1,否則記錄可能顯示不完整。
isnull(rowname)要改成rowname = null
ACCESS的資料庫中的自動編號類型在轉化時,sql server並沒有將它設為自動編號型,我們需在SQL創建語句中加上identity,表示自動編號!
轉化時,跟日期有關的欄位,SQL SERVER默認為smalldatetime型,我們最好將它變為datetime型,因為datetime型的范圍比smalldatetime型大。有時用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。
對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:"delete * from user where id=10",而對SQL SERVER資料庫進行刪除是用:"delete user where id=10".
日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對SQL SERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。
在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQL SERVER資料庫處理中,卻不能用。
下表比較了MicrosoftAccess資料庫(MicrosoftAccess資料庫:數據和對象(如表、查詢或窗體)組成的集合,與特定的主題或用途有關。MicrosoftJet資料庫引擎用於管理數據。)和MicrosoftAccess項目(MicrosoftAccess項目:與MicrosoftSQLServer資料庫連接且用於創建客戶/伺服器應用程序的Access文件。項目文件中不包含任何數據或基於數據定義的對象(如表或視圖)。)的數據類型(數據類型:決定欄位可擁有的數據類型的欄位特徵。數據類型包括Boolean、Integer、Long、Currency、Single、Double、Date、String和Variant(默認))。
MicrosoftAccess數據類型SQLServer數據類型
是/否(「是/否」數據類型:一種欄位數據類型,用於只有兩種可能值(如是或否、True或False)的欄位。不允許有Null值。)bit(bit數據類型:在Access項目中,一種存儲值為1或0的數據類型。接受1和0以外的整數值,但總是將其解釋為1。)
數字(「數字」數據類型:MicrosoftAccess資料庫中的一種欄位數據類型,用於將在數學運算中使用的數值數據。但是,若要顯示或計算貨幣值,則應使用「貨幣」數據類型。)(位元組)tinyint(tinyint數據類型:Access項目中的一種佔一個位元組(8位)的數據類型,用於存儲從0到255范圍內的整數。)
數字(整型)smallint(smallint數據類型:Access項目中的一種2位元組(16位)數據類型,存儲位於-2^15(-32,768)與2^15-1(32,767)之間的數字。)
數字(長整型)int(int數據類型:Access項目中的一種4位元組(32位)數據類型,存儲位於-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數字。)
數字(單精度浮點型)real(real數據類型:在Access項目中,一種近似的數值數據類型,精度為7位,正值取值范圍大致從1.18E-38到3.40E+38,負值取值范圍大致從-1.18E-38到-3.40E+38,也可以取0。)
(無等價的數據類型)bigint(bigint數據類型:Access項目中的一種8位元組(64位)數據類型,存儲位於-2^63(-9,223,372,036,854,775,808)與2^63-1(9,223,372,036,854,775,807)之間的數字。)
數字(雙精度浮點型)float(float數據類型:在Access項目中,一種近似的數值數據類型,精度為15位。它所存儲的正值范圍大致是從2.23E-308到1.79E+308,負值范圍大致是從-2.23E-308到-1.79E+308,也可以為0。)
貨幣(「貨幣」數據類型:MicrosoftAccess資料庫中的一種數據類型,用於與貨幣有關的計算或其精確度極其重要的定點計算。)money(money數據類型:在Access項目中,用於存儲貨幣值的數據類型,取值范圍從-922,337,203,685,477.5707到922,337,203,685,477.5807,精確度為萬分之一個貨幣單位。)
smallmoney(smallmoney數據類型:Access項目中的一種存儲貨幣值的數據類型,取值范圍從-214,748.3648到214,748.3647,精確度為萬分之一個貨幣單位。當顯示smallmoney值時,會將它們四捨五入為兩個小數位。)
小數/數值(decimal數據類型(Access資料庫):精確的數值數據類型,用於存儲-10^38-1到10^38-1的值。可以指定數值范圍(最大總位數)和精度(小數點右邊的最大位數)。)decimal(decimal數據類型(Access項目):精確的數值數據類型,用於存儲-10^38-1到10^38-1的值。可以指定數值范圍(最大總位數)和精度(小數點右邊的最大位數)。)
numeric(numeric數據類型:在Access項目中,一種精確的數值數據類型,取值從-10^38-1到10^38-1。可以指定數值范圍(最大總位數)和精度(小數點右邊的最大位數)。)
日期/時間(「日期/時間」數據類型:Access資料庫的一種數據類型,用來存放日期和時間信息。)datetime(datetime數據類型:在Access項目中,日期和時間的數據類型,范圍從1753年1月1日到9999年12月31日,精確度為三百分之一秒,即3.33毫秒。)
smalldatetime(smalldatetime數據類型:Access項目中的一種日期和時間數據類型,精度不如datetime時間數據類型。數據取值范圍從1900年1月1日到2079年6月6日,精確度為一分鍾。)
自動編號(「自動編號」數據類型:MicrosoftAccess資料庫中的一種欄位數據類型,當向表中添加一條新記錄時,這種數據類型會自動為每條記錄存儲一個唯一的編號。可以產生三種編號:順序號、隨機號和同步復制ID。)(遞增)int(int數據類型:Access項目中的一種4位元組(32位)數據類型,存儲位於-2^31(-2,147,483,648)與2^31-1(2,147,483,647)之間的數字。)(定義了Identity屬性)
文本(「文本」數據類型:MicrosoftAccess資料庫中的一種欄位數據類型。「文本」數據類型最多可以包含255個字元,或者是由FieldSize屬性指定的一個小一些的字元數。)(n)varchar(n)(varchar(n)數據類型:Access項目中的一種可變長度的數據類型,最大長度為8,000個ANSI字元。)
nvarchar(n)(nvarchar(n)數據類型:在Access項目中,一種可變長度的數據類型,最多可含4,000個Unicode字元。Unicode字元每字元占兩個位元組,而且支持所有國際字元。)
備注(「備注」數據類型:在MicrosoftAccess資料庫中的一種欄位數據類型。「備注」欄位最多可以包含65,535個字元。)text(text數據類型:Access項目中的一種長度可變的數據類型,最多可存儲2^31-1(2,147,483,647)個字元;默認長度為16。)
OLE對象(「OLE對象」數據類型:欄位的數據類型之一,用於在其他應用程序中創建的、可鏈接或嵌入(插入)到Access資料庫中的對象。)image(image數據類型:在Access項目中,一種長度可變的數據類型,最多可存儲2^31-1(2,147,483,647)位元組的二進制數據。image數據類型用來存儲BLOB(二進制大對象),如圖片、文檔、聲音和已編譯代碼。)
同步復制ID(又名全局唯一標識符(GUID:在Access資料庫中,一種用於建立同步復制唯一標識符的16位元組欄位。GUID用於標識副本、副本集、表、記錄和其他對象。在Access資料庫中,GUID是指同步復制ID。)(GUID))uniqueidentifier(uniqueidentifier數據類型:在Access項目中,16位元組的全局唯一標識符(GUID)。)(僅適於SQLServer7.0或更高版本)
超鏈接(「超鏈接」數據類型:存儲超鏈接地址的Access資料庫欄位的數據類型。地址最多可以包含四部分,用以下語法格式編寫:displaytext#address#subaddress#。)char(char數據類型:在Access項目中,一種固定長度的數據類型,最多可含8,000個ANSI字元。),
nchar(nchar數據類型:在Access項目中,一種固定長度的數據類型,最多可含4,000個Unicode字元。Unicode字元每字元占兩個位元組,而且支持所有國際字元。),varchar,nvarchar(Hyperlink屬性設為Yes)
(無等價的數據類型)varbinary(varbinary數據類型:Access項目中的一種可變長度的數據類型,最多可存儲8,000位元組的二進制數據。)
(無等價的數據類型)smallint(smallint數據類型:Access項目中的一種2位元組(16位)數據類型,存儲位於-2^15(-32,768)與2^15-1(32,767)之間的數字。)
(無等價的數據類型)timestamp(timestamp數據類型:在Access項目中,一種每插入或更新一行就會自動更新的數據類型。timestamp列中的值不是datetime數據,而是binary(8)或varbinary(8),標明了數據修改的順序。)
(無等價的數據類型)charnchar
(無等價的數據類型)sql_variant(sql_variant數據類型:Access項目中的一種數據類型,存儲除text、ntext、image、timestamp和sql_variant類型以外的多種數據類型的值。在列、參數、變數或用戶定義函數的返回值中使用。)
(無等價的數據類型)用戶定義(用戶定義的數據類型:在MicrosoftSQLServer資料庫中,允許某列包含的數據的類型定義,由用戶利用現有的系統數據類型定義。規則和默認值僅可以綁定到用戶定義的數據類型。)
注釋在Access項目或SQLServer資料庫中,前綴「n」代表「國家/地區」,意思是這個數據類型是啟用Unicode的。在Access資料庫中,全部文本列在默認情況下都是啟用Unicode的。
ACCESS轉SQL需要注意的問題
2006-2-13 16:01:20
很多朋友想用SQL2000資料庫的編程方法,但是卻又苦於自己是學ACCESS的,對SQL只是一點點的了解而已,這里我給大家提供以下參考---將ACCESS轉化成SQL2000的方法和注意事項
一,首先,我說的是在ACCESS2000,SQL2000之間轉換,其他的我也還沒有嘗試過,希望大家多多試驗,肯定是有辦法的;
二,轉換的方法
1,打開」控制面板「下」管理工具「中的」資料庫源「;
2,按」添加「添加一個新的數據源,在選擇欄里選」DriverdomicrosoftAccess
(*.mdb)」,完成後將出現一個框,
在」資料庫源「裡面輸入你想寫的名稱,我取名叫「ABC」,說明不需要填,接著,按下面的選擇,尋找你的資料庫地址和選中(注意,請先備份自己的ACCESS資料庫),然後確定。
數據源在這里建好了,剩下轉換了。
3,打開SQL2000企業管理器,進入資料庫,新建一個空的資料庫「ABC」;
4,選擇新建立的資料庫,按滑鼠右鍵,選擇「所有任務」下「導入數據」,按「下一步」繼續;
5,在資料庫源下拉但中選擇」DriverdomicrosoftAccess(*.mdb)「,在」用戶/系統DSN「中,選種你剛才添加的」ABC「,按」下一步「;
6,「目的」不需要修改,選擇伺服器(一般下為自己的本機"local",也可以選擇伺服器地址或者區域網地址,確定你的許可權是否可以操作,),"使用WINDOWS身份驗證"指用自己的系統管理員身份操作,"使用SQL身份操作驗證"可以用於網站的操作,推薦用後者;
7,選上"使用SQL身份操作驗證"後,填寫你的用戶名和密碼,我自己選擇的是系統默認號碼"sa","****",資料庫選擇剛新建的"ABC",按"下一步";
8,這一步的兩個單項選擇,"從數據源復製表和視圖"與"用一條查詢指令指定要傳輸的數據",選擇前者,按"下一步"繼續;
9,這里將出現你自己ACCESS資料庫的表,按"全選"後,下一步;
10,"DTS導入/導出向導",看"立即運行"被選中按"下一步",
11,按"完成"繼續;
12,這個步驟你將看到你的數據被導入SQL2000裡面,當出現"已經成功把XXX個表導入到資料庫"的字樣,而且所有的表前面都有綠色的勾,就表示成功導入所有數據,如果中途出現問題或者表前面有紅色的*的話,說明該表沒有成功導入,這時就要回去查看自己的操作是否正確了.
三,數據修改
1,由於SQL2000裡面沒有"自動編號",所以你的以"自動編號"設置的欄位都會變成非空的欄位,這就必須手工修改這些欄位,並把他的"標示"選擇"是",種子為"1",增量為"1",
2,另外,ACCESS2000轉換成SQL2000後,原來屬性為"是/否"的欄位將被轉換成非空的"bit",這時候你必須修改成自己想要的屬性了;
3,另外,大家要注意對時間函數的把握.ACCESS與SQL是有很多不同的.
四、相關的欄位問題
1.ACCESS的資料庫中的自動編號類型在轉化時,sqlserver並沒有將它設為自動編號型,我們需在SQL創建語句中加上identity,表示自動編號!
2.轉化時,跟日期有關的欄位,SQLSERVER默認為smalldatetime型,我們最好將它變為datetime型,因為datetime型的范圍比smalldatetime型大。我遇見這種情況,用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。
3.對此兩種資料庫進行操作的sql語句不全相同,例如:在對ACCESS資料庫進行刪除紀錄時用:"delete*fromuserwhereid=10",而對SQLSERVER資料庫進行刪除是用:"deleteuserwhereid=10".
4.日期函數不相同,在對ACCESS資料庫處理中,可用date()、time()等函數,但對SQLSERVER資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。
5.在對ACCESS資料庫處理中,sql語句中直接可以用一些VB的函數,像cstr()函數,而對SQLSERVER資料庫處理中,卻不能用。
③ 在SQL裡面運行正常,可是在ACCESS裡面總是報語法錯誤,請問到底那裡錯了
這條sql有什麼作用?
我試過了,在Sql Server裡面執行是沒有問題的。
Access對sql的語句支持是有限的。
不支持多層次嵌套的查詢。
特別是這一句:
where (select count(*) from Web_Patient as ip2 where p2.UserName=op2.Username and ip2.id>op2.id)=1
你現在一張表Web_Patient ,兩個欄位(Username,id)
知道查詢目的,重寫一個就好了。
如不能解決問題,發網路消息給我。
④ access2013中sql語句語法正確但運行時老提示錯誤
Microsoft Access 不限制在資料庫對象名稱或資料庫欄位名稱中使用特殊字元,例如數字標記 (#)、句號 (.) 或雙引號 (") 標記。但是,如果您使用特殊字元,則可能會遇到意外錯誤。
因此,Microsoft 建議,不要在 Access 資料庫中的或資料庫項目中的資料庫對象名稱中使用特殊字元。本文將討論一些您必須避免使用的特殊字元。我們已經知道某些問題的發生與這些特殊字元有關。
當您使用 Access 或使用其他應用程序(例如 Microsoft Visual Basic 應用程序或 Active Server Pages (ASP) 應用程序)時,您必須避免使用下面的特殊字元:
空格
雙引號 "
撇號 '
沉音符 `
數字標記 #
百分號 %
大於號 >
小於號 <
嘆號 !
句號 .
中括弧 [ 或者 ]
星號 *
美元符號 $
分號 ;
冒號 :
問號 ?
脫字型大小 ^
圓括弧 ( 或者 )
加號 +
反斜杠 \
Access 命名約定Microsoft 建議您不要在函數名稱、變數名稱、欄位名稱或資料庫對象(例如表和窗體)名稱中使用句號 (.)、嘆號 (!)、沉音號 (`)、中括弧 ([ ])、空格 ( ) 或雙引號 (")。
有關 Access 中的命名約定的更多信息,請單擊「幫助」菜單上的「Microsoft Access 幫助」,在「Office 助手」或「應答向導」中鍵入欄位、控制項和對象的命名規則,然後單擊「搜索」以查看該主題。
如果您在 Access 中使用了下面的特殊字元,就會發生一些已知問題。下面的幾種情況描述了何時必須避免使用這些特殊字元:
當您將資料庫對象導出到其他文件格式(例如 Microsoft Excel 文件格式、HTML 文件格式或某種文本文件格式)時,不要在資料庫對象名稱或欄位名稱中使用數字標記 (#) 或句號 (.)。
當您在 Access 中使用超級鏈接時,這些超級鏈接會存儲為一些經修改的「備注」欄位,以數字標記 (#) 作為分隔符。因此,數字標記在 Access 中被視為保留字。創建超級鏈接時不要使用數字標記。
如果您將一個文本文件導入 Access 中,而該文本文件包含製表符或其他特殊字元,則特殊字元會轉換,然後特殊字元顯示為方框。因此,當您嘗試使用導入的表時,您會遇到意外錯誤。當您向 Access 導入表時,一定不要在源表中使用特殊字元。
當您在 Access 資料庫中添加或修改數據時,您一定不要在窗體中使用百分號 (%)、加號 (+)、或脫字型大小 (^)。這些特殊字元在 Access 資料庫中不能正確轉換。
當使用全形字元語言時,不要在資料庫對象的名稱或控制項的名稱中使用全形字元。例如,在使用全形字元語言時,您一定不要使用全形圓括弧。如果在對象或控制項的事件過程中存在代碼,使用全形圓括弧會引起編譯錯誤。