|
|
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Народ, У меня вот такой вопрос: Есть курсор VFP - MyCursor который по структуре аналогичетс таблицей SQL Server 2000. Пытаюсь этот курсор залить в таблицу SQL через = SQLEXEC(gnConnHandle, "INSERT INTO Goods1 SELECT * FROM MyCursor") Понятно что эта конструкция не работает. Сделал по-другому cursorName = 'MyCursor' Create CURSOR (cursorName).... = SQLEXEC(gnConnHandle, "INSERT INTO Goods1 SELECT * FROM ?cursorName") Тоже не хочет... Как првильно такую идею воплотить в жизнь? Всем спасибо.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 11:35 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
*придется делать так select MyCursor scan = SQLEXEC(gnConnHandle, "INSERT INTO Goods1(field1,field2,...) values (?MyCursor.Field1, ?MyCursor.Field2,...)") endscan *или так: scan = SQLEXEC(gnConnHandle, "MyDB.dbo.MySPImport ?MyCursor.Field1, ?MyCursor.Field2,...") endscan ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 12:04 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
-*придется делать так select MyCursor scan = SQLEXEC(gnConnHandle, "INSERT INTO Goods1(field1,field2,...) values (?MyCursor.Field1, ?MyCursor.Field2,...)") endscan *или так: scan = SQLEXEC(gnConnHandle, "MyDB.dbo.MySPImport ?MyCursor.Field1, ?MyCursor.Field2,...") endscan А разве по-дргому никак нельзя? То что ты предложил - это понятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 12:07 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
-*придется делать так select MyCursor scan = SQLEXEC(gnConnHandle, "INSERT INTO Goods1(field1,field2,...) values (?MyCursor.Field1, ?MyCursor.Field2,...)") endscan *или так: scan = SQLEXEC(gnConnHandle, "MyDB.dbo.MySPImport ?MyCursor.Field1, ?MyCursor.Field2,...") endscan Вот ошибка, SQL Server хочет создать переменную какуюто... 1526 Connectivity error: [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the variable '@P1'. [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the variable '@P1'. 37000 137 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 12:12 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
авторА разве по-дргому никак нельзя? По-другому можно со стороны сервера, используя DTS или утиллиту bcp.exe авторТо что ты предложил - это понятно... А мне не понятно, что тебе понятно) Ты пытался локальный VFP-шный курсор "засунуть" в конструкцию T-SQL сервера... Как может знать сервер о твоем локальном курсоре?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 12:15 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Приведи свой код полностью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 12:18 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
-Приведи свой код полностью myCursor = SYS(2015) SELECT key, parent, text FROM tmp_goods INTO CURSOR (myCursor) gnConnHandle = SQLSTRINGCONNECT("Driver=SQL Server;SERVER=10.36.0.9;DBMSSOCN=TCP/IP;DATABASE=Test") IF gnConnHandle <= 0 = MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error') RETURN ELSE = MESSAGEBOX('Connection made', 48, 'SQL Connect Message') ENDIF c = SQLEXEC(gnConnHandle, "INSERT INTO Goods1 SELECT * FROM ?myCursor ") IF C<0 = AERROR(aErrorArray) strerror = STR(aErrorArray(1))+aErrorArray(2)+aErrorArray(3)+aErrorArray(4)+STR(aErrorArray(5))+STR(aErrorArray(6)) Wait window strerror ENDIF = SQLCOMMIT(gnConnHandle) = SQLEXEC(gnConnHandle, "SELECT * FROM goods1", "ResultCursor") = SQLDISCONNECT(gnConnHandle) * смотрим... SELECT ResultCursor BROW ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 13:08 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Создай на сервере пользователя "MyLogin" с SQL Server Authentication, паролем "figvam" и необходимыми правами Далее: cStringConnect = 'DRIVER=SQL Server;SERVER=10.36.0.9;UID=MyLogin;PWD=figvam' *если используется Windows Authentication, то cStringConnect = 'DRIVER=SQL Server;SERVER=10.36.0.9' gnConnHandle = SQLSTRINGCONNECT(cStringConnect) IF gnConnHandle <= 0 = MESSAGEBOX('Cannot make connection', 16, 'SQL Connect Error') RETURN ELSE = MESSAGEBOX('Connection made', 48, 'SQL Connect Message') ENDIF myCursor = SYS(2015) *SELECT key, parent, text FROM tmp_goods INTO CURSOR (myCursor) *!!key, parent, text эти названия полей лучше сменить или придется использовать [] скобки select tmp_goods Предполагается, что на сервере существует таблица Goods1 в базе Test с соответствующей структурой scan = SQLEXEC(gnConnHandle, 'INSERT INTO Goods1([key],[parent],[text]) values (?tmp_goods.key, ?tmp_goods.parent, ?tmp_goods.text ') endscan = SQLEXEC(gnConnHandle, 'select * from test.dbo.Goods1 ', 'MyCursor') *смотрим результат browse = SQLDISCONNECT(gnConnHandle) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 14:29 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
...поторопился, так правильно ... scan = SQLEXEC(gnConnHandle,'use test') = SQLEXEC(gnConnHandle, 'INSERT INTO Goods1([key],[parent],[text]) values (?tmp_goods.key, ?tmp_goods.parent, ?tmp_goods.text ') endscan ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 14:41 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
...до чего доводят бессонные ночи... Так еще правильнее:) ... = SQLEXEC(gnConnHandle,'use test') scan = SQLEXEC(gnConnHandle, 'INSERT INTO Goods1([key],[parent],[text]) values (?tmp_goods.key, ?tmp_goods.parent, ?tmp_goods.text ') endscan ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 14:43 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
-...до чего доводят бессонные ночи... Так еще правильнее:) ... = SQLEXEC(gnConnHandle,'use test') scan = SQLEXEC(gnConnHandle, 'INSERT INTO Goods1([key],[parent],[text]) values (?tmp_goods.key, ?tmp_goods.parent, ?tmp_goods.text ') endscan ... Конечно огромноеспасибо, эту технику я и предполагал, но неужели нет возможности впихнуть целый курсор в таблицу... Есть ведь оператор INSERT INTO... FROM SELECT * FROM [талица SQL Server]WHERE....??????..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 15:42 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
ValeriiКонечно огромноеспасибо, эту технику я и предполагал, но неужели нет возможности впихнуть целый курсор в таблицу... Есть ведь оператор INSERT INTO... FROM SELECT * FROM [талица SQL Server]WHERE....??????..... Оператор есть (но без первого FROM, если быть точным), но он оперирует объектами сервера!!! А вы хотите объект клиента (курсор) "запихнуть" в объект сервера ! Ни один клиент не может такого делать с SQL Server! Можно конечно написать свою оболочку, которая будет "парсить" вашу команду типа "INSERT INTO ... SELECT FROM ... но... в конечном итого все сведется к записи в цикле во временную таблицу сервера и затем INSERT INTO ... SELECT ...FROM #temp_table С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 15:53 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Aleksey-K ValeriiКонечно огромноеспасибо, эту технику я и предполагал, но неужели нет возможности впихнуть целый курсор в таблицу... Есть ведь оператор INSERT INTO... FROM SELECT * FROM [талица SQL Server]WHERE....??????..... Оператор есть (но без первого FROM, если быть точным), но он оперирует объектами сервера!!! А вы хотите объект клиента (курсор) "запихнуть" в объект сервера ! Ни один клиент не может такого делать с SQL Server! Можно конечно написать свою оболочку, которая будет "парсить" вашу команду типа "INSERT INTO ... SELECT FROM ... но... в конечном итого все сведется к записи в цикле во временную таблицу сервера и затем INSERT INTO ... SELECT ...FROM #temp_table С уважением, Алексей. Спасибо Алексей за совет... В голове много фоксовых стереотипов, которыми очень часто оперировал и которые, честно говоря, очень удобны, которых нет в технологии по SQL Server-a... Я могу нвпряму обращаться если возникнут вопросы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2006, 16:14 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Конечно обращайтесь и ко мне и ко всему сообществу форума. Он для этого и существует. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2006, 08:36 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Возник похожий вопрос, правда, у меня не MSSQL, а Oracle, но суть таже. Необходимо в таблицу на сервере записать данные из курсора. В общем я ее решил, создав CursorAdapter привязанный через ODBC к удаленному источнику данных - моей таблице. Данные закинул в курсор CursorAdapter'а с помощью простейшего Код: plaintext 1. Но возник другой вопрос, у меня на форме есть грид, у которого RecordSource является тот самый курсор orarbb моего CursorAdapter'а. Я пытаюсь перезапросить данные с сервера. Вот код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 10:28 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
dmitryxВозник похожий вопрос, правда, у меня не MSSQL, а Oracle, но суть таже. Необходимо в таблицу на сервере записать данные из курсора. В общем я ее решил, создав CursorAdapter привязанный через ODBC к удаленному источнику данных - моей таблице. Данные закинул в курсор CursorAdapter'а с помощью простейшего Код: plaintext 1. Но возник другой вопрос, у меня на форме есть грид, у которого RecordSource является тот самый курсор orarbb моего CursorAdapter'а. Я пытаюсь перезапросить данные с сервера. Вот код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. я бы написал хранимую процедуру на сервере Оракла - и через нее вносил данные. ИМХО конечно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2006, 12:16 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Hi dmitryx! Не видно кода который "открывает" курсор (т.е. вызывает CursorFill()) и кроме того не понятно почему это SelectCmd присваивается только перед CursorRefresh() - он должен быть присвоен гораздо раньше - ещё на момент открытия курсора. Также непонятна твой уверенность в том что CursorRefresh() отрабатывает - он вообще-то не должен отрабатывать, если в курсоре есть несохранённые (но изменённые) данные. Твой же код с INSERT ... SELECT ... как раз и напихивает в курсор массу записей, которые будут считаться "новыми" - и которые по хорошему нужно либо сохранить, либо отменить перед попыткой перезапроса. P.S. А вообще не ясна сама идея - зачем нужно было в курсор запихивать какие-то локальные данные, если потом нужно туда-же забирать данные с сервера. Конечно CAD можно обмануть - чтоб он считал эти самые локальные данные "как будто" полученными с сервера - но для начала лучше уточнить саму цель подобных манипуляций. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2006, 02:32 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Hi Igor Korolyov! Возможно, я немного непонятно описал ситуацию. Код с инсертом и перезапросом это грубо говоря разные программки, и про инсерт я написал человеку, который хотел закинуть данные из фокса на сервер. Теперь про SelecetCmd и т.п. Я присваиваю ему новое значение в тот момент, когда у меня уже открыта форма (в data environmet'е которой есть cursoradapter связанный с таблицей оракла). При запуске формы у меня из этого курсора наполняется грид формы, при этом данные не меняются вообще. Затем, грубо говоря, мне необходимо перезапросить данные с оракла новым запросом и я формирую новый SelectCmd и делаю CursorRefresh (который, как написано в хелпе, в случае успеха возвращает true, у меня возвращает, но данные ни в курсорадаптере, ни в, соответственно, гриде не обновляются). Скорее всего я чего-то недопонимаю, но из хелпа ничего пока выудить по моему вопросу не удалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 10:09 |
|
||
|
VFP+MSSQL
|
|||
|---|---|---|---|
|
#18+
Hi dmitryx! > Возможно, я немного непонятно описал ситуацию Есть такое. > Теперь про SelecetCmd и т.п. CursorRefresh() повторно исполняет ту самую команду, которая была прописана в свойстве SelectCmd (и возможно изменена в обработчике события BeforeCursorFill) на момент выполнения метода CursorFill() - никакие изменения этого свойства ПОСЛЕ исполнения CursorFill() уже не помогут. Равно как и попытка изменить параметр в методе BeforeCursorRefresh() - читай внимательно хелп по темам CursorRefresh, BeforeCursorRefresh, BeforeCursorFill. Короче единственный способ получить "динамику" в запросе - это отказаться от CursorRefresh() в пользу CursorFill() - конечно "сохраняя" грид - т.к. CursorFill полностью пересоздаёт курсор. Единственно чем можно рулить при CursorRefresh() - это значения параметров (если конечно в запросе они имеются). P.S. Старый добрый метод REQUERY() для представлений работает точно так-же. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2006, 02:21 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=274&tid=1592338]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
3ms |
| others: | 204ms |
| total: | 376ms |

| 0 / 0 |
