|
My program is written in Visual C++. I want the users to be able to do complex queries and generate reports. That's why I chose to display it in Access. I guess I can't avoid having the data read-only because it has to be manipulated. How do I proceed with this?
|
|
|
|
|
I did this before, but it was used to copy a few smaller tables into Access instead of very large ones, as you plan to do. I would crete a linked table to the MSDE in Access and then used two queries in Access. The first was a Delete query to remove the data from the table in Access and then an Append query to fill the table with the data from MSDE. I combined the two queries in a Macro (although you could code it as well) and ran the query in the OnLoad event of my Main Form.
The DSN was not an issue, as it was created with the original front end Access.mdb and when I sent out copies of the mdb, the DSN remained with the mdb file. I did not have to create DSNs on other computers.
Not sure if this helps or not.
Marc
|
|
|
|
|
I am going through so old code adding in error checking and i came across this statement
SQL = "SELECT RouteDef.RouteID, RouteDef.StepID, RouteDef.DeviceID, RouteDef.ReqPos INTO " + sTempTable + " FROM RouteDef WHERE (((RouteDef.RouteID)=" + IntToStr(iOldRouteNum) + "));";
The comment before the statement said something about creating a temporary table.
My question is will this SELECT statement work on a SQL Server 200 machine?
-----------------------
Ok now what?
-----------------------
Never mind i found my answer.
Thanks
|
|
|
|
|
I can update regular column with varchar/numeric type, but I when I try to update image data(longblob) in MySQL, but it doesn't work. Can anybody help me on how to do that?
Here is my code for this:
ProducerConn->Open();
ProducerSide->CommandText = "DROP TABLE IF EXISTS MyDB";
ProducerSide->ExecuteNonQuery();
ProducerSide->CommandText = "CREATE TABLE MyDB (ID timestamp(14), ext varchar(5), image longblob)";
ProducerSide->ExecuteNonQuery();
String * FILE = "image.jpg";
FileStream * tfs = new FileStream(FILE, FileMode::Open, FileAccess::Read);
Int16 len = (int)tfs->Length;
Byte buffer[] = new Byte[len];
tfs->Read(buffer, 0, buffer->Length);
// ProducerSide->CommandText = "update MyDB set image=buffer"; <---- line with problem
ProducerSide->CommandText = "UPDATE MyDB set ext='jpg'";
ProducerSide->ExecuteNonQuery();
Thanks!
|
|
|
|
|
Dear Sir ,
How can i restore DB created by SQL Server 2000 , on machine that has not SQL server licence..
is there any thing as MDAC that should be installed to make access possible from a program to specific DB created by MSAccess
thank you ..
|
|
|
|
|
If the database is smaller than 2GB you could use MSDE[^]
and restore it using the command line OSQL utility.
Anger is the most impotent of passions. It effects nothing it goes about, and hurts the one who is possessed by it more than the one against whom it is directed.
Carl Sandburg
|
|
|
|
|
u mean, u try to give access to any client to MS SQL Server. If so u have to install MS SQL Agent, (Desktop Client Version it is available in MS SQL SERVER CD)
if u dont, is what ,u wanna do, to restore a MS SQL Database to a new Server which doesnt have any licence MS SQL Server??? If so, u DONT.
|
|
|
|
|
I have a VC6 project that access' a visual fox pro database via the use of ADO. When I run the project in DEBUG mode everything works fine. When I run it in RELEASED mode on a development machine it also works fine. But when I try running it on a test machine it blows up.
There are multiple tables that I read in. I connect, create a Recordset, iterate through the DB (reading the field values as I go along), close the Recordset, close the connection, and then repeat the process for all other tables. Each table that gets imported has it's own method.
The results are weird as well. The first table will come in fine with no errors or exceptions.
Usually it will hang in the DisconnectADO() method that gets called at the end of the ImportSecondDB() method. But sometimes an exception is thrown that gets caught in the
catch(...). I'm not really sure what's going on here and have already lost close to a week's worth of development time on this. I have provided some code "snipets" bellow. Any help, comments, or suggestions will be most welcomed and greatly appreciated.
HRESULT ClassName::Run()
{
HRESULT hr = S_OK;
for (int i=0; i<2; ++i)
{
switch(i)
{
case 0:
hr = ImportFirstDB();
break;
case 1:
hr = ImportSecondDB();
break;
default:
ASSERT(FALSE);
hr = E_FAIL;
}
}
}
HRESULT ClassName::ImportFirstDB()
{
ado::_ConnectionPtr spConnection;
ado::_RecordsetPtr spRecSet;
CString ostr;
HRESULT hr = S_OK;
_variant_t ovField;
try
{
if (SUCCEEDED(hr = ConnectADO(spConnection, spRecSet)))
{
if (SUCCEEDED(hr = spRecSet->Open(L"SELECT * FROM daily", _variant_t((IDispatch*)spConnection, true), ado::adOpenStatic,ado::adLockReadOnly, ado::adOptionUnspecified)))
{
if (SUCCEEDED(hr = spRecSet->MoveFirst()))
{
while(SUCCEEDED(hr) && !spRecSet->GetadoEOF())
{
ovField = spRecSet->GetCollect("col name");
if (ovField.vt != VT_NULL)
{
ostr = (_bstr_t)ovField;
}
hr = spRecSet->MoveNext();
}
}
}
}
}
catch(_com_error& oE)
{
hr = ProcessError(&oE);
}
catch(...)
{
hr = ProcessConnectionError(spConnection);
}
DisconnectADO(spConnection, spRecSet);
return hr;
}
HRESULT ClassName::ImportSecondDB()
{
ado::_ConnectionPtr spConnection;
ado::_RecordsetPtr spRecSet;
CString ostr;
HRESULT hr = S_OK;
_variant_t ovField;
try
{
if (SUCCEEDED(hr = ConnectADO(spConnection, spRecSet)))
{
if (SUCCEEDED(hr = spRecSet->Open(L"SELECT * FROM daily", _variant_t((IDispatch*)spConnection, true), ado::adOpenStatic,ado::adLockReadOnly, ado::adOptionUnspecified)))
{
if (SUCCEEDED(hr = spRecSet->MoveFirst()))
{
while(SUCCEEDED(hr) && !spRecSet->GetadoEOF())
{
ovField = spRecSet->GetCollect("col name");
if (ovField.vt != VT_NULL)
{
ostr = (_bstr_t)ovField;
}
hr = spRecSet->MoveNext();
}
}
}
}
}
catch(_com_error& oE)
{
hr = ProcessError(&oE);
}
catch(...)
{
hr = ProcessConnectionError(spConnection);
}
DisconnectADO(spConnection, spRecSet);
return hr;
}
HRESULT ClassName::ConnectADO(ado::_ConnectionPtr& spConnection, ado::_RecordsetPtr& spRecSet)
{
CString ostrConnection;
HRESULT hr = S_OK;
try
{
if (SUCCEEDED(hr = spConnection.CreateInstance(__uuidof(ado::Connection))))
{
ostrConnection = _T("Provider=VFPOLEDB.1;");
ostrConnection += _T("Data Source=");
ostrConnection += ostrInputFile + _T(";");
if (SUCCEEDED(hr = spConnection->Open(_bstr_t(ostrConnection), L"", L"", ado::adModeUnknown)))
{
spRecSet.CreateInstance(__uuidof(ado::Recordset));
spRecSet->CursorLocation = ado::adUseClient;
}
else
{
_com_issue_error(hr);
}
}
catch(_com_error &oE)
{
hr = ProcessError(&oE, _T("AccountView_WINTask::ConnectADO() - InputFile: ") + ostrInputFile);
}
catch(...)
{
TRACE( "*** Unhandled Exception ***" );
hr = E_FAIL;
}
return hr;
}
HRESULT ClassName::DisconnectADO(ado::_ConnectionPtr& spConnection, ado::_RecordsetPtr& spRecSet)
{
ASSERT(spConnection);
ASSERT(spRecSet);
HRESULT hr = S_OK;
try
{
if (spRecSet)
{
if (spRecSet->State == ado::adStateOpen)
{
hr = spRecSet->Close();
}
}
if (spConnection)
{
if (spConnection->State == ado::adStateOpen)
{
hr = spConnection->Close();
}
}
spRecSet.Release();
spConnection.Release();
}
catch(_com_error& oE)
{
hr = ProcessError(&oE);
}
catch(...)
{
hr = ProcessConnectionError(spConnection);
}
return hr;
}
|
|
|
|
|
Are you sure you wont get an empty recordset for any of the tables?
calling MoveFirst() on an empty recordset should throw an exception...
as will calling MoveNext when you have reached the end of the recordset.
If I recall correctly, ADo returns the recodset positioned on the first record if there are any, so the movefirst should not be needed, and your while loop should chech that you have not reached EOF. If the recordset is empty, EOF will already be true, as will BOF.
Anger is the most impotent of passions. It effects nothing it goes about, and hurts the one who is possessed by it more than the one against whom it is directed.
Carl Sandburg
|
|
|
|
|
Hi There,
I've written an inline table-valued function in SQL such as the following:
ALTER FUNCTION dbo.GetCityByID( @CityID int)<br />
RETURNS TABLE<br />
AS<br />
RETURN(<br />
SELECT<br />
Name,<br />
Url<br />
FROM Cities<br />
WHERE (CityID = @CityID) )<br />
suppose that Cities table includes three fields (CityID, Name, Url).
By the way I wrote a store procedure as follow:
ALTER PROCEDURE MyProcedure ( @MyID int)<br />
AS<br />
SELECT<br />
CountryID,<br />
OriginCityID,<br />
DestCityID<br />
FROM<br />
MyTable<br />
WHERE (MyID = @MyID)<br />
The OriginCityID and DestCityID are related to CityID in Cities table. I wanna get the name
and url of each city by its ID through this stored procedue by making relation to Cities table.
so I call GetCityByID function in my stored procedure like this:
ALTER PROCEDURE MyProcedure ( @MyID int)<br />
AS<br />
SELECT<br />
CountryID,<br />
dbo.GetCityByID(OriginCityID),<br />
dbo.GetCityByID(DestCityID)<br />
FROM<br />
MyTable<br />
WHERE (MyID = @MyID)<br />
this procedure dosn't work an returns error.
What's your solution for getting information from Cities table for OriginCityID and DestCityID?
Thank you in advance.
|
|
|
|
|
Majid Shahabfar wrote:
I've written an inline table-valued function
That is your answer. If it return a table, you must treat it as a table.
Since it looks like this should only ever return one row, why not re-write the function to return a single value. If you need to Url value as well write a function for that.
However, it would be much more efficient to just join to the cities table in your stored procedure.
Do you want to know more?
WDevs.com - Open Source Code Hosting, Blogs, FTP, Mail and Forums
|
|
|
|
|
tnx for reply,
the OriginCityID and DestCityID are both related to CityID in Cities table.
so I cannot have inner join for both of them. as I know it's possible for just
one CityID (either Origin or DestCityID).
|
|
|
|
|
Majid Shahabfar wrote:
I cannot have inner join for both of them
Yes you can, you make two inner joins but assign them a different alias - then it is like having two tables with duplicate data. Here:
SELECT CountryID, OCity.Name AS OriginCity, DCity.Name AS DestCity
FROM MyTable
INNER JOIN Cities OCity ON OCity.CityID = OriginCityID
INNER JOIN Cities DCity ON DCity.CityID = DestCityID
WHERE (MyID = @MyID)
Does this help?
Do you want to know more?
WDevs.com - Open Source Code Hosting, Blogs, FTP, Mail and Forums
|
|
|
|
|
I have a db table column which is of type varchar, but the value stored is date.
eg: 1/23/2005
2/24/2004
3/23/2006 etc.
I want to format this column as follows:
2__1/23/2005
1__1/23/2004
3__2/23/2006
ie, the reformatted value is the sorting index for date. Ie if the column is selected with an order by, the result will be sorted according to the date even though the column type is varchar.
This twisted way is adopted since this column is refered by crystal reports and the report is sorted according to this column.
Any query to format like this.
|
|
|
|
|
Hi,
Try this............
SELECT *
FROM TableName
ORDER BY CONVERT(DATETIME,DateColumn)
Hope this will help u.................:->
Reagrds,
Ritesh
|
|
|
|
|
HI,
I Configured a SQL Server with Merge Replication after few days some tables got some conflicts one table got 10012 conflict Records. Any one there to help me to solve this how to resolve this records or how can I avoid this conflicts?
(That particular table has a Trigger it calculate daily balance)
|
|
|
|
|
When I select all fields in the table, the datetime does not display. Instead it returns a NULL. Why is that? This is the code I used to populate the database.
recordset->Open("SELECT * from mytable", connection.GetInterfacePtr(),
ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);
while(!recordset->ADOEOF)
{
_variant_t vtValue;
vtValue = recordset->Fields->GetItem(L"value")->GetValue();
sprintf(fieldValue,"%s",(LPCSTR)(vtValue.bstrVal));
recordset->MoveNext();
};
Thanks!
|
|
|
|
|
A datetime value does not return as a VT_BSTR but as a VT_DATE value. But you can change the type by using vtValue.ChangeType(VT_BSTR) before displaying the value.
Wout Louwers
|
|
|
|
|
|
I have a thread that, every 3 seconds checks a table to see if a record
exists. If it does it retreives it and then deletes the record. is
there a way to use trigger dates in my table to tell me when a record
exists so that i do not have to set a timer to check every three
seconds?
Is there a way to have a SQL table fire an event so that I know if
something has changed and to go check it?
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Tom Wright wrote:
Is there a way to have a SQL table fire an event
You mean like a "trigger"?
You could write a trigger that fires an event of some kind. You can set SQL server up to send emails if you want. Or you could use xp_cmdshell to execute an exe file which could perform the event you want. Be careful of these however as they are open to abuse if you don't think about the security aspect.
Do you want to know more?
WDevs.com - Open Source Code Hosting, Blogs, FTP, Mail and Forums
|
|
|
|
|
Use an insert/update trigger on the table.
CREATE TRIGGER TomsTrig
ON TomsTable
FOR INSERT, UPDATE
AS
-- Check if insert/update record matches record you are looking for
-- Do one or more of :
-- 1. Use matching record to insert/update another table
-- 2. Use an existing stored/extended procedure to send a message out (e.g. xp_sendmail, xp_logevent)
-- 3. Write your own stored/extended procedure to send a message out
-- Delete (maybe rollback ?) insert/update of matching record
GO
...cmk
Save the whales - collect the whole set
|
|
|
|
|
The probelm is my app will not reside on the same machine as the SQL server. I was wondering if, since I have a connection open to my SQL database, that it would be possible to send an event to my app telling me that something has changed.
Let me ask this. If at the beginning of my app I read in all the records from the table....connections. And someone uses another app to delete one of these records. How will i know that a record has been deleted. Will I have to do a refresh every so many seconds?
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Yes, that is the scenario i expected.
Before going farther let me state - i am not a DBA. I am a C++ developer who writes a lot of database code (ODBC and OLE DB), but does not know all the ins and outs of SQL Server.
I had the same issue a couple years ago.
I wanted my server application to be aware of any changes made to certain tables by other applications.
What i ended up doing is writing a couple extended procedures for SQL Server.
Given:
Machine S contains my server program.
Machine D contains SQL Server.
The extended procedures are all contained in x.dll which has been installed on D.
My server on S, using ODBC, connects to MSSQL on D after setting up a listening port on S.
It then executes (via ODBC statement) 'xp_cmkInitSvcMsg <@server> <@port> [@handle OUTPUT]'.
The output handle uniquely identifies the MSSQL connection to S.
The triggers on the tables then call 'xp_cmkBroadcastSvcMsg <@msg>' when modified.
This sends @msg to all connected servers (i.e. those that called xp_cmkInitSvcMsg).
Just before the server on S disconnects from MSSQL on D it executes 'xp_cmkTermSvcMsg <@handle>'.
This just closes the socket connection from MSSSQL to S and cleans up the state.
As long as the server is connected it gets messages from MSSQL on its listening port.
It also allows more than one program to get change messages from MSSQL at the same time.
It's a bit of a round about way of doing things, but i needed a solution and this was the best i came up with.
...cmk
Save the whales - collect the whole set
|
|
|
|
|
I thought it would be this difficult. I've never called a sp on SQL2000, can you shoe me a code snippet on how to do this. Also where can I find info on how to create a sp like the one you show...or any that return something back to the calling app. I'm going to assume that they are all the same.
Thanks
Tom Wright
tawright915@yahoo.com
|
|
|
|
|