Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chriss Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Database Question 2

Status
Not open for further replies.

SmileeTiger

Programmer
Mar 13, 2000
200
US
I have created a password table within my database (created in MS access) and I want to have VC++ open this table and check to see if there is an entry for a particular User ID and Password that is entered in a text box. If there is a entry in the table the program retrive the access level from the database and but it in a variable for later use. Does anyone have any idea how to do this?<br>
<br>
FYI<br>
Text Boxes<br>
UserID: IDC_CardID<br>
Password: IDC_PIN<br>
<br>
The name of the database is: Student Registration System I have already registered the database with ODBC and I have retrieved data from the database elsewhere in my program.<br>
<br>
The data i want is in the passwords table in that database. So the cadrID should be chacked against the username field and the Password should be checked against the password field. If the match the accesslevel field coresponding to that record should be returned otherwise the program should display something like: AfxMessageBox(&quot;Bad Log In Attempt: Please try again&quot;);<br>
Thanks in advance for your help
 
There're are several ways you could ue DAO(fastest but only singlethreaded), could use thr raw ODBC dll, or you could do what i'm doing,<br>
which seems easiest, in a method that you dont even have to declare the recordset format , using ADO.<br>
<br>
#import &quot;C:\Program Files\Common Files\System\ADO\msado15.dll&quot; rename_namespace(&quot;ADOCG&quot;) rename(&quot;EOF&quot;,&quot;EndOfFile&quot;)<br>
using namespace ADOCG;<br>
<br>
that'll include the ADO libraries<br>
<br>
_ConnectionPtr m_pConnection;<br>
this will declare a connection pointer to the database(whenever creating and assigning something to a recordset pointer, you'll either need to give it a connectino pointer, or tell it where to connect)<br>
m_pConnection.CreateInstance( __uuidof(Connection) );<br>
this will initialize it for usage<br>
<br>
<br>
::CoInitialize(NULL); <br>
[whenever working with recordsets i recomend initializing the COM enviroment before entering the function and ::CoUninitialize();<br>
before leaving a function]<br>
<br>
_RecordsetPtr m_pRecordSet; <br>
m_pRecordSet.CreateInstance( __uuidof(Recordset) );<br>
<br>
(as you can see connectino and recordset declaring, and initializing is pretty similar)<br>
<br>
Once you got a connectino open(you could make this global and have several recordsets use the same connection)<br>
(But in my situation, such as a multithreaded server , i assign a connection pointer to each thread which is turns has a recordset)<br>
<br>
m_pConnection-&gt;Open(L&quot;DSN=ldap&quot;, L&quot;&quot;, L&quot;&quot;, -1);<br>
<br>
this it eh method i use, i know you can use the name of the database<br>
but the L&quot;DSN=ldap&quot; means in the ODBC32 control(located in control pannel)<br>
i've defined a systemwide link to the database and named it ldap<br>
(this makes it much easier than defining the path in vC++ all the time, just linking to the DSN name helps alot)<br>
<br>
now theres several ways you can do this to open and read info from a recordset<br>
I use Lots of SQL commands when opening a recordset<br>
(SQL QUery commands really help in determining a criteria for whats seleted in the recordset)<br>
<br>
for example:<br>
<br>
int CUT_FTPThread::OnCheckPassword(struct sUsers &CkPass)<br>
{<br>
::CoInitialize(NULL); _RecordsetPtr m_pRecordSet; m_pRecordSet.CreateInstance( __uuidof(Recordset) );<br>
int rt = FALSE; char sqlexec[255];<br>
if((lstrlen(CkPass.Password) &lt;1) ¦¦ (lstrlen(CkPass.Email) &lt; 1)) return FALSE;<br>
<br>
wsprintf(sqlexec,&quot;select * from Users where Email = '%s' and Password = '%s'&quot;, CkPass.Email, CkPass.Password);<br>
m_pRecordSet-&gt;Open( sqlexec, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );<br>
<br>
if(!m_pRecordSet-&gt;EndOfFile)<br>
{<br>
strncpy(m_user,CkPass.Email,MAX_PATH-1);<br>
strcpy(CkPass.UID,FieldToChar(m_pRecordSet,L&quot;UserID&quot;));<br>
m_pRecordSet-&gt;Close(); ::CoUninitialize(); return TRUE;<br>
}<br>
m_pRecordSet-&gt;Close(); <br>
::CoUninitialize(); <br>
return FALSE; <br>
}<br>
<br>
a simple &quot;select * from TableNameHere&quot; will store all the records and feilds from that table into the recordset<br>
you could do &quot;Select FieldName from Table&quot; to get just a feild of all the records<br>
same with &quot;select field1,field2 from table&quot; <br>
youc an select multiple tables, but i wont get into that right now<br>
<br>
the FieldToChar() command is something i made, to retreive the varient values, makes it easier for me<br>
<br>
char* CUT_FTPThread::FieldToChar(_RecordsetPtr recset, _variant_t Fieldname) {<br>
_variant_t tmpvariant; char tmpChar[255];<br>
tmpvariant = recset-&gt;GetCollect(Fieldname); strcpy(tmpChar,(_bstr_t)tmpvariant);<br>
return (tmpChar);<br>
}<br>
<br>
You'll get a warning with this about returning pointer of local variable, but it works as far as i've worked with it<br>
just dont assign the reference, make it return the value, not it's addresse then you'll be fine<br>
<br>
Inserting & Deleting:<br>
<br>
int CUT_FTPThread::InsertLDAP(LPSTR userid, LPSTR pcid, LPSTR ipAddress, int online)<br>
{<br>
::CoInitialize(NULL); _RecordsetPtr m_pRecordSet; m_pRecordSet.CreateInstance( __uuidof(Recordset) );<br>
char sqlexec[255];<br>
<br>
wsprintf(sqlexec,&quot;delete * from LDAP where PCID = %s&quot;, pcid);<br>
m_pRecordSet-&gt;Open(sqlexec , m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );<br>
<br>
if(online)<br>
{wsprintf(sqlexec,&quot;Insert into LDAP (PCID, UID, Online, IP) values (%s,%s,1,'%s')&quot;,pcid, userid,ipAddress);}<br>
else<br>
{wsprintf(sqlexec,&quot;Insert into LDAP (PCID, UID, Online, IP) values (%s,%s,0,'%s')&quot;,pcid, userid,ipAddress);}<br>
<br>
m_pRecordSet-&gt;Open(sqlexec, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );<br>
::CoUninitialize(); return TRUE;<br>
}<br>
<br>
<br>
Getting a Maximum value:<br>
m_pRecordSet-&gt;Open( &quot;select max(UserID) as MaxUID from Users&quot;, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );<br>
<br>
almost all these other commands are in the help files, or located at MSDN for SQL Servers, and should be located in the<br>
Access97(at least) help file<br>
got more questions let me know <p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
Thanks for your help but I still have a few problems. Below is what I have done so far..<br>
<br>
_ConnectionPtr m_pConnection; //Declares a connection pointer to the database<br>
//Creates an instance of the connection<br>
m_pConnection.CreateInstance( __uuidof(Connection) );<br>
m_pConnection-&gt;Open(L&quot;DSN=Student Registration System&quot;, L&quot;&quot;, L&quot;&quot;, -1);<br>
//this should go in a function when it works<br>
int m_AccessLevel;<br>
::CoInitialize(NULL); _RecordsetPtr m_pRecordSet;<br>
m_pRecordSet.CreateInstance( __uuidof(Recordset) );<br>
int rt = FALSE; char sqlexec[255];<br>
wsprintf(sqlexec,&quot;select AccessLevel from Password where UserName = '%s' and Password = '%s'&quot;, m_CardID, m_PIN);<br>
m_pRecordSet-&gt;Open( sqlexec, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );<br>
if(!m_pRecordSet-&gt;EndOfFile)<br>
{<br>
//strncpy(m_CardID,CkPass.Email,MAX_PATH-1);<br>
strcpy(m_AccessLevel,FieldToChar(m_pRecordSet,L&quot;AccessLevel&quot;));<br>
m_pRecordSet-&gt;Close(); ::CoUninitialize(); <br>
<br>
}<br>
m_pRecordSet-&gt;Close(); <br>
::CoUninitialize(); <br>
<br>
The particular problem that I am having is that I am not sure what exactly to put inside if(!m_pRecordSet-&gt;EndOfFile){}<br>
I assume that where UserName = '%s' and Password = '%s'&quot;, m_CardID, m_PIN); selected the record that has the CardID and PIN that were entered into the text box. <br>
so:if(!m_pRecordSet-&gt;EndOfFile){} should put the value of AccessLevel from the table into the variable m_AccessLevel (it's an int).<br>
<br>
Also one other thing that I came across is that for the <br>
prototype char* FieldToChar(_RecordsetPtr recset, _variant_t Fieldname); is says that ....registrationsystem\registrationview.h(91) : error C2061: syntax error : identifier '_RecordsetPtr'<br>
<br>
Thanks again for all your help.<br>
<br>
Cory
 
you might need to include<br>
#include &lt;icrsint.h&gt;<br>
the if(!m_pRecorset-&gt;EOF...) that basicaly test to make sure the recordset isnt <br>
empty<br>
you could even use that same thing in a While loop, if you wanted to go thru the <br>
entire records, using -&gt;next and so on, and it'll exit when it hits the last record<br>
Let me know if this works. <p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
I am still having some trouble. I didn't use your conversion function since I don't really need it (I think).<br>
<br>
I am now trying to display the Access Level on the screen of the user based upon his login name and password.<br>
<br>
A sample login and password would be UserID: 1 Password: adminpw<br>
<br>
In my database all values are text.<br>
<br>
When I try to login to the system however, the program only displays the number -85899346 in the text box.<br>
Any ideas?<br>
<br>
Below is the code I am using:<br>
_ConnectionPtr m_pConnection; //Declares a connection pointer to the database<br>
//Creates an instance of the connection<br>
m_pConnection.CreateInstance( __uuidof(Connection) );<br>
m_pConnection-&gt;Open(L&quot;DSN=Student Registration System&quot;, L&quot;&quot;, L&quot;&quot;, -1);<br>
//this should go in a function when it works<br>
char* m_AccessLevel;<br>
::CoInitialize(NULL); _RecordsetPtr m_pRecordSet;<br>
m_pRecordSet.CreateInstance( __uuidof(Recordset) );<br>
int rt = FALSE; char sqlexec[255];<br>
wsprintf(sqlexec,&quot;select AccessLevel from Password where UserName = '%s' and Password = '%s'&quot;, m_CardID, m_PIN);<br>
m_pRecordSet-&gt;Open( sqlexec, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText );<br>
if(!m_pRecordSet-&gt;EndOfFile)<br>
{<br>
//strncpy(m_CardID,CkPass.Email,MAX_PATH-1);<br>
strcpy(m_AccessLevel,(char*)L&quot;AccessLevel&quot;);<br>
m_pRecordSet-&gt;Close(); ::CoUninitialize(); <br>
<br>
}<br>
m_pRecordSet-&gt;Close(); <br>
::CoUninitialize(); <br>
<br>
m_Test=(int)m_AccessLevel;<br>
<br>
Note: m_test is the variable that I have linked to the text box and it is of the type int.<br>
<br>
Thanks again for your help<br>
Cory M Hicks<br>
<br>
BTW I am posting this info both on the message bord and in a email just respond to one of them. I am putting it on the list in case anyone else has some ideas.<br>
<br>

 
Do you have the Access Database pointed to correctly in the ODBC driver setup <br>
under control pannel , and dont have spaces, make the name simple, all lower case, <br>
single worded if possible <br>
<br>
also you should ::CoInitialize before the connectino as well, probally didnt make that <br>
clear<br>
<br>
and you need my function<br>
all yer doing is assigning the addresse of the literal &quot;AccessLevel&quot; right into the string <br>
pointer<br>
my function, retreives the actual text value from the database, then reutnrs a pointer <br>
to the actual string<br>
L is not a function, it allows the charater array to be passed to the functino as a <br>
variant.<br>
also for an integer, typecasting a charater array to an int, is inadvisible<br>
use atoi(character) in place of (int)char<br>
it'll return a interger<br>
Later tonight when i get home, I might be able to resquest a small sample of the database, and i'll try writing the code with your database. <p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
oh btw, disregard that part about the DSN , if you were able to attach the recordset without it crashing, it might have linked ok then <p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
Oh almost forgot, make sure its under System DSN, not User DSN <p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
On mine i got mine setup as &quot;Data Source Name &quot; is ldap<br>
the description is blank, the database is an Access97 db<br>
, under database, i have it pointing to c:\....\ldap.mdb<br>
and System Database, i chose none <p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
Ok I've rewritten your code<br>
<br>
// This is a fresh &quot;MFC capable&quot; console app made in VC++, the only important part <br>
is the <br>
// the declarations added, and the part after the Else, which is where the actual <br>
program starts<br>
// this may have some errors in it, i just fixed it up the database i used from your code <br>
is as followed<br>
// it is called SRS.mdb, but i linked it with the DSN name you chosen<br>
// also it has a single table called Password, which has 3 items in it UserName, <br>
Password, AccessLevel, all text<br>
// I've gotten a Access Violation after the entire program is done, probally because <br>
of this console mode, i dont know<br>
// you possibly might nto get it, but i have verified, it retrived the AccessLevel <br>
Sucessfully<br>
<br>
#include &quot;stdafx.h&quot;<br>
#include &quot;ADOrvw.h&quot;<br>
///important declarations<br>
#import &quot;C:\Program Files\Common Files\System\ADO\msado15.dll&quot; <br>
rename_namespace(&quot;ADOCG&quot;) rename(&quot;EOF&quot;,&quot;EndOfFile&quot;)<br>
using namespace ADOCG;<br>
#include &lt;icrsint.h&gt;<br>
//end of added declarations<br>
#ifdef _DEBUG<br>
#define new DEBUG_NEW<br>
#undef THIS_FILE<br>
static char THIS_FILE[] = __FILE__;<br>
#endif<br>
<br>
/////////////////////////////////////////////////////////////////////////////<br>
// The one and only application object<br>
<br>
CWinApp theApp;<br>
<br>
using namespace std;<br>
<br>
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])<br>
{<br>
int nRetCode = 0;<br>
<br>
// initialize MFC and print and error on failure<br>
if (!AfxWinInit:):GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))<br>
{<br>
// TODO: change error code to suit your needs<br>
cerr &lt;&lt; _T(&quot;Fatal Error: MFC initialization failed&quot;) &lt;&lt; endl;<br>
nRetCode = 1;<br>
}<br>
else<br>
{<br>
char m_CardID[25], m_PIN[25];<br>
strcpy(m_CardID,&quot;K&quot;); strcpy(m_PIN, &quot;LKM&quot;);<br>
::CoInitialize(NULL);<br>
_ConnectionPtr m_pConnection; m_pConnection.CreateInstance( <br>
__uuidof(Connection) );<br>
m_pConnection-&gt;Open(L&quot;DSN=Student Registration System&quot;, L&quot;&quot;, L&quot;&quot;, -1);<br>
<br>
char m_AccessLevel[128]; //has to be able to store the value, not point to it<br>
_RecordsetPtr m_pRecordSet; m_pRecordSet.CreateInstance( <br>
__uuidof(Recordset) );<br>
int rt = FALSE; char sqlexec[255];<br>
wsprintf(sqlexec,&quot;select AccessLevel from Password where UserName = '%s' and <br>
Password = '%s'&quot;, m_CardID, m_PIN);<br>
m_pRecordSet-&gt;Open( sqlexec, m_pConnection.GetInterfacePtr(), <br>
adOpenDynamic, adLockOptimistic, adCmdText );<br>
if(!m_pRecordSet-&gt;EndOfFile)<br>
{<br>
//strncpy(m_CardID,CkPass.Email,MAX_PATH-1);<br>
//the following is basically the same thing as my FieldToChar function<br>
_variant_t tmpvariant;<br>
tmpvariant = m_pRecordSet-&gt;GetCollect(L&quot;AccessLevel&quot;);<br>
strcpy(m_AccessLevel,(_bstr_t)tmpvariant);<br>
// instead of doing three lines, my function, lets you do the copy right in the strcpy, <br>
that way if yer getting lots<br>
// and lots of values, this would greatly simplfy your typing look below as i <br>
commented the function if you want to use it<br>
//m_pRecordSet-&gt;Close(); ::CoUninitialize(); already gets uninitilized and closed <br>
anyways at the end of the program<br>
}<br>
m_pRecordSet-&gt;Close();<br>
m_pConnection-&gt;Close(); //must close connection as well at the end<br>
::CoUninitialize();<br>
//m_Test=atoi(m_AccessLevel); //more efficient, and safter than typcasting in my <br>
opinion<br>
/*<br>
char* CUT_FTPThread::FieldToChar(_RecordsetPtr recset, _variant_t <br>
Fieldname) <br>
{<br>
_variant_t tmpvariant;<br>
char tmpChar[255];<br>
tmpvariant = recset-&gt;GetCollect(Fieldname);<br>
strcpy(tmpChar,(_bstr_t)tmpvariant);<br>
return (tmpChar);<br>
}<br>
*/<br>
<br>
}<br>
<br>
return nRetCode;<br>
}<br>
<p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
Ok this orks fine as long as I have the entry Username:k Password:lkm in my passwords table... but I still need to retrieve the data (usernema and password) from the text fields. How would I do that?<br>
<br>
Oh and I assume the line m_Test=atoi(m_AccessLevel); //more efficient, and safter than whould not be commented out right?<br>
<br>
Cory
 
To phrase that better... I need to take the data from the username and password text fields and use those for the searching.
 
Modify the code for your use by replacing the variables or assinging to them in other ways<br>
<br>
for the other values, you'll need to change your Select statement to like<br>
select * from permisions<br>
(this will load every single record into the recordset)<br>
or if you just do <br>
select * from Password where User =....<br>
this will put all feilds into the recordset with matching criteria<br>
<br>
_variant_t tmpvariant;<br>
tmpvariant = m_pRecordSet-&gt;GetCollect(L&quot;NameOfField&quot;);<br>
strcpy(YourCharaterArray,(_bstr_t)tmpvariant);<br>
<p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
CStrings would be fine, just make this minor change<br>
wsprintf(sqlexec,&quot;select AccessLevel from Password where UserName = '%s' and <br>
Password = '%s'&quot;,(LPSTR&)m_CardID,(LPSTR&)m_PIN);<br>
need to type cast the CStrings to (LPSTR&)<br>
<p>Karl<br><a href=mailto:kb244@bellsouth.net>kb244@bellsouth.net</a><br><a href= </a><br>Experienced in , or have messed with : VC++, Borland C++ Builder, VB-Dos, VB1 thru VB6, Delphi 3 pro, Borland C++ 3(DOS), Borland C++ 4.5, HTML, ASP(somewhat), QBasic(hehe, yea it was 4.5 too, least i didnt start with COBOL)
 
After a webchat Karl showed me what was wrong with my code. Here is the final solution to my problem<br>
<br>
void CRegistrationView::OnButton3() <br>
{<br>
::CoInitialize(NULL);<br>
_ConnectionPtr m_pConnection; m_pConnection.CreateInstance(__uuidof(Connection) );<br>
m_pConnection-&gt;Open(L&quot;DSN=Student Registration System&quot;, L&quot;&quot;, L&quot;&quot;,-1);<br>
<br>
char m_AccessLevel[128]; //has to be able to store the value, not point to it<br>
_RecordsetPtr m_pRecordSet; <br>
m_pRecordSet.CreateInstance(__uuidof(Recordset) );<br>
int rt = FALSE;<br>
char sqlexec[255];<br>
<br>
m_CardIdBox.GetWindowText(m_CardID);<br>
m_PINBox.GetWindowText(m_PIN);<br>
//converts from cstring to char*<br>
wsprintf(sqlexec,&quot;select AccessLevel from Password where UserName ='%s' and Password = '%s'&quot;,(LPSTR&)m_CardID,(LPSTR&)m_PIN);<br>
m_pRecordSet-&gt;Open( sqlexec, m_pConnection.GetInterfacePtr(),adOpenDynamic, adLockOptimistic, adCmdText );<br>
if(!m_pRecordSet-&gt;EndOfFile)<br>
{<br>
_variant_t tmpvariant;<br>
tmpvariant = m_pRecordSet-&gt;GetCollect(L&quot;AccessLevel&quot;);<br>
strcpy(m_AccessLevel,(_bstr_t)tmpvariant);<br>
<br>
}<br>
m_pRecordSet-&gt;Close();<br>
m_pConnection-&gt;Close(); //must close connection as well at the end<br>
::CoUninitialize();<br>
m_Test=atoi(m_AccessLevel); //more efficient, and safter than typcasting in my opinion<br>
<br>
UpdateData(FALSE);<br>
<br>
<br>
<br>
}<br>
<br>
<br>
Thanks again karl!
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top