Czy ktos moze spotkal sie z nastepujacym bledem:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine
cannot open the file '(unknown)'. It is already opened exclusively by
another user, or you need permission to view its data.
Blad pojawia sie po próbie odwolania do zródla danych ODBC z poziomu ASP
poprzez ADO. W przypadku odwolywania sie do tegoz samego zródla danych z
poziomu programu VisualBasic równiez za pomoca ADO wszystko jest OK.
Z góry dzieki za pomoc,
Tomek P.
łączę się w moim programie przez Microsoft Jet i mam problem bo mój program
nie chce działać na innych komputerach. Pokazuje się błąd runtime 3706.
Sądzę że brakuje jakiś bibiotek których Kreator instalacji Visual Basic-a
nie dodaje. Co robić ?
Wesolutki :-)
Z gory dzieki.
Pozdrowienia, Jacek Augustyniak
Dzięki za wszelkie informacje
mergi
Jak z excela pobrac wartość np. komórki A1 i po wciśnięciu
powiedzmy przycisku "OK" dodać wartość tej komórki do zwykłej bazy
danych w accessie ?
Sub WstawDoBazy()
''' UWAGA: Ten podprogram wymaga odwołania do następujących
''' bibliotek:
'''
''' Microsoft ActiveX Data Objects 2.0 Library
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim looprange As Range
Dim currcell As Range
With conn
' Ustawienie usługodawcy OleDB dla połączenia.
.Provider = "Microsoft.JET.OLEDB.4.0"
' Otworzenie połączenia z plikiem Northwind.mdb.
.Open Application.Path & "samples
orthwind.mdb"
End With
With rst
.ActiveConnection = conn
' Otworzenie nowej tabeli. Argument LockType metody
' Open musi być ustawiony na adLockOptimistic, aby
' dodać rekordy do tabeli.
.Open "TabelaSprzedaży", LockType:=adLockOptimistic
End With
With rst
' Dodanie dowego rekordu.
.AddNew
.Fields("Nazwa").Value = Range("A1")
' Zapisanie nowego rekordu do bazy danych.
.Update
End With
rst.Close
conn.Close
End Sub
Janusz
Niestety to o czym pisales nie pomoglo. Nie wiem znowu dlaczego. Jest
ciagle
ten sam blad: "Niedopasowanie typow".
Nie wiem na czym polega błąd, ja zrobiłem sobie test z Northwindem i u mnie
działa ok, kod:
Sub TestLateBindingAdo()
Dim cnn, cmd, rst
Set cnn = CreateObject("ADODB.Connection")
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=E:Northwind.mdb"
cnn.Open
Set cmd = CreateObject("ADODB.Command")
cmd.CommandText = "[Sprzedaż wg pracowników i krajów]"
cmd.CommandType = adCmdStoredProc
cmd.ActiveConnection = cnn
cmd.Parameters.Append cmd.CreateParameter( _
"DataOd", adDate, adParamInput, 0, 0)
cmd.Parameters.Append cmd.CreateParameter( _
"DataDo", adDate, adParamInput, 0, 0)
cmd.Parameters("DataOd") = #1/1/1998#
cmd.Parameters("DataDo") = #1/5/1998#
Set rst = cmd.Execute
Do Until rst.EOF
MsgBox rst.Fields(1)
rst.MoveNext
Loop
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub
Działa i jako kod w Accessie i jako np. skrypt vbs.
Pozdrawiam
Grzegorz
Nguyen Bang Giang wrote at Mittwoch, 8. Dezember 2004 09:58:
| Dim Object As ADODB.Connection
Czy "Object" nie jest przypadkiem zarezerwowanym slowem ?
Gdyby tak to też żaden problem, serwer Niusowy nie kompiluje listów :)
| Objekt.open "PROVIDER=Microsoft.Jet.OLEDB.4.0;" &_
| Â Â Â Â Â Â "PWD=haslobazy;" & _
| Â Â Â Â Â Â "DATA SOURCE=C:katalogaza.mdb;" & _
| Â Â Â Â Â Â "Jet OLEDB:System database=C:katalogPlikMdw.mdw", _
| Â Â Â Â Â Â "nazwa usera", "HasloUsera"
Zauwaz, ze haslo jest podawane dwa razy. W Connect-stringu
(PWD=haslobazy) i jako argument. Obawiam sie, ze haslo podane
jako argument przeslania haslo podane w connect-stringu (to samo
tyczy sie "UID=<user" i odp. argumentu)!
Nie, w ciągu połączenia podaje się hasło bazy a jako argument metody .open
podaje się hasło użytkownika
Czy ADO potrafi poprawnie obchodzic sie z haslem zalozonym
na baze z poziomu accessa (nie to w *.mdw) nie jestem pewien.
Tak, potrafi. Zobacz niżej
Obawiam sie jednak, ze PDW/Password w connect-stringu i odp. argument
nie maja z nim nic wspolnego.
Moze udloby sie jakos podac przez "Jet OLEDB:???=<haslo_bazy" ?
Np. "Jet OLEDB:Database Password=<haslo_bazy" ??? Give it a try :-)
No i to ... Nie wiem dlaczego tkwiło mi w głowie PWD= a nie JET OLEDB:Database
Password=
Bardzo ci dzięki
Pozdrawiam
Ciao, Smyk
Przeczytaj wszystkie posty z tego wątkuPrivate Sub Form_Close()
baza.Close
End Sub
Private Sub Form_Current()
Me![RekordB] = Me.CurrentRecord
End Sub
Private Sub Dodaj_Click()
On Error GoTo Err_Dodaj_Click
DoCmd.GoToRecord , , acNewRec
Exit_Dodaj_Click:
Exit Sub
Err_Dodaj_Click:
MsgBox Err.Description
Resume Exit_Dodaj_Click
End Sub
Private Sub Form_Open(Cancel As Integer)
sciezka = "Data Source = c:pracaaza
est_wb.mdb;"
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & sciezka
baza.Index = "ID1"
baza.Open "tblKontrahent", con, adOpenKeyset, adLockOptimistic, adCmdTable
Me![RekordW] = baza.RecordCount
End Sub
Private Sub Zapisz_Click()
On Error GoTo Err_Zapisz_Click
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
baza.Requery
Me![RekordW] = baza.RecordCount
Exit_Zapisz_Click:
Exit Sub
Err_Zapisz_Click:
MsgBox Err.Description
Resume Exit_Zapisz_Click
End Sub
Private Sub Cofnij_Click()
On Error GoTo Err_Cofnij_Click
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
Exit_Cofnij_Click:
Exit Sub
Err_Cofnij_Click:
MsgBox Err.Description
Resume Exit_Cofnij_Click
End Sub
Co śmieszniejsze jak dwa razy kliknę na zapisz rekord to recordcount
zaktualizuje się poprawnie.
Jarek
Dim conn As ADODB.Connection
Dim txt As String
Dim txt2 As String
Dim cat As New ADOX.Catalog
Dim KontoUser As ADOX.User
txt = "c:Program Filesprogsfronton.mde"
txt2 = "h:azaaza.mdw"
Set conn = New ADODB.Connection
With conn
.Provider = "Microsoft.Jet.OLEDB.4.0; "
.ConnectionString = "Data Source=" & txt & "; Jet OLEDB:System
Database=" & txt2 & ";"
.Open , "admin", "haslo"
End With
cat.ActiveConnection = conn
txt = "create group NowaGrupa 213d23112a"
conn.Execute txt
If MsgBox("DML = tak, ADOX= Nie", vbYesNo, "") = vbYes Then
txt = "grant select, delete, insert, update on kwerenda1 to
NowaGrupa"
conn.Execute txt
Else
cat.Groups("NowaGrupa").SetPermissions "kwerenda1", _
adPermObjTable, adAccessGrant, adRightRead Or adRightInsert
Or adRightDelete
End If
For Each KontoUser In cat.Users
txt = "add user " & KontoUser.Name & " to NowaGrupa"
conn.Execute txt
Next
conn.Close
Set conn = Nothing
<gdn__na@serwerze__poczta.onet.plwrote:
| czy da sie i jak to mozna zrobic, zeby user mogl uruchomic kwerende
| aktualizujaca, ktora wykona sie na serwerze (na dwoch tabelach
| zalaczonych, ktore znajduja sie wlasnie na serwerze)? Chodzi mi o cos
| takiego jak kwerenda przekazujaca w przypadku kw. wybierajacych.
A kwerenda przekazująca czemu nie może być?
no, czuje w takim razie, ze chyba musze rzetelnie przedstawic
problem :)
Na serwerze DB chodzi sobie Sybase. Na tym samym na serwerze jest baza
Accessa. W tej bazie Accessa jest kilka tabel czysto accessowych, a
reszta jest zalaczona przez ODBC wlasnie z Sybase'a.
User na frontendzie na stacji lokalnej ma te same tabele, tylko
wszystkie sa juz zalaczone (Sybase'owe przez ODBC, a accessowe
bezposrednio).
User zmienia pewne dane w accessowej tabeli i pozniej kwerenda
aktualizuje odpowiednie pola w innej tabeli (wlasnie Sybase'a). Jesli
robi to kwerenda na stacji lokalnej, to trwa to kilka minut. Dlatego
chcialbym przerzucic wykonywanie tej kwerendy na serwer.
Oto, co robie:
1. tworze kwerende przekazujaca aktualizujaca (update ... set.. );
2. wchodze we wlasciwosci kwerendy, podaje nazwe polaczenia odbc do
bazy accessowej na serwerze (bo tylko ta widzi zarowno tabele
accessowa i sybase'owa);
3. wciskam enter i dostaje msgbox, ze "Nie mozna uzywac ODBC do
importowania, eksportowania lub dolaczania do bazy danych tabeli z
zewnetrznej bazy danych Microsoft Jet lub ISAM."
Ot, cala historia. Ja bym chetnie postawil te kwerende na backendzie
(tam wykonuje sie blyskawicznie), ale jak ja uruchomic za pomoca
frontendu? Pierwszym pomyslem byla kwerenda przekazujaca, ale sie
wykrzaczyla, stad moja prosba o rade.
Dzieki.
Private Sub ExportXML_Click()
On Error GoTo Err_ExportXML_Click
Dim CurConn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim CurDB As Database
Application.ExportXML _
ObjectType:=acExportQuery, _
DataSource:="XMLtechnologia", _
DataTarget:="d:DokumentybyszekTabele bazyXMLTechnologia.xml"
Application.ExportXML _
ObjectType:=acExportQuery, _
DataSource:="XMLczynnosci", _
DataTarget:="d:DokumentybyszekTabele bazyXMLCzynnosci.xml"
Application.ExportXML _
ObjectType:=acExportQuery, _
DataSource:="XMLzasoby", _
DataTarget:="d:DokumentybyszekTabele bazyXMLasoby.xml"
Set CurDB = CurrentDb
Set CurConn = New ADODB.Connection
With CurConn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConectionString = "data source = d:DokumentybyszekTabele bazy
" & CurDB.Name
.Open
End With
Set rst = New ADODB.Recordset
rst.CursorType = adOpenDynamic
rst.LockType = adLockBatchOptimistic
rst.Open "SELECT * FROM TypyWyrobow WHERE [NrTypu] = '" & _
Form![TypyWyrobowExportXML].[NrTypu] & "'", CurConn, , ,
adCmdText
rst![DataExp] = Date
rst.Update
rst.Close
Exit_ExportXML_Click:
Exit Sub
Err_ExportXML_Click:
MsgBox Err.Description
Resume Exit_ExportXML_Click
Po uruchomieniu wyrzuca błąd "Object doesn't support named arguments"
Może ktoś wskaże co zrobiłem źle?
Krzysztof napisał(a):
| przeszukałem dysk i nie znalazłem żadnego pliku z rozrzedzeniem *.udl ???
utwórz notatnikiem pusty plik tekstowy, a następnie zmień rozszerzenie
na ****.udl kliknij na ten plik, a dalej jak kreator poprowadzi
---
avast! antywirus: Wychodzace wiadomosc czysta.
Baza sygnatur wirusow (VPS): 0602-4, 2006-01-14
Przetestowano na: 2006-01-14 14:27:06
avast! - Copyright (c) 1988-2005 ALWIL Software.
http://www.avast.com
Zrobiłem jak radziłeś ... faktycznie odpalił się kreator którym posłużyłem
się do utworzenia pustej bazy mdb.
później zastosowałem kod:
OleDbConnection^ con;
con = gcnew OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data source =
"".\data\Test.mdb;Jet OLEDB:Engine Type=5;");
MessageBox::Show("OLE DB","Próba mikrofonu",
MessageBoxButtons::OKCancel,MessageBoxIcon::Asterisk);
con-Open();
String^ sql =
"Create Table MojaTabelka("
" Imie VarChar(20),"
" Nazwisko Varchar(30)" ")";
OleDbCommand^ myCom = gcnew OleDbCommand(sql, con);
myCom-ExecuteNonQuery();
MessageBox::Show("OLE DB","Próba mikrofonu 2",
MessageBoxButtons::OKCancel,MessageBoxIcon::Asterisk);
con-Close();
No i działa !!!!!!!!!!!!!!!!
ale .... chciałem troszke inaczej zrobić , chociaż to jest już duży postęp
:-) chciałem baze utworzyć w swoim programie sprawdzając najpierw czy
istnieje ... jeżeli nie istnieje to tworze pustą baze ... tworząc ją swoim
programem nie korzystając z zewnętrznych kreatorów.
dzięki za pomoc
| przeszukałem dysk i nie znalazłem żadnego pliku z rozrzedzeniem *.udl ???
| utwórz notatnikiem pusty plik tekstowy, a następnie zmień rozszerzenie
| na ****.udl kliknij na ten plik, a dalej jak kreator poprowadzi
| ---
| avast! antywirus: Wychodzace wiadomosc czysta.
| Baza sygnatur wirusow (VPS): 0602-4, 2006-01-14
| Przetestowano na: 2006-01-14 14:27:06
| avast! - Copyright (c) 1988-2005 ALWIL Software.
| http://www.avast.com
Zrobiłem jak radziłeś ... faktycznie odpalił się kreator którym posłużyłem
się do utworzenia pustej bazy mdb.
później zastosowałem kod:
OleDbConnection^ con;
con = gcnew OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;Data source =
"".\data\Test.mdb;Jet OLEDB:Engine Type=5;");
MessageBox::Show("OLE DB","Próba mikrofonu",
MessageBoxButtons::OKCancel,MessageBoxIcon::Asterisk);
con-Open();
String^ sql =
"Create Table MojaTabelka("
" Imie VarChar(20),"
" Nazwisko Varchar(30)" ")";
OleDbCommand^ myCom = gcnew OleDbCommand(sql, con);
myCom-ExecuteNonQuery();
MessageBox::Show("OLE DB","Próba mikrofonu 2",
MessageBoxButtons::OKCancel,MessageBoxIcon::Asterisk);
con-Close();
No i działa !!!!!!!!!!!!!!!!
ale .... chciałem troszke inaczej zrobić , chociaż to jest już duży postęp
:-) chciałem baze utworzyć w swoim programie sprawdzając najpierw czy
istnieje ... jeżeli nie istnieje to tworze pustą baze ... tworząc ją swoim
programem nie korzystając z zewnętrznych kreatorów.
dzięki za pomoc
wystarczy odwołać się w kodzie do tego pliku który utworzyłeś
Jak to zrobić? F1
---
avast! antywirus: Wychodzace wiadomosc czysta.
Baza sygnatur wirusow (VPS): 0602-4, 2006-01-14
Przetestowano na: 2006-01-14 15:41:05
avast! - Copyright (c) 1988-2005 ALWIL Software.
http://www.avast.com
Ale COŚ już wiem:
- po zainstalowaniu MSSQL2000 (tego z pakietu XP Developer) dodałem
DTS-a,
który "zasysa" dane z tabeli accessowej do lokalnej tabeli sql-servera -
i
ten dts działa elegancko niezależnie od konwencji wołania pliku
(oczywiście
w DSN-ie zmieniłem odwołanie z accessowego na sql-serverowe - i ASP
działa
piknie bez żadnych modyfikacji :D)
To tak troche, jak bys wynajmowal ciezarowke,
aby przewiezc cegeilke !?
Hm, póki co cegiełki nosimy ręcznie, ale ostatnio szef stwierdził, że przy
takiej ilości cegiełek ciężarówka będzie niezbędna - to jest wstępna
przymiarka (trening? zapoznanie?) do łączenia się z sql-serverem, co czeka
mnie prędzej czy później i raczej prędzej niż później :)
- jednakowoż jeżeli tego DTS-a umieszczę w job'ie (DTS prawomysz =
"schedule") to już nie działa (jest komunikat ODBC że ścieżka
P:DANEDCOMMON.MDB jest nieprawidłowa, to samo jeżeli podam "pełną"
ścieżkę
przez serwer - a dla pliku lokalnego działa)
To teraz juz calkiem nie wiem, co uzywasz [1] czy [2] ?
no, teraz już wiesz :)
Well... coś mi mówi że to nie jest sprawa bazodańcza tylko systemowa
(nie
wiem czegoś o Windzie)
Access od zawsze mial problemy z wolumenami novell'a.
Ale
...
conn.open "dsn=" & dsn & ";uid=sa;pwd="
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open tn, conn
...
dziala, jak uzyjesz tego bezposrednio z kodu/modulu w Access'ie ?
O, nie próbowałem :)
M. napisał(a):
Witam wszystkich!
Mam baze danych stworzona w MS Access 2003 ktora dziala poprawnie w
Windowsie 2000. Ta baza danych zwraca mi nastepujacy blad w Windowsie XP
(tez ACC2003):
"The expression On Load you entered as the event property setting
produced the following error: A problem occured while Microsoft Access
was communicating with the Ole server or ActiveX Control" Otrzymuje
rowniez podobne bledy w zdarzeniu OnLoad, OnClick itd. z tym samym
komunikatem:
"The expression...Ole server or ActiveX control" Mam zainstalowana
najnowsza wersje Microsoft Jet 8.0 SP na WinXP. Mam wszystkie odwolania
aktywne w oknie referencji VB. Nie ma zadnych brakujacych odwolan w
kodzie formularza ktorego otwiera zarowno w WinXP i Win2000.
Kiedy kompiluje kod vb nie wyswietla mi zadnego bledy czyli wszystko jest
ok z kodem.
Czyżby???
To wcale nie oznacza, że masz poprawny kod. Ot weźmy taki przykład:
Dim obj As Object
Set obj = New Excel.Application
Debug.Print dbj.pupa
Debbuger przełknie, w trakcie nie pójdzie. Dlaczego? Np. dlatego, że
nie ma Excela, albo excel jest, ale nie ma właściwości pupa.
Opis błędu sugeruje co może być nie tak: np. kontrolka ActiveX.
Jeśli powiesz jeszcze w jakiej linijce wywala błąd oraz jakie nietypowe
kontrolki masz na formularzu, podpowiemy co powoduje błąd.
Blazek
No wlasnie problem w tym jest ze kompilator nie wyrzuca bledu w zadnej z
linijek
tylko wyrzuca ogolne bledy przy wywolaniu procedur OnLoad OnClick:
"The expression On Load you entered as the event property setting
produced the following error: A problem occured while Microsoft Access
was communicating with the Ole server or ActiveX Control"
Kompilatorowi nie podoba sie zadna z procedur. Jestem przekonany, ze
procedury
sa dobrze napisane, bo zawsze jest stosowalem i nigdy nie mialem z nimi
problemow.
Naprawde nie wiem co moze byc przyczyna. Zapomnialem tez napisac ze mam
tez zainstalowanego MDACa
M.
| A teraz znów mniejszą. Ale to może dlatego ze jestem "pod wpływem" jako że
| zdałem exam z MOwNiTu (Metody Obliczeniowe)
| Oto dalszy cytat z MSDN. MOgę prosić o interpretację?
|
| "When record-level locking is on, data edited through Access forms and
| datasheets will use record-level locking. Also, Recordset objects opened by
| using the DAO OpenRecordset method, and any ADO methods (when you use the
| Microsoft Jet 4.0 OLE DB provider) that open or return a Recordset object
| will use record-level locking. However, any SQL Data Manipulation Language
| (DML) queries - that is, queries that add, delete, or modify records - that
| are run from ADO (when you use the Microsoft Jet 4.0 OLE DB Provider), DAO,
| or the Access query user interface will use page-level locking. Page-level
| locking is used for SQL DML statements to improve performance when you are
| working with many records. However, even when record-level locking is turned
| on, it is not used for updates to values in memo fields and values in fields
| that are indexed - they still require page-level locking. "
Michał, a w czym problem, poza teoretycznym ?
Mówią Ci: począwszy od Jet 4.0 masz blokowanie na poziomie rekordu
(innymi słowy, ktoś coś gmerający w sąsiednim rekordzie nie blokuje Twoich wypocin
...)
Ale - niestety - nie dotyczy to kwerend funkcyjnych bo one chodzą po stronach !
A co to jest strona ? to taki minimalny kawałek (2k lub 4kB)
Jest to stosunkowo tak niewielki kawałek (zwłaszcza ze względu na sposób organizacji
danych przez Access'a), że obsługa błędu praktycznie niczym się nie różni od tej gdy
blokowanie zachodzi na poziomie rekordu...)
Co najwyżej błąd wystąpi nieco częściej ...
| Dnia Wed, 25 Jan 2006 23:31:56 +0100, Kris napisaÂł(a):
| PróbujĂŞ coÂś napisaĂŚ korzystajÂąc z ADO.NET (VS 2005 C++) i muszĂŞ
| sprawdziĂŚ
| w
| mojej utworzonej przez program bazie istnieje tabela o jakiejÂś tam
| nazwie.
| No to nie moÂżna byÂło od razu pisaĂŚ Âże chodzi o .NET? Chyba ntg (to jest
| grupa Accesowo - VBA-owa), ale jakbyÂś spróbowaÂł analogicznie do tego:
| Dim cn As New Data.OleDb.OleDbConnection
| cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<tu
| ÂścieÂżka do mdb;Persist Security Info=True"
| Dim cmd As New Data.OleDb.OleDbCommand("select * from <tu nazwa
| tabeli",
| cn)
| cmd.Connection.Open()
| Try
| cmd.ExecuteReader()
| MsgBox("jest!")
| Catch ex As Exception
| MsgBox("dupa :(")
| End Try
| cmd.Connection.Close()
| to moÂże by Ci coÂś z tego wyszÂło...
| MoÂże to nie jest najpiĂŞkniejszy kawaÂłek kodu w .net, ale ja w tym nie
| siedzĂŞ wcale a wcale - ile umiaÂłem tyle pomogÂłem :)
| --
| PL
.NET to nie tylko VB !!!!
To tez np. C++, Java, C# ... jakbym chcial zapytac o .NET to nie
pytalbym
tutaj (mam nadzieje ze rozumiesz to :-)) zapytalem wyraznie o SQL na
grupie access !!!!!!!!!! i zapewniem Cie ze wim co robie !!!! nie odzywaj
sie !!!! prosilem cie juz o to !!!! ale dziĂŞki momo wszysto za proby
pokonania kompleksów jak napisal Przemak
SQL to kiepski pomysł dla JET, lepszy to ADOX
Dnia 26-01-2006 o 00:28:37 Kris <mat@wp.plnapisał:
| | Dnia Wed, 25 Jan 2006 23:31:56 +0100, Kris napisa3(a):
| Próbuje co? napisaa korzystaj?c z ADO.NET (VS 2005 C++) i musze
| sprawdzia
| w
| mojej utworzonej przez program bazie istnieje tabela o jakiej? tam
| nazwie.
| No to nie mo?na by3o od razu pisaa ?e chodzi o .NET? Chyba ntg (to jest
| grupa Accesowo - VBA-owa), ale jakby? spróbowa3 analogicznie do tego:
| Dim cn As New Data.OleDb.OleDbConnection
| cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<tu
| ?cie?ka do mdb;Persist Security Info=True"
| Dim cmd As New Data.OleDb.OleDbCommand("select * from <tu nazwa
| tabeli",
| cn)
| cmd.Connection.Open()
| Try
| cmd.ExecuteReader()
| MsgBox("jest!")
| Catch ex As Exception
| MsgBox("dupa :(")
| End Try
| cmd.Connection.Close()
| to mo?e by Ci co? z tego wysz3o...
| Mo?e to nie jest najpiekniejszy kawa3ek kodu w .net, ale ja w tym nie
| siedze wcale a wcale - ile umia3em tyle pomog3em :)
| --
| PL
| .NET to nie tylko VB !!!!
| To tez np. C++, Java, C# ... jakbym chcial zapytac o .NET to nie
| pytalbym
| tutaj (mam nadzieje ze rozumiesz to :-)) zapytalem wyraznie o SQL na
| grupie access !!!!!!!!!! i zapewniem Cie ze wim co robie !!!! nie odzywaj
| sie !!!! prosilem cie juz o to !!!! ale dzieki momo wszysto za proby
| pokonania kompleksów jak napisal Przemak
SQL to kiepski pomysł dla JET, lepszy to ADOX
--
Używam programu pocztowego Opery: http://www.opera.com/mail/
zdania sa podzielone jezeli chodzi o ADOX
"
Natomiast biblioteka ADOX miała być obiektowym interfejsem dostępu do
struktury bazy. Najpierw do baz Jeta, potem pojawiła się możliwość pracy na
innych bazach np. MS SQL. Jednak w tej chwili nie jest już rozwijana i z
tego co wiem MS odchodzi od tej koncepcji.
"
BraZby wrote:
| Innym rozwiązaniem jest nowy formularz z opisem a potem odświeżenie
| html'a. Ale wtedy powstaje problem jak do Access'a przekazać, która
| miniaturka została kliknięta?
| {tu poprzednie wyciąłem bo chyba niedobre w tym kontekście}
| Macie jakieś pomysły?
Tak nieśmiało zaproponuję, (z całym bagażem ograniczeń):
[...]
<SCRIPT LANGUAGE=VBScript
dim oRs, SQL, dsn
Private Sub Zapisz()
set oRs = CreateObject("ADODB.Recordset")
dsn="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:Proba.mdb"
SQL="SELECT Tabela1.a FROM Tabela1;"
oRS.Open SQL, dsn, 2, 3
oRS.Fields("a")="ble ble ble"
oRs.Update
MsgBox oRS.Fields("a")
oRs.close
set oRs=Nothing
End Sub
</SCRIPT
Polskie ogonki w stringu " ble ble ą ble"
cosik powodują, że rekord się nie aktualizuje.
testowane tylko z Notatnika (przed i po konwersji na iso-8859-2).
Tak mi się tylko nasunęło.
Dzięki za ten kawałek kodu, właśnie tak mi dzwoniło w głowie. Zastanawiam
się jak ukryć ten kod bo juzer może przecież podejrzeć source HTML'a. A
umieszczenie kodu w zewnętrznym pliku (.vbs?) chyba nie załatwia sprawy.
Wpadłem też na pomysł by otwierać zwykły formularz a detalami. Juzer klika
na miniaturkę, co powoduje umieszczenie jej id w jakimś input boxie ("IB1")
html'a. Potrafię odczytać jej zawartość w access, np:
me!web.document.all.IB1.value
ale wymaga to dodatkowego kliknięcia na jakiś baton na formularzu. to jakby
zbędna operacja. lepiej by było jakoś przechwycić zdarzenie click obrazka w
kontolce web i obsłużyć je w access. nie wiem czy to możliwe. muszę już
palić gumę.
aha, cały czas grzebię w kodzie tworzącym thumby, próbowałem z jpg o różnych
bit per point (4,8,24,32) i raczej nie było problemów. Problem to bitmapy o
dużych gabarytach bo nie można np. utworzyć ich przy pomocy
Createcomaptiblebitamp. ale musze kończyć, może wieczorem dopiszę coś. sorry
że tak chaotycznie.
dzięki za wszystko.
Sub TestHTMLDb()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strUrl$
Dim strSQL$
strUrl = "E:installjethtmlisammsflex.htm"
'-- strUrl = "file:///E:/install/jethtmlisam/msflex.htm"
'-- strUrl = "http://www.posmykowizna.de/access/msflex.htm"
Set db = Workspaces(0).OpenDatabase("", True, True, _
"HTML Import;HDR=YES;IMEX=2;DATABASE=" & strUrl)
strSQL = " select * from Country"
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
Stop '-- tu sobie poogladaj recordset
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub
Sub TestHTMLDbAdo()
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
Dim strUrl$
strUrl = "E:installjethtmlisammsflex.htm"
'-- strUrl = "file:///E:/install/jethtmlisam/msflex.htm"
'-- strUrl = "http://www.posmykowizna.de/access/msflex.htm"
Set cn = New ADODB.Connection
cn.CursorLocation = adUseClient
cn.Open "Provider=Microsoft.Jet.Oledb.4.0;" & _
"Data Source=" & strUrl & ";" & _
"Extended Properties=""HTML Import;HDR=YES;IMEX=2"";"
Set rs = New ADODB.Recordset
rs.Open " select * from Country ", cn, adOpenStatic, adLockOptimistic
Stop '-- tu sobie poogladaj recordset
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub
Czy już na zawsze skazani jesteśmy na tego smykowego eksemela ???
Fakty mowia same za siebie ;-P
:-D
Ciao, Smyk
Przeczytaj wszystkie posty z tego wątkuwykorzystuję "Microsoft.Jet.OLEDB.4.0".
Mam kilka tabel, które są ze sobą w relacji jeden do wielu.
W uproszczeniu wygląda to tak:
Tabela1
1) Id1 (indeks bez powtórzeń, autoinc)
2) T1Kol1
Tabela2
1) Id1 (indeks z powtórzeniami)
2) Id2 (indeks bez powtórzeń, autoinc)
3) T2Kol1
....
Tabela3
1) Id2 (indeks z powtórzeniami)
2) Id3 (indeks bez powtórzeń, autoinc)
3) T3Kol1
.....
Tabela1.Id1 wiąże się z Tabela2 poprzez Tabela2.Id1
Tabela2.Id2 wiąże się z Tabela3 poprzez Tabela3.Id2
Mam DBGRid, w którym wyświetlane są wartości z Tabela1. Z każdym
takim rekordem jest związanych kilka wielkości z Tabela2 i 3
(T2Kol1, T3Kol1,...). Każdą taką wartość zmieniam za pomocą
skojarzonych przełączników DBRadio. Przeglądam DBGrid i edytuję
poszczególne wartości (T2Kol1, T3Kol1,...) poprzez przełączniki
DBRadio. Kod OnClick dla DBRadio jest taki:
"ADOTable3.Edit;
ADOTable3.FieldByName('T2Kol1').AsInteger :=
StrToInt(T2Kol1DBRadio.Values[T2Kol1DBRadio.ItemIndex]);
ADOTable3.Post;"
Wówczas, co pewien bliżej nie określony i trudny do przewidzenia
czas, podczas zmiany wartości DBRadio pojawia się błąd:
"Row cannot be located for updating. Some values may have been
changed since it was last read."
Od tego momentu każde praktycznie kliknięcie na DBGrid czy DBRadio
generuje ten sam błąd. Pomaga tylko ponowne uruchomienie programu.
W czym tkwi problem?
Czy jest to problem z komponentami Delphi DBGrid, DBRadio?
Czy jest to problem z bibliotekami, komponentami Windows?
Z góry dziękuję za pomoc
Konrad
Do poniższej procedury zmiany hasła zalogowanego użytkownika podaję 3
parametry: stare hasło i drukrotnie nowe. Co ciekawe bez podania starego
hasła też działa. Pytanie czy tak powinno być, skoro parametr stare hasło
procedury changepassword jest obowiązkowy chociaż może być pusty "", ale
tylko w przypadku gdy user nie ma hasła.
robert
Private Sub cmdZmien_Click()
On Error GoTo Err_cmdZmien_Click
Dim cat1 As New ADOX.Catalog
Dim usr As String
Dim a As Variant
Dim oldPas As String
Dim newPas1 As String
If IsNull(Me!Tekst6) Then
oldPas = ""
Else
oldPas = Me!Tekst6
End If
a = StrComp(Me!Tekst0, Me!Tekst2, vbBinaryCompare)
If IsNull(a) Then
MsgBox "Musisz wpisać i potwierdzic nowe hasło", , "Uwaga"
Else
If a <0 Then
MsgBox "Podane hasła nie są jednakowe", , "Uwaga"
Me!Tekst0.SetFocus
Else
'podane hasła są równe
usr = CurrentUser
newPas1 = Me!Tekst0
cat1.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" &
Mid(CurrentDb.TableDefs("tblPracownik").Connect, 11) & ";" & _
"Jet OLEDB:System database=" & SystemDB() & ";" & _
"User Id=aa;Password=aa;"
cat1.Users(usr).ChangePassword oldPas, newPas1
MsgBox "Hasło zostało zmienione", , "Potwierdzenie"
DoCmd.Close
End If
End If
Exit_cmdZmien_Click:
Exit Sub
Err_cmdZmien_Click:
MsgBox Err.Number & " " & Err.Description
Resume Exit_cmdZmien_Click
End Sub
...
Jakie ma to znaczenie nie muszę chyba tłumaczyć ...
Mam pytanie: czy ktoś z grupowiczów spotkał
się z jakąś dokumentacją opisującą to 'zjawisko' ?
Proszę o konkretny link bo w MSDN, KB i gdzie
tylko się dało już szukałem.
Tomasz Jastrzębski
przykład:
'Const DBFile As String = _
"C:Program FilesMicrosoft Visual StudioVB98
wind.mdb"
Const DBFile As String = _
"C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.mdb"
Private cnn1 As New ADODB.Connection
Private rec1 As New ADODB.Recordset
Private cmd1 As New ADODB.Command
Private cnn2 As New ADODB.Connection
Private rec2 As New ADODB.Recordset
Private cmd2 As New ADODB.Command
Private Sub Form_Load()
OpenConnection cnn1
OpenRecordset cnn1, cmd1, rec1
OpenConnection cnn2
OpenRecordset cnn2, cmd2, rec2
rec1.MoveFirst
rec2.MoveLast
cnn1.BeginTrans
cnn2.BeginTrans
rec1("PostalCode").Value = "60606": rec1.Update
rec2("PostalCode").Value = "60607": rec2.Update 'error -2147467259
End Sub
Private Sub OpenConnection(ByRef cnn As ADODB.Connection)
'cnn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
"Persist Security Info=False;Initial Catalog=Northwind;Data Source=(local)"
cnn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBFile
'cnn.Mode = adModeReadWrite
'cnn.Properties("Jet OLEDB:Database Locking Mode") = 1
cnn.Open
'cnn.Properties("Jet OLEDB:Lock Delay") = 1
'cnn.Properties("Jet OLEDB:Lock Retry") = 10
End Sub
Private Sub OpenRecordset(ByRef cnn As ADODB.Connection, _
ByRef cmd As ADODB.Command, ByRef rec As ADODB.Recordset)
Set cmd.ActiveConnection = cnn
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT * FROM Suppliers"
rec.CursorLocation = adUseClient
rec.LockType = adLockOptimistic
rec.CursorType = adOpenStatic
Set rec.Source = cmd
'rec.Properties("Jet OLEDB:Locking Granularity") = 2
rec.Open
End Sub
Jeśli ktoś wie jak mi pomóc to dziękuję za pomoc
Pozdrawiam
Krystian
Przeczytaj wszystkie posty z tego wątkuAccess 2003
OS: win XP
Gdy używam bazy danych na domowym komputerze baza działa OK. Jednak,
gdy chcę uruchomić ją w pracy, przy naciśnięcia przycisku na
formularzu generowany jest poniższy błąd.
W oknie dialogowym błędu jest wyświetlany poniższy komunikat:
"Program Visual Basic for Applications (VBA) napotkał problem podczas
próby uzyskania dostępu do właściwości lub metody. Mógł wystąpić jeden
z następujących problemów:
Brakuje odwołania.
Aby uzyskać pomoc dotyczącą przywracania brakujących odwołań, zobacz
następujący artykuł z bazy wiedzy Microsoft Knowledge Base: 283806.
Wyrażenie zawiera błędy pisowni.
Sprawdź, czy wszystkie wyrażenia używane we właściwościach zdarzenia
mają poprawną pisownię.
Funkcja zdefiniowana przez użytkownika jest zadeklarowana w module
jako funkcja podrzędna lub prywatna.
Wyrażenia rozpoznają funkcje zdefiniowane przez użytkownika tylko
wtedy, gdy funkcja została zadeklarowana w jeden z następujących
sposobów:
Funkcja publiczna w module
Publiczna lub prywatna funkcja w module kodu bieżącego formularza lub
raportu
Poziom zabezpieczeń w programie Access jest ustawiony na średni lub
wysoki, a aktualizacja Microsoft Jet 4.0 SP8 nie została
zainstalowana.
Aby program Access działał poprawnie w sytuacji, gdy poziom
zabezpieczeń jest ustawiony na średni lub wysoki, należy zainstalować
nowszą wersję programu Jet 4.0. Aby uzyskać najnowszą wersję programu
Microsoft Jet, przejdź do witryny Windows Update"
Z czego może wynikać ten błąd?
Z góry dziękuję za pomoc.
----- Original Message -----
From: <deark@wp.pl
To: <pl-comp-bazy-danych-msacc@newsgate.pl
Sent: Monday, August 12, 2002 4:27 AM
Subject: (ADO) Connection i Recordset
Pozdrawiam grupe.
Mam problem -probuje zmienic dane w tabeli polaczonej zacznajac kodem:
Dim cnn As Connection
Dim rstMain As New ADODB.Recordset
....
Set cnn = CurrentProject.Connection
rstMain.Open "main", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
cnn.BeginTrans
rstMain.Index = "idzadania"
....
Po tej linii dostaje komunikat:
"Obiekt lub dostawca nie moze wykonac zadanej operacji."
Tabela "main" oczywiscie istnieje w polaczonej bazie, a jaj kluczem
podstawowym
jest "idzadania".
Debug.Print Application.CurrentProject.FullName wyswietla sciezke
aplikacji, a
nie pliku z
tabelami, wiec podejrzewam, ze chodzi o otwarcie polaczenia do zewnetrznej
bazy
(gdy tabela jest w biezacej bazie wszystko dziala), ale niestety nie wiem
jak
to zrobic.
Posiadana literatura (wersja dla ubogich) nie udziela odpowiedzi na takie
pytanie, wiec
moja nadzieja w grupie. Bede wdzieczny.
Darek
Czesc
Function GetLinkPath(tbName As String) As String
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set tbl = cat.Tables(tbName)
GetLinkPath = tbl.Properties("Jet OLEDB:Link Datasource")
End Function
Dim cn As ADODB.Connection
Dim strCn As String
Dim strPom As String
Dim TwojeZmienne...........
strPom = GetLinkPath("main") 'funkcja
If Len(strPom) Then 'jezeli jest to tabela polaczona
Set cn = New ADODB.Connection
strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPom
'itd tu ladnie chodzi seek
Else
'jezeli tabela nie jest polaczono
'to twoj kod
End if
Pozdrowienia
jurekeme
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
Application("DatabaseName") & ".mdb;Jet OLEDB:System database=" & _
Application("DatabaseName") & _
".mdw;User ID=Admin;Password=Sprzedaz;"
otrzymuję błąd serwera:
Ta strona nie może być wyświetlona
Wystąpił problem ze stroną, do której próbujesz się dostać, i której nie możesz
wyświetlić.
--------------------------------------------------------------------------------
Należy spróbować następujących czynności:
Kliknij przycisk Odśwież lub spróbuj ponownie później.
Otwórz stronę główną localhost, a następnie szukaj łączy do informacji, których
potrzebujesz.
HTTP 500.100 - Wewnętrzny błąd serwera - błąd ASP
Internetowe usługi informacyjne
--------------------------------------------------------------------------------
Informacje techniczne (dla personelu obsługi)
Typ błędu:
Microsoft JET Database Engine (0x80040E4D)
Nie można uruchomić aplikacji. Plik informacyjny grupy roboczej nie istnieje
lub został otwarty w trybie wyłączności przez innego użytkownika.
/Sprzedaz.NET/rejestracja.asp, line 18
Typ przeglądarki:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Strona:
GET /Sprzedaz.NET/rejestracja.asp
Time:
17 lipca 2004, 20:38:33
Więcej informacji:
Pomoc techniczna Microsoft
Sprawdziłem - plik informacyjny grupy roboczej (System.mdw) istnieje i jest
poprawny.
Czy ktoś wie co może być przyczyną błędu i co z tym zrobić?
Dzięki za pomoc.
J.
"(c) Krzysztof P." <pozo@gazeta.plnapisał:
| (...)
| pytanie w ogole brzmi: jak wykonywac transakcje na wielu ROZNYCH
zrodlach
| danych (w moim przypadku tak jak powyzej - SQLServer6.5 + Access,
| transakcja
IHMO wydaje mi sie, ze nie da sie sensownie zrealizowac transakcji na
roznych zrodlach danych, wtedy sama realizacje transakcji musial by
wykonac sam Access. W przypadku dolaczenia tabeli z SQL'serwera nawet
nie ma zbytniego sensu, gdyz rezygnujemy w ten sposob z transakcji z
prawdziwego zdarzenia realizowanych przez serwer.
Rozwiazanie Krzysztofa jest o wiele czytelniejsze i pewniejsze.
Chciałbym dorzucić swoje trzy grosze.
W MS SQL 7.0 zastosowałem metode podłaczenia zewnętrznej bazy danych Access
: Umo.mdb jako LinkServer. Poniżej przedstawiam kod podłączenia:
---------------------------------------------------------------------
print 'Podlaczam lokalnie baze <UMOpromarz, w celu ulatwienia pracy nad
nia'
exec sp_dropserver 'UMO', 'droplogins'
exec sp_addlinkedserver @server = 'UMO', @provider =
'Microsoft.Jet.OLEDB.4.0', @srvproduct = '', @datasrc = 'M:UMOpromarz.mdb'
exec sp_addlinkedsrvlogin 'UMO', 'false', NULL, NULL, NULL
go
----------------------------------------------------------------------------
-
W bazie na SQL odwołuje sie do tabel z Access jak do zewnetrznego -
zaprzyjaźnionego - servera MS SQL. przykładowy kod połączenia :
select * from Produkty p, UMO...Zlecenia z where
z.IdProduktu=p.IdProduktu
Oczywiście tabela Produktów jest w bierzącej bazie danych na MS SQL. Chodzi
to to całkiem znośnie. A transakcje - wykonuje bez zastrzerzeń.
Pozdrawiam
Krzysztof Kozłowski
PS. Nie pytajcie, gdzie sens w takim układzie tabel i baz, klient płaci,
klient wymaga. Poza tym to jest sytuacja przejściowa chwilowa - moim
zadaniem w firmie jest przewalenie całego serwisu na Oracle...
1) W Delphi łączę się z bazą Access poprzez ADOConnection
(Provider Microsoft.Jet.OLEDB.4.0). Czy można w takim wypadku
wykorzystać dostępne w Access wildcars: "?", "*"? W zapytaniach SQL
w Delphi używam "_" i "%", wildcards z Access nie działają. Czy ten
fakt wpływa na szybkośc działania wyszukiwania z użyciem wildcards?
2) Bazy Access nie są Case Sensitive. Dodaję rekord do bazy. Dodaję
wartość do kolumny, która ma klucz podstawowy (pole to ma założony
indeks bez powtórzeń), np: "Nowak". Jeśli w kolumnie tej jest już
słowo "nowak" (lub np: "nOWAK") jest to wychwytywane jako konflikt
(indeks bez powtórzeń).
Pytanie jest takie: czy w tym momencie baza danych jest ustawiana na
pozycji "nowak". Jeśli tak, to chciałem to wykorzystać to
odpowiedniej modyfikacji tego rekordu. Jeśli nie, to muszę, zdaje
się wykorzystać funkcję Locate aby ustawić bazę na tej pozycji i
dopiero dokonać odpowiedniej edycji rekordu (ale to zdaje się
2-krotnie wydłuża czas trwania operacji w porównaniu z udanym
wstawieniem nowego rekordu).
Takie wstawianie do bazy duplikatów zdarza mi się dosyć często (dane
są wczytywane z różnych plików tekstowych) i takie operacje mogą być
czasochłonne.
Jak w optymalny sposób obsłużyć zdarzenie aktualizacji rekordu przy
próbie wstawiania duplikatu?
3) W zapytaniu często wyszukuję rekordów, które mają w jednym z pól
tekstowych (typu Tekst) określony podciąg. Czy powinienem
zindeksować tę kolumnę, aby przyspieszyć działanie.
Jak powinno wyglądać optymalne zapytanie SQL w Delphi (jaki jest
optymalny kod: ADOQuery1.SQL.Add(?????????))?
Czy to samo można zastosować jeśli pole jest typu Nota, a nie tekst
(max 255 znaków)?
4) Dodawanie nowego rekordu.
Czy lepiej używać:
Form1.ADOQuery1.Append;
Form1.ADOQuery1.FieldByName('Column1').AsString := tekst;
Form1.ADOQuery1.Post;
czy odpowiedniej komendy SQL?
Przy tej okazji: po każdym Append wykonuję Post co na pewno wydłuża
proces. Jeżeli dodaję z pliku 1000 rekordów, to nie jest to
optymalne. Jak powinienem w takim razie postąpić. Czy komendę Post
powienienem wykonać tylko raz, już na samym końcu wczytywania z
pliku?
Z góry dziękuję za wszelką okazaną pomoc
Pozdrawiam
Konrad
W jaki sposób można zaimportować dane pochodzące z pliku *.csv do
tabel w Access-ie? Nie chce importować przez:
[Plik] - [Pobierz dane zewnetrzne] - [Importuj], itd.
Stworzyłem formularz w accesie, chcę oprogramować przycisk, który
zaimportuje dane do tabeli.
Mnie jak narazie udało się oprogramować przycisk, który importuje dane
pochodzące z pliku *.txt do bazy danych Access. Czyli niby jestem
blisko.
Niestety dane wejściowe mam w formacie *.csv i dlatego stanałem przed
tym dylematem.
Pytania dot. tego co jest powyżej:
1. Czy można zaimportować dane z pliku *.cvs do tabeli w bazie Access?
Jezeli tak to czy mogłbym poprosić o podpowiedź w jaki spsoób
oprogramowac przycisk na formularzu, który zaimportuje dane w formacie
*.cvs.
2. Jeżeli nie istnieje możliwość z pkt 1 to w jaki sposób wygenerować
z pliku o formacie *.csv plik formatu *.txt, który będzie wyglądał
następująco:
A/0129;69050814494;MICHEL;KRZYSZTOF;M;57550;STRONIE ŚLĄSKIE;
gdzie średniki oddzielają poszczególne kolumny pochodzące z pliku csv.
To jest przykładowa jedna linia, linii oczywiście będzie więcej.
3. Jak wywołać okno do wczytania pliku. Jak narazie wczytanie danych
wejściowych odbywa się w sposób poniższy, czyli po wskazaniu ściezki
dostępu.
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = C:XXXxxx.mdb"
objRecordSet.Open "SELECT * FROM tabela1", _
objConnection, adOpenStatic, adLockOptimistic
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:folder_xxxplik_xxx.txt")
Witam
W jaki sposób można zaimportować dane pochodzące z pliku *.csv do
tabel w Access-ie? Nie chce importować przez:
[Plik] - [Pobierz dane zewnetrzne] - [Importuj], itd.
Stworzyłem formularz w accesie, chcę oprogramować przycisk, który
zaimportuje dane do tabeli.
Mnie jak narazie udało się oprogramować przycisk, który importuje dane
pochodzące z pliku *.txt do bazy danych Access. Czyli niby jestem
blisko.
Niestety dane wejściowe mam w formacie *.csv i dlatego stanałem przed
tym dylematem.
Pytania dot. tego co jest powyżej:
1. Czy można zaimportować dane z pliku *.cvs do tabeli w bazie Access?
Jezeli tak to czy mogłbym poprosić o podpowiedź w jaki spsoób
oprogramowac przycisk na formularzu, który zaimportuje dane w formacie
*.cvs.
2. Jeżeli nie istnieje możliwość z pkt 1 to w jaki sposób wygenerować
z pliku o formacie *.csv plik formatu *.txt, który będzie wyglądał
następująco:
A/0129;69050814494;MICHEL;KRZYSZTOF;M;57550;STRONIE ŚLĄSKIE;
gdzie średniki oddzielają poszczególne kolumny pochodzące z pliku csv.
To jest przykładowa jedna linia, linii oczywiście będzie więcej.
3. Jak wywołać okno do wczytania pliku. Jak narazie wczytanie danych
wejściowych odbywa się w sposób poniższy, czyli po wskazaniu ściezki
dostępu.
objConnection.Open _
"Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = C:XXXxxx.mdb"
objRecordSet.Open "SELECT * FROM tabela1", _
objConnection, adOpenStatic, adLockOptimistic
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:folder_xxxplik_xxx.txt")
Czołem,
Ad1. Zdaje się że odpowiedź na twoje pytania znajdują sie w archiwum
grupy (sprawdź hasło "import CSV").
Ad2. Możliwość istnieje.
Ad3. Możesz spróbować Własności "FileDialog" z biblioteki Microsoft
Office 11.0 Object Library (MSO.DLL). Dobra alternetywa to archiwum
grupy: "Otwórz plik"
Pozdrawiam,
PK
Aseta wrote:
| Witam Grupowiczów
| Czy udało się komuś zmusić wspomniane w temacie obiekty accessa do
| osadzenia na serwerze www i aby korzystały z dostawcy OLE DB i pliku
| z danymi *.mdb oraz z grupą roboczą system mdw? Jeżeli tak to jakiś
| link.
Na pewno można. Gdzieś widziałem w jakiejś mojej gazetce w czasach kiedy
jeszcze nie wiedziałem co to OLE DB (nie tak dawno ;-))
Nie pamiętam dokładnie ale szło jakoś podobnie jak "normalnie" w access'ie
</?
set cnn1 = new adodb.connection
cnn1.provider = "Microsoft.Jet.OLEDB.4.0"
cnn1.properties("Data Source") = "c:aza.mdb"
cnn1.properties("Jet OLEDB:System database") = "c:system.mdw"
cnn1.properties("User Id") = "juzer"
cnn1.properties("Password") = "pass"
cnn1.open
set rst1 = new adodb.recordset
rst1.open "select ...", cnn1, ...itd, itp.
?/
najpewniej skopałem znaczniki ale było coś z pytajnikiem.
elementy html'a można mieszać z OLE DB, ale te muszą być zamknięte tym
znacznikiem </?...
chyba :o)
na rekordsecie działają zdaje się wszystkie metody i właściwości
nie wiem czy pomogłem, a może się tylko zdrzaźnisz czytając takie
komunały...
ps.jeśli nie pójdzie to może trzeba dodać cnn1.CursorLocation =
adUseServer - przed open
tu znowu pływam...
--
pozdrawiam
ciubson
Witaj
Wiem, ale tu chodzi o to aby cała strona, plik *.mdb i grupa robacza była na
serwerze (np. http://www.aseta.pl/system.mdw)
Z dysku czy z intanetu ściąga i jest OK ale przez protokół http nie.
Bawiłem się też ustawieniem właściwości "UseRemoteProvider" strony dostępu i
nic na wszelkie sposoby.
Włodek
as@aseta.pl
"Stanley P" <stan@pertus.com.plwrote in message
| Witam
|
| I tym razem ja pytam. Trochę temu (oj chyba rok, jak nie prawie dwa) był
| tu podawany link do poprawionej wersji ODT2k - chodziło o to (o ile
| pamiętam), aby nie dołączał do setupu IE. Czy ktoś z szanownych
| grupowiczów może przypomnieć namiary? Obiecuję wrzucić na witrynkę...
| ;-)
Alternate Version of the Access Run Time
http://msdn.microsoft.com/code/sample.asp?url=/msdn-files/027/001/434...
lub od razu
http://download.microsoft.com/download/office2000dev/art2kmin/1/WIN98...
Warto rzucić okiem na cały dział MSDN downloads:
http://msdn.microsoft.com/downloads/default.asp
np.
Office 2000 Developer Tools Service Release 1 Patch
http://download.microsoft.com/download/office2000dev/patch/sr1/win98/...
Office 2000 Developer Tools Service Patch 2
http://msdn.microsoft.com/msdn-files/027/001/581/MODUpdateSP2.exe
Przy okazji parę innych linków:
Access Update
http://search.officeupdate.microsoft.com/downloadCatalog/default.asp?...
Updated Version of Microsoft Jet 4.0
http://support.microsoft.com/support/kb/articles/Q239/1/14.asp
Updated Version of Microsoft Jet 3.5
http://support.microsoft.com/support/kb/articles/Q172/7/33.ASP
| P.S. Próbowałem przeszukiwać sieć, archiwa grupy, lecz speed o tej
| porze...
| Przy okazji: czy ktoś zna namiary dobrych (nalepiej w kraju)
| przeszukiwarek archiwów newsów, chociazby w hierarchii pl.? Także
| obiecuję dorzucić do linkowni na swojej stronie... DejaNews teraz
| przekierowuje na jakieś Goggle, zresztą prędkość o tej porze jak 2
| zdania wczesniej.
Deja zostało chyba przejęte przez Google.
Poza tym jest kiepskie, bo kompletnie nie obsługuje polskich znaków.
Może trzeba stworzyć werszcie własne archiwum?
Najlepiej w ramach większego serwisu accessowego. :-)
| Oto kod:
(...)
| Set objRecordSet = CreateObject("ADODB.Recordset")
|
| objConnection.Open _
| "Provider = Microsoft.Jet.OLEDB.4.0; " & _
| "Data Source = C:FolderPlik.mdb"
| objRecordSet.Open "SELECT * FROM Kredytobiorcy", _
| objConnection, adOpenStatic, adLockOptimistic
(...)
| Set objfso = CreateObject("Scripting.FileSystemObject")
| Set objfile = objfso.OpenTextFile(sFile)
|
| Do Until objfile.AtEndOfStream
| strCREDIT = objfile.ReadLine
| arrcredit = Split(strCREDIT, ";")
| objRecordSet.AddNew
| objRecordSet("Numer") = arrcredit(0)
| objRecordSet("PESEL") = arrcredit(1)
| [kolejne kolumny ktorych nie wklejalem]
|
| objRecordSet.Update
| Loop
Jeśli robisz to z poziomu access'a (a wszystko na to wskazuje), to
samodzielnie parsując linie pliku tekstowego wynajdujesz koło...
Od zawsze Jet potrafi obrabiać pliki tekstowe (i inne), za pośrednictwem
sterowników ISAM.
Najprościej jest z plikami csv właśnie, bo dla nich nawet nie trzeba
tworzyć specyfikacji importu/eksportu.
Wystarczy więc taka prosta kwerenda:
Insert Into Kredytobiorcy ({pola})
Select {pola}
from
[Text;FMT=Delimited;HDR=YES;IMEX=2;DATABASE=C:ścieżka].NazwaPliku#txt
W przypadku innych plików tekstowych (nie średnik i bez cudzysłowów
specyfikujących pola tekstowe) należy najpierw stworzyć specyfikację
importu (np. MojaSpec1) i użyć ją później w ciągu połączenia:
select * From
[Text;DSN=MojaSpec1;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=1250;DATABASE=F:Access2k].Plik#txt
Jak widać z powyższego, można nawet zdefiniować z jakiej strony kodowej
dane mają być zaimportowane (1250).
Jeśli ktoś nie chce samodzielnie tworzyć specyfikacji importu/eksportu,
może programowo tworzyć i wykorzystać plik schema.ini
(archiwum/google)
studnia wrote:
Mam podobne pytanko, z ymże nieco bardziej skomplikowane..
Otóż mam formularz na którym chcę umieścić przycisk eksportuj do
excela i eksport ten ma polegać na tym, że do z góry określonego
pliku excelowskiego mają się wrzucać dane z określonych kwerend
(ale nie z formularzy).
Akurat trochę odwrotnie bo z poziomu VBA excela ściąganie danych z SQL
do XLS, ale jak jesteś inteligenty to zajarzysz.
Excela można spokojnie otworzyć jak bazę danych.
Popatrz na connection string do pliku excelowego, a query napiszesz już
sobie sam.
Dwa triki.
1 . Nazwa arkusza excelowskiego w SQL ma $ na końcu, czyli
insert into Arkusz1$
2. pierwszy wiersz w excelu musi miec nazwy kolumn
Public Sub Main()
On Error GoTo ErrHandler
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Dim XLSConnStr As String
XLSConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
??????;Extended Properties=Excel 8.0;"
'
Dim SQLConnStr As String
SQLConnStr = "Driver={SQL
Server};Server=?????;Database=?????;Trusted_Connection=yes;"
Dim SQLConn As ADODB.Connection
Dim XLSConn As ADODB.Connection
Set SQLConn = New ADODB.Connection
SQLConn.Open SQLConnStr
Set XLSConn = New ADODB.Connection
XLSConn.Open XLSConnStr
Dim rst As New ADODB.Recordset
rst.Open "Select * from Project", SQLConn
While Not rst.EOF
XLSConn.Execute "insert into [Data$] (ProjectID, ProjectName)
values ( aaa, bbb)"
'
rst.MoveNext
Wend
SQLConn.Close
XLSConn.Close
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Exit Sub
ErrHandler:
MsgBox Err.Description
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
A przy okazji, pozostawiłem w poprzedniej odpowiedzi Twoje p.3 i 4 a nie
ustosunkowałem się. Zatem w miarę krótko:
ad.3 Niestety w accessowych zabezpieczeniach na poziomie użytkownika nie
mozna ustanowić (a raczej odebrać) "prawa do odkrywania obiektów
ukrytych", po prostu takiego rodzaju uprawnienia nie ma. Przynajmniej w
Acc'97 - w wyższych (2k, XP) o ile mi wiadomo model i zakres dostepnych
uprawnień istotnie sie nie zmienił. Ale moze sie mylę...
W sumie faktycznie przegapiłem pewną rzecz (wstyd).
W mojej bazie usunąłem wszystkie uprawnienia Administratora a pozostawiłem
uprawnienia pozostałym użytkownikom. Jest OK.
ad.4 Skoro usiłujesz zaimplementować jakiś własny system zabezpieczeń,
bez stosowania chocby w stopniu elementarnym zabezpieczeń "firmowych"
wbudowanych w Accessa, to nie dziw sie, że kazdy nieco kumaty moze wejsc
i modyfikować projekt tabeli...
Właśnie tu mam problem. Bo jak już wspomniałem mam napisany program,
który jest wykorzystywany do obsługi bazy tam gdzie nie ma Accessa. Program
napisałem w niezbyt znanym j. programowania ADA95. Dla tego języka nie
ma ŻADNEJ literatury w Polsce, która traktuje o dostępie do danych w bazach.
Wygrzebałem w bibliotekach sposób jak podłączyć się do bazy Accessa, ale
w momencie kiedy zabezpieczę bazę jak wyżej nie mam dostępu do danych i
nie mogę się doszukać jak to zrobić.
Dostęp uzyzskuję tak:
Open (DB_Control.Database,
"Provider=Microsoft.Jet.OLEDB.4.0; "&
"Data Source=c:aza.mdb");
znalazłem w bibliotece, że w instrukcji Open mogą być jeszcze dwa parametry
tzn: User_Id oraz Password, ale za nic to nie chce działać.
Może coś doradzisz??
MAriusz
'Create a new ADO Connection object
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Access.OLEDB.10.0"
.Properties("Data Provider").Value = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source").Value = _
"D:AsFabrykaAdp est.mdb"
.Open
End With
'Create an instance of the ADO Recordset class, and
'set its properties
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Source = "SELECT * FROM table1"
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
End With
'Set the form's Recordset property to the ADO recordset
Set Me.Recordset = rs
Set rs = Nothing
Set cn = Nothing
Set Me.Combo.RowSource = rs '#blad cutuje: inwalid use
of property
Set rs = Nothing
Set cn = Nothing
End Sub
-----------------------------------------------------
Dziala jezeli chodzi o "zasilenie formularza, ale przy probie popiecia do
wlasciwosci zrodlo wierszy wychodzi blad"
VVlodek
Użytkownik wrote:
| To 'baza.update' jest tu niepotrzebne bo zapisuje edycję recordseta,
| a nie
Dodałem to na wszelki wypadek
Oto kod:
Option Compare Database
Public baza As New ADODB.Recordset
Public con As New ADODB.Connection
Public sciezka As String
Private Sub Form_Close()
baza.Close
End Sub
Private Sub Form_Current()
Me![RekordB] = Me.CurrentRecord
End Sub
Private Sub Dodaj_Click()
On Error GoTo Err_Dodaj_Click
DoCmd.GoToRecord , , acNewRec
Exit_Dodaj_Click:
Exit Sub
Err_Dodaj_Click:
MsgBox Err.Description
Resume Exit_Dodaj_Click
End Sub
' wyglada na to, ze baza biezaca i test_wb.mdb to to samo zrodlo
' tak wnioskuje na podstawie sposobu zapisu danych
' zmienilbym linie baza.open ...
Private Sub Form_Open(Cancel As Integer)
Rem sciezka = "Data Source = c:pracaaza
est_wb.mdb;"
Rem con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & sciezka
baza.Index = "ID1"
baza.Open "tblKontrahent",CurrentProject.Connection, adOpenKeyset, _
adLockOptimistic, adCmdTable
baza.MoveLast
Me![RekordW] = baza.RecordCount
baza.MoveFirst
End Sub
Private Sub Zapisz_Click()
On Error GoTo Err_Zapisz_Click
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, ,
acMenuVer70
' tu tez zmiana
baza.Requery
baza.MoveLast
Me![RekordW] = baza.RecordCount
baza.MoveFirst
Exit_Zapisz_Click:
Exit Sub
Err_Zapisz_Click:
MsgBox Err.Description
Resume Exit_Zapisz_Click
End Sub
Private Sub Cofnij_Click()
On Error GoTo Err_Cofnij_Click
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
Exit_Cofnij_Click:
Exit Sub
Err_Cofnij_Click:
MsgBox Err.Description
Resume Exit_Cofnij_Click
End Sub
Co śmieszniejsze jak dwa razy kliknę na zapisz rekord to recordcount
zaktualizuje się poprawnie.
Być może wynika to ze zwłoki odświeżania danych (???)
A tak w ogóle to moim zdaniem w Twoim kodzie jest dużo przekombinowane. Przynajmniej w tym fragmencie recordset sluży tylko do odpytania go o RecordCount. Być może robisz to w celach szkoleniowych (?).
Może zainteresuje Cię wątek "'Asynchroniczne' wyliczane pola z 'ilu'", z 7.paź by R. Krawiec
---
KCiuba
Function CreateLinkedDB()
Dim oCatSource As New ADOX.Catalog
Dim oTblSource As New ADOX.Table
Dim oCatNew As New ADOX.Catalog
Dim oTblNew As New ADOX.Table
'Create new access database
oCatNew.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=d:dbaseMojaBaza.mdb"
'Open the catalog (nowa Access db).
oCatNew.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=d:dbaseMojaBaza.mdb"
' Open the catalog (istniejaca SQL db).
oCatSource.ActiveConnection = _
"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=pubs;Data Source=(local)"
'Cycle through all tables and link to sql server.
For Each oTblSource In oCatSource.Tables
' Check to make sure each table is a linked table.
If oTblSource.Type = "TABLE" Then
Set oTblNew.ParentCatalog = oCatNew
With oTblNew
.Name = oTblSource.Name
.Properties("Jet OLEDB:Create Link") = True
.Properties("Jet OLEDB:Link Provider String") = _
"ODBC;" & _
"Driver={SQL Server};" & _
"Server=(local);" & _
"Database=Pubs;" & _
"Trusted_Connection=Yes;" & _
"Uid=sa;" & _
"Pwd=;"
.Properties("Jet OLEDB:Remote Table Name") =
oTblSource.Name
.Properties("Jet OLEDB:Table Hidden In Access") = False
.Properties("Jet OLEDB:Cache Link Name/Password") =
False
.Properties("Jet OLEDB:Exclusive Link") = False
End With
oCatNew.Tables.Append oTblNew
Set oTblNew = Nothing
End If
Next
oCatNew.Tables.Refresh
Set oTblSource = Nothing
Set oTblNew = Nothing
Set oCatNew.ActiveConnection = Nothing
Set oCatNew = Nothing
Set oCatSource.ActiveConnection = Nothing
Set oCatSource = Nothing
End Function
Ale ...
poczytalem w helpie A97 sekcje
"Porównanie języka SQL aparatu bazy danych Microsoft Jet z ANSI SQL".
jest taki akapit
"Dodatkowe cechy języka Microsoft Jet SQL.
Microsoft Jet SQL obejmuje następujące cechy dodatkowe:"
a tam element
"- Deklarację PARAMETERS pozwalającą na definiowanie kwerend
parametrycznych."
I dalej cytuje M$ (Help Access 97)
"Kwerenda parametryczna.
Kwerenda wymagajaca przed uruchomieniem podania jednego lub wiecej
kryteriow, np. Warszawa dla parametru Miasto.
SCISLEJ MOWIAC, KWERENDA PARAMETRYCZNA NIE JEST
ODDZIELNYM TYPEM KWERENDY; ZWIEKSZA ONA RACZEJ
ELASYCZNOSC KWEREND."
Pytanie:
Skoro M$ wprowadzil pojecie PARAMETROW i Kwerende parametryczna
jako "Zwiekszenie elastycznosci" standardu SQL ANSI-89, to dlaczego nie
zaimplementowano drobnego rozszerzenia w postaci podania parametrow
nie jako "wpis z palca", ale rowniez jako syntax podany przeze mnie w poscie
wywolujacym watek:
"NazwaKwerendyParametrycznej [WartoscParametru1], ..., [WartoscParametruN]"
?
Poczytalem opis zagadnienia w ksiazce "Access 2002 Ksiega Experta",
aby zobaczyc czy cos sie zmienilo.
Cuytuje, str. 94:
"Uzycie kwerend parametrycznych
[...]
Przed uruchomieniem kwerendy uzytkownik musi podac wymagane dane.
[...]"
Cuytuje, str. 95:
"W oknie dialogowym sluzacym do definiowania parametrow kwerendy typ danych
parametru mozna ustawic, korzystajac z listy rozwijanej, dostepnej w
kolumnie
TYP DANYCH.
Parametrem moze byc zdanie o maksymalnej dlugosci 255 znakow. Umozliwia
to zadawanie uzytkownikom pytan o kryteria w bardziej zrozumialy lub
poprostu
bardziej grzeczny sposob. Zmien parametr i sposob jego przedstawienia
na 'Prosze wprowadzic klienta'.
Uruchom kwerende i w odpowiedzi na pytanie o parametr wpisz 'Quick'.
W zestawie rezultatow znajda sie wszystkie rekordy , w ktorych IDklienta
jest 'Quick'."
------------------------
A wiec Jet przyjmuje parametry z malego formularza podobnego do formy
MsgBox, ale juz nie przyjmuje podania ich wprost w dowolnie innym miejscu.
Jak dla mnie to najdelikatniej mowiac celowe i zamierzone "niedopatrzenie",
Pozdrawiam,
Krzysiek
© 2009 Najlepszy miesiąc kawalerski w Polsce !!! - Ceske - Sjezdovky .cz. Design downloaded from free website templates