getString не работает из Oracle

vadipok
Дата: 27.07.2015 13:09:17
Добрый день!

getInt() работает, а getString() выдает ошибку:
Необработанное исключение в "0x5cd4ad7a (msvcp100d.dll)" в "sinhroniseThreads.exe": 0xC0000005: Нарушение прав доступа при чтении "0xccccccd0".

Вот такая вот проблема, хз что делать.

До этого такая проблема возникала при извлечении IP адресов из базы, но я его вот так вот элегантно решил:
+
	string s = "SELECT e.ID_EMPLOYEE, ";
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\1'), ";
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\2'), ";
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\3'), ";
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\4'), ";
	s = s + ' ' + "e.IP_ADDRESS ";
	s = s + ' ' + "FROM EMPLOYEE e ";
	s = s + ' ' + "WHERE EXISTS(SELECT 1 FROM SCAN_EMPLOYEE se WHERE se.ID_EMPLOYEE_FK = e.ID_EMPLOYEE) ";
	//s = s + ' ' + "AND ROWNUM < 200 ";
	s = s + ' ' + "AND e.IP_ADDRESS in ('10.2.3.30') ";
	const char* sql = s.c_str();
	Statement* stmt = conn->createStatement(sql);

	int t1 = 0, t2 = 0, t3 = 0, t4 = 0;
	string babac = "";
	string t;
	stringstream ss;
	ResultSet *rs;
	rs = stmt->executeQuery();
	while (rs->next()!= NULL)
	{
		t1  = rs->getInt (2);
		t2  = rs->getInt (3);
		t3  = rs->getInt (4);
		t4  = 170;
		ss << t1 << "." << t2 << "." << t3 << "." << t4;
		t = ss.str();
		babac = rs->getString(5);
	.....
	}


Теперь так не получиться, необходимо вытаскивать сетевые папки и названия файлов.

Ошибка возникает в строке babac = rs->getString(5);
Leonid Kudryavtsev
Дата: 27.07.2015 15:30:02
ЛьюисКэррол
-- Откусишь с одной стороны -- подрастешь, с другой -- уменьшишься!
-- С одной стороны чего? -- подумала Алиса. -- С другой стороны чего?


Автор
getInt() работает, а getString() выдает ошибку:

getInt() чего ? и getString() чего ?

Автор
я его вот так вот элегантно решил


Элегантный
(франц. elegant) - изящный, изысканный; изящно, со вкусом одетый, держащийся с изяществом.

Мисье знает толк в извращениях ( C )
vadipok
Дата: 27.07.2015 16:02:55
Leonid Kudryavtsev
ЛьюисКэррол
-- Откусишь с одной стороны -- подрастешь, с другой -- уменьшишься!
-- С одной стороны чего? -- подумала Алиса. -- С другой стороны чего?


Автор
getInt() работает, а getString() выдает ошибку:

getInt() чего ? и getString() чего ?


Посмотрите внимательно.
В коде же все прописано, как склеиваются IP адреса и как я пытаюсь его вытащить сразу:
		t1  = rs->getInt (2);
		t2  = rs->getInt (3);
		t3  = rs->getInt (4);
		t4  = 170;
		ss << t1 << "." << t2 << "." << t3 << "." << t4;
		t = ss.str();
		babac = rs->getString(5);



Leonid Kudryavtsev
Автор
я его вот так вот элегантно решил


Элегантный
(франц. elegant) - изящный, изысканный; изящно, со вкусом одетый, держащийся с изяществом.

Мисье знает толк в извращениях ( C )


Уважаемый, это был сарказм над самим собой, ибо так проблемы не решаются:
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\1'), ";
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\2'), ";
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\3'), ";
	s = s + ' ' + "REGEXP_REPLACE(e.IP_ADDRESS, '(.*)\\.(.*)\\.(.*)\\.(.*)', '\\4'), ";
Leonid Kudryavtsev
Дата: 27.07.2015 16:09:29
Какой библиотеки?

Названия ф-ций / методов getInt, getString ничего не говорят. Так же как и названия класса Statement. Библиотек с такими методами и классами - как грязи.
vadipok
Дата: 27.07.2015 16:15:38
Leonid Kudryavtsev
Какой библиотеки?

Названия ф-ций / методов getInt, getString ничего не говорят. Так же как и названия класса Statement. Библиотек с такими методами и классами - как грязи.


тынц
Leonid Kudryavtsev
Дата: 27.07.2015 17:04:59
Я бы первым делом полез проверять параметры линковки в проекте.

Если есть работающий example сравнить параметры линковки в нем и в Вашем проекте.

IMHO & AFAIK
Leonid Kudryavtsev
Дата: 27.07.2015 17:17:16
Именно такой ошибки на metalink нет, зато есть пара нот по совместимости версии компилятора (Вами НЕ указана) и версии OCCI (Вами тоже НЕ указана).

Т.ч. очередной уточняющий вопрос:
1. Какой компилятор (подозреваю MS VS) и какая версия компилятора
2. Какая версия OCCI

Я бы проверил, что в debug ветки проекте используется debug версия OCCI библиотеки. В release ветки release версия OCCI библиотеки.

Возможно еще поиграться со static linked RTL и dinamic linked RTL. В своей версии MS VS (русская 2012) почему-то данных параметров найти не могу. Хотя, теоретически, быть должны )))
vadipok
Дата: 09.09.2015 17:04:34
В общем не смог я победить эту проблему, сделал через XML в ОС.
Дебильное решение, а что поделаешь.

FUNCTION MONITOR.MORED_XML(NUM IN NUMBER)
RETURN NUMBER
IS
  file_id UTL_FILE.FILE_TYPE;
BEGIN
  file_id := utl_file.FOPEN ('MOREDDIR','Mored.xml','w');
  utl_file.PUT_LINE( file_id, '<?xml version="1.0" encoding="utf-8" ?>' );
  utl_file.PUT_LINE( file_id, '<Start>' );
  FOR emp IN (SELECT m.ID_MORED,
                     e.IP_ADDRESS,
                     m.MODEL_MORED
                FROM EMPLOYEE e 
                     INNER JOIN MORED m ON m.ID_EMPLOYEE_FK = e.ID_EMPLOYEE 
               WHERE m.STATUS = 1 
                     AND m.MODEL_MORED IS NOT NULL 
              ORDER BY e.ID_EMPLOYEE )
  LOOP
    utl_file.PUT_LINE( file_id, '<Row>' );
    utl_file.PUT_LINE( file_id, '<ID_MORED>' || emp.ID_MORED || '</ID_MORED>' );
    utl_file.PUT_LINE( file_id, '<IP_ADDRESS>' ||emp.IP_ADDRESS || '</IP_ADDRESS>' );
    utl_file.PUT_LINE( file_id, '<MODEL_MORED>' ||emp.MODEL_MORED || '</MODEL_MORED>' );
    utl_file.PUT_LINE( file_id, '</Row>' );
  END LOOP;
  utl_file.PUT_LINE( file_id, '</Start>' );
  utl_file.fCLOSE(file_id);
  RETURN 1;
END MORED_XML;


	//извлекаем пути к Моред файлам
	string mor = "select MONITOR.MORED_XML(1) from dual";
	const char* sql1 = mor.c_str();
	Statement* stmt1 = conn->createStatement(mor);
	ResultSet *rs;
	ResultSet *rsb;
	rs  = stmt->executeQuery();
	rsb = stmt1->executeQuery();

	XmlTextReader ^ reader = gcnew XmlTextReader ("C:\\Mored\\Mored.xml");
	char* nameXMLRow = "";

    while (reader->Read()) 
    {
		MORED_PATH mored_path;
        switch (reader->NodeType) 
        {
			case XmlNodeType::Element: // The node is an element.
				if (reader->Name == "ID_MORED") {
					nameXMLRow = "ID_MORED";
				} else if (reader->Name == "IP_ADDRESS") {
					nameXMLRow = "IP_ADDRESS";
				} else if (reader->Name == "MODEL_MORED") {
					nameXMLRow = "MODEL_MORED";
				}
                break;
			case XmlNodeType::Text: //Display the text in each element.
				if (strcmp(nameXMLRow, "ID_MORED") == 0) {
					mored_path.id_mored = (char*)(void*)Marshal::StringToHGlobalAnsi(reader->Value);
				} else if (strcmp(nameXMLRow, "IP_ADDRESS") == 0) {
					mored_path.ip_mored = (char*)(void*)Marshal::StringToHGlobalAnsi(reader->Value);
				} else if (strcmp(nameXMLRow, "MODEL_MORED") == 0) {
					mored_path.model_mored = (char*)(void*)Marshal::StringToHGlobalAnsi(reader->Value);
					mored_path_list.push(mored_path);
				}
                break;
			case XmlNodeType::EndElement: //Display the end of the element.
                break;
        }
    }
mayton
Дата: 10.09.2015 16:43:58
Как-то.. многобукв.

if (reader->Name == "ID_MORED") {
					nameXMLRow = "ID_MORED";
				} else if (reader->Name == "IP_ADDRESS") {
					nameXMLRow = "IP_ADDRESS";
				} else if (reader->Name == "MODEL_MORED") {
					nameXMLRow = "MODEL_MORED";
				}


Можно так написать?
if (reader->Name in(".....","...)){
   nameXMLRow = reader->Name; 
}


Или так если нет исключений.
nameXMLRow = reader->Name;